2016-03-07 1 views
1

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

f=600; 
Fs=6000; 
t=0:1/Fs:0.3; 
n=0:1:length(t); 
x=cos(2*pi*(400/Fs)*n)+2*sin(2*pi*(1100/Fs)*n); 
y=fft(x,512); 

freqaxis=Fs*(linspace(-0.5,0.5, length(y))); 
subplot(211) 
plot(freqaxis,fftshift(abs(y))); 

Я понимаю, почему мы использовали fftshift, потому что мы хотели бы видеть сигнал центрированный на значении 0 Гц (DC), и это лучше для наблюдения.

enter image description here

Однако я, кажется, запутался о том, как определяется оси частот. В частности, почему мы особенно умножали диапазон [-0,5 0,5] на Fs и получаем диапазон [-3000 3000]? Это может быть [-0.25 0.25].

ответ

3

Причина, по которой диапазон находится между [-Fs/2,Fs/2], объясняется тем, что Fs/2 является Nyquist frequency. Это самая большая возможная частота, которая обладает способностью визуализироваться и что в конечном итоге присутствует в вашей частотной разложения. Я также не согласен с вашим комментарием, где диапазон «может быть между [-0.25,0.25]». Это противоречит определению частоты Найквиста.

Из теории обработки сигналов мы знаем, что мы должны пробовать по меньшей мере в два раза ширину полосы сигнала для правильной реконструкции сигнала. Полоса пропускания определяется как максимально возможная частотная составляющая, которая может быть замечена в вашем сигнале, которая также называется Частота Найквиста. Другими словами:

Fs = 2*BW 

Верхний предел, где мы можем визуализировать спектр и в конечном счете частоту полосы пропускания/Найквиста определяется как:

BW = Fs/2; 

Поэтому, потому что ваша частота дискретизации равна 6000 Гц, это означает частота Найквиста составляет 3000 Гц, поэтому диапазон визуализации составляет [-3000,3000] Гц, что является правильным в графе магнитов.


BTW, ваши центры бункеров для каждой из частот неверны. Вы указали, что общее количество ячеек в FFT равно 512, но способ, которым вы указываете ячейки, относится к общей длине сигнала. Я удивлен, почему вы не получаете синтаксическую ошибку, потому что вывод функции fft должен дать вам 512 точек, но ваша переменная оси частоты будет массивом, который больше 512. В любом случае это неверно. Частота в каждом бен i должна быть:

f = i * Fs/N, for i = 0, 1, 2, ..., N-1 

N является общим количеством очков, которое вы имеете в вашем FFT, который 512. Вы первоначально имели как length(y) и это не правильно ... так возможно, именно поэтому у вас есть источник путаницы при рассмотрении оси частот. Вы можете прочитать, почему это так, ссылаясь на замечательный пост пользователя Paul R: How do I obtain the frequencies of each value in an FFT?

Обратите внимание, что мы указываем только ячейки от 0 до N - 1.С учетом этого при указании бин центров каждой частоты, обычно указать дополнительной точки в вашей команде linspace и удалить последнюю точку:

freqaxis=Fs*(linspace(-0.5,0.5, 513); %// Change 
freqaxis(end) = []; %// Change 

Кстати, как вы объявили freqaxis является бит, запутанный для меня. Это для меня является более удобным для чтения:

freqaxis = linspace(-Fs/2, Fs/2, 513); 
freqaxis(end) = []; 

Я лично ненавижу, используя length и я предпочитаю более numel.


В любом случае, когда я запускаю исправленный код, чтобы указать центры bin, теперь я получаю этот график. Обратите внимание на то, что я вставил несколько курсоров данных, где пики спектра, которые соответствуют частотам для каждого из косинусов, что вы объявили (400 Гц и 1100 Гц):

enter image description here

Вы видите, что есть некоторые незначительные неточности, в первую очередь из-за количества ящиков, которые вы указали (т.е. 512). Если вы увеличили общее количество ящиков, вы увидите, что частоты на каждом из пиков будут более точными.