Понимание примера Matlab FFT

38

Я новичок в Matlab и FFT и хочу понять пример Matlab FFT. На данный момент у меня есть два основных вопроса:

1) Почему ось x (частота) заканчивается на 500? Как я узнаю, что нет больше частот или они просто игнорируются?

2) Как узнать, что частоты между 0 и 500? Разве FFT не скажет мне, в каких пределах частоты? Возвращает ли FFT значение амплитуды без частоты?

Спасибо за любой намек!


Пример, о котором идет речь:

Рассмотрим данные, отобранные с частотой 1000 Гц. Формируйте сигнал, содержащий синусоиду 50 Гц с амплитудой 0,7 и 120 Гц синусоиды с амплитудой 1 и испортить ее некоторым нулевым средним случайным шумом:

Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sample time
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector
% Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); 
y = x + 2*randn(size(t));     % Sinusoids plus noise
plot(Fs*t(1:50),y(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)')

Изображение 541

Переходя в частотную область, дискретное преобразование Фурье из шумового сигнала y определяется быстрым преобразованием Фурье (FFT):

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);

% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1))) 
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

Изображение 542

  • 2
    С дискретным преобразованием Фурье вы не увидите ничего выше половины частоты дискретизации. Как правило, частота дискретизации должна быть примерно в 10 раз выше, чем интересующая вас частота.
  • 7
    @DmitriChubarov: 10х кажется чрезмерным; с чего взял?
Показать ещё 1 комментарий
Теги:
fft

4 ответа

32
Лучший ответ

1) Почему ось x (частота) заканчивается на 500? Как я узнаю, что нет больше частот или они просто игнорируются?

Он заканчивается на частоте 500 Гц, потому что это частота Найквиста сигнала при выборке на частоте 1000 Гц. Посмотрите на эту строку в примере Mathworks:

f = Fs/2*linspace(0,1,NFFT/2+1);

Частотная ось второго графика идет от 0 до Fs/2 или половины частоты дискретизации. Частота Найквиста всегда равна половине частоты дискретизации, так как выше aliasing: Изображение 6338

Сигнал будет "складываться" назад сам по себе и, по-видимому, будет иметь некоторую частоту на уровне или ниже 500 Гц.

2) Как узнать, что частоты между 0 и 500? Разве FFT не скажет мне, в каких пределах частоты?

Из-за "складывания", описанного выше (частота Найквиста также широко известна как "частота сгибания" ), физически невозможно, чтобы частоты выше 500 Гц появлялись в БПФ; более высокие частоты будут "складываться" назад и появляться как более низкие частоты.

Только FFT возвращает значение амплитуды без частоты?

Да, функция FFT MATLAB возвращает только один вектор амплитуд. Однако они сопоставляются с частотными точками, которые вы передаете ему.

Позвольте мне знать, что необходимо для уточнения, чтобы я мог помочь вам.

  • 0
    Это не совсем так. Смотрите, например, en.wikipedia.org/wiki/Undersampling .
  • 0
    Нет, это относится к полосе пропускания аналоговой схемы, а не к требуемой частоте дискретизации. Оптимизация - это не обходной путь для фильтров сглаживания, я думаю, вы думаете о передискретизации ...
Показать ещё 1 комментарий
8

Здесь есть некоторые заблуждения.

Частоты выше 500 могут быть представлены в результате БПФ длиной 1000. К сожалению, эти частоты складываются вместе и смешиваются в первые 500 БПФ-бит. Таким образом, вы обычно не хотите подавать FFT сигнал, содержащий любые частоты в пределах или выше половины частоты дискретизации, так как FFT не волнует и будет просто смешивать высокие частоты вместе с низкими (aliasing), что делает результат довольно много бесполезно. Именно поэтому данные должны быть фильтрованы с низким проходом перед их выборкой и передаваться в БПФ.

FFT возвращает амплитуды без частот, потому что зависит от частоты, а не только от длины БПФ, но и от частоты дискретизации данных, которая не является частью самого БПФ или вводится. Вы можете подавать данные FFT с одинаковой длиной с любой частотой дискретизации, так как таким образом получается любой диапазон частот.

Причина, по которой конечные результаты заканчиваются на уровне 500, заключается в том, что для любого реального ввода данных частоты, превышающие половину длины БПФ, являются просто зеркальными повторами (комплексно сопряженными) данных в первой половине. Поскольку они дубликаты, большинство людей просто игнорируют их. Зачем делать дубликаты? FFT вычисляет вторую половину результата для людей, которые подают комплексные данные FFT (как с реальными, так и с мнимыми компонентами), что создает две разные половины.

  • 0
    Спасибо за подсказку о частотах выше 500 в результате FFT длины 1000. У меня есть статья с частотой дискретизации 5000 Гц, длиной 2048 выборок для FFT и анализом от 300 до 2000 Гц. Не могли бы вы объяснить, как я анализирую диапазон 2000 Гц с эффективным вектором результата БПФ длиной 1024 (2048/2 из-за зеркального отображения = вектор эффективного результата)?
  • 0
    Я добавил свой вопрос во всех деталях, включая ссылку на статью здесь: dsp.stackexchange.com/questions/2648/… Было бы здорово, если бы вы могли посмотреть на это :-)
1

Похоже, вам нужно какое-то фоновое чтение того, что такое БПФ (например, http://en.wikipedia.org/wiki/FFT). Но чтобы ответить на ваши вопросы:

Почему ось x (частота) заканчивается на 500?

Поскольку входной вектор имеет длину 1000. В общем случае БПФ входного сигнала длины N приведет к выходу вектора длины N. Если входной сигнал является реальным, то выход будет симметричным, поэтому первые 501 точки будут достаточными.

Изменить: (я не заметил, что пример дополнял вектор временной области.)

Частота идет до 500 Гц, поскольку заявленная частота волны во временной области имеет частоту дискретизации 1 кГц. Теорема выборки Найквиста диктует, что сигнал с частотой дискретизации fs может поддерживать (реальный) сигнал с максимальной шириной полосы fs/2.

Как узнать, что частоты между 0 и 500?

См. выше.

Разве FFT не скажет мне, в каких пределах частоты?

Нет.

Только FFT возвращает значение амплитуды без частоты?

FFT просто назначает амплитуду (и фазу) для каждого частотного бункера.

  • 0
    Входной вектор для БПФ НЕ имеет длину 1000! Это 2^nextpow2(L) или 1046! БПФ является наиболее эффективным, когда он имеет степень 2 числа выборок. Кроме того, 0-500 в герцах, а не в образцах! Мой ответ правильно утверждает, почему график идет от 0 Гц до 500 Гц.
  • 0
    @ kevlar1818: 2^nextpow2(L) - 1024, а не 1046.
Показать ещё 3 комментария
-2

Причина, по которой ваши графики по оси X только до 500 Гц - это ваш командный оператор 'f = Fs/2 * linspace (0,1, NFFT/2 + 1);'. Ваши Fs равны 1000. Поэтому, когда вы делите его на 2, а затем умножьте на значения в диапазоне от 0 до 1, он возвращает вектор длины NFFT/2 + 1. Этот вектор состоит из равнораспределенных значений частоты, от 0 до Fs/2 (т.е. 500 Гц). Поскольку вы строите с использованием команды plot (f, 2 * abs (Y: 1: NFFT/2 + 1)), ваш предел по оси Х равен 500 Гц.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню