2016-03-01 3 views
2

Я пытаюсь понять, как работает FFT в Matlab, в частности, как определить диапазон частот для его построения. Бывает, что я прочитал ссылки на ссылки на Matlab и другие обсуждения здесь, и я думаю (думаю), что я в замешательстве. В ссылке MatLab: http://es.mathworks.com/help/matlab/math/fast-fourier-transform-fft.html они определяют такой диапазон частот, как:Matlab, различия в частотном диапазоне FFT или они одинаковы?

f = (0:n-1)*(fs/n) 

с n и fs как:

n = 2^nextpow2(L); % Next power of 2 from length of signal x 
fs = N/T; % N number of samples in x and T the total time of the recorded signal 

Но, с другой стороны, в предыдущем посте Understanding Matlab FFT example (на основе предыдущей версии Matlab), результирующий диапазон частот определяется как:

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

с NFFT как указано выше n (следующая мощность 2 от длины сигнала x). Итак, исходя из этого, как эти разные векторы (уравнение 1 и окончательное уравнение) могут быть одинаковыми? Если вы видите, то векторы разные, так как у первых есть n очков, а позже есть NFFT/2 баллов! Фактически, фактор (fs/n) отличается от fs/2.

ответ

1

Путаница, возможно, связана с тем фактом, что два примера, на которые вы ссылались, рисуют результаты fft по-разному. Пожалуйста, обратитесь к приведенному ниже коду для ссылок, приведенных в этом объяснении.

В первом примере график представляет собой спектр мощности (периодограмма) в диапазоне частот. Обратите внимание, что на первом графике, что периодограмма не центрирована на 0, а это означает, что диапазон частот в два раза больше, чем частота дискретизации Найквиста. Как упоминалось в ссылке mathworks, общепринятой практикой является центрирование периодограммы на 0, чтобы избежать этой путаницы (рисунок 2).

Для второго примера, взяв те же параметры, исходный график имеет амплитуду спектра Фурье с другой нормализацией, чем в первом примере (рисунок 3). Используя синтаксис полного частотного упорядочения Matlab (как прокомментировано в коде), тривиально преобразовать этот, казалось бы, другой результат fft в пример 1; идентичный результат 0-центрированной периодограммы реплицируется на рисунке 4.

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

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

Ключ к пониманию того, как DFFT работы (также в Matlab) заключается в том, чтобы понять, что вы просто выполняете проекцию своего дискретного набора данных в пространство Фурье, где то, что возвращается функцией fft() в matlab, является коэффициентом разложения для каждой частотной составляющей и порядком (в Matlab, как в примере 2):

f = [f(1:end-1) -fliplr(f(1,2:end))]; 

Смотрите страницу Википедии о ДПФ для получения дополнительной информации: https://en.wikipedia.org/wiki/Discrete_Fourier_transform

Это также может быть полезно для вас, чтобы принять FFT опуская длину, мощностью 2 параметра, как

y = fft(x). 

В этом случай, вы увидите только несколько ненулевых компонентов в y, соответствующих точным коэффициентам вашего входного сигнала. На странице mathworks утверждается, что в качестве мотивации использовать или не использовать эту длину:

«Использование мощности двух для длины преобразования оптимизирует алгоритм БПФ, хотя на практике обычно мало различий во времени выполнения от использования n = m. "

%% First example: 
% http://www.mathworks.com/help/matlab/math/fast-fourier-transform-fft.html 

fs = 10;        % Sample frequency (Hz) 
t = 0:1/fs:10-1/fs;      % 10 sec sample 
x = (1.3)*sin(2*pi*15*t) ...    % 15 Hz component 
    + (1.7)*sin(2*pi*40*(t-2));   % 40 Hz component 
% Removed the noise 

m = length(x);   % Window length 
n = pow2(nextpow2(m)); % Transform length 
y = fft(x,n);   % DFT 
f = (0:n-1)*(fs/n);  % Frequency range 
power = y.*conj(y)/n; % Power of the DFT 

subplot(2,2,1) 
plot(f,power,'-o') 
xlabel('Frequency (Hz)') 
ylabel('Power') 
title('{\bf Periodogram}') 

y0 = fftshift(y);   % Rearrange y values 
f0 = (-n/2:n/2-1)*(fs/n); % 0-centered frequency range 
power0 = y0.*conj(y0)/n; % 0-centered power 

subplot(2,2,2) 
plot(f0,power0,'-o') 
% plot(f0,sqrt_power0,'-o') 
xlabel('Frequency (Hz)') 
ylabel('Power') 
title('{\bf 0-Centered Periodogram} Ex. 1') 

%% Second example: 
% http://stackoverflow.com/questions/10758315/understanding-matlab-fft-example 

% Let's redefine the parameters for consistency between the two examples 

Fs = fs;      % Sampling frequency 
% T = 1/Fs;     % Sample time (not required) 
L = m;      % Length of signal 
% t = (0:L-1)*T;    % Time vector (as above) 
% % Sum of a 3 Hz sinusoid and a 2 Hz sinusoid 
% x = 0.7*sin(2*pi*3*t) + sin(2*pi*2*t); %(as above) 

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

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


% Get the 0-Centered Periodogram using the parameters of the second example 
f = [f(1:end-1) -fliplr(f(1,2:end))]; % This is the frequency ordering used 
             % by the full fft in Matlab 

power = (Y*L).*conj(Y*L)/NFFT; 

% Rearrange for nicer plot 
ToPlot = [f; power]; [~,ind] = sort(f); 
ToPlot = ToPlot(:,ind); 

subplot(2,2,4) 
plot(ToPlot(1,:),ToPlot(2,:),'-o') 
xlabel('Frequency (Hz)') 
ylabel('Power') 
title('{\bf 0-Centered Periodogram} Ex. 2') 
+0

Уважаемый PZwan, Спасибо. На самом деле это был полный ответ и очень полезный код, чтобы понять ваше объяснение и общие вещи DFT и fft из matlab. – Gohann

+0

Дорогой Гохан, это было мое удовольствие. Я рад, что это было полезно для вас. – PZwan

2

Таким образом, основываясь на том, что, как эти различные векторы (уравнение 1 и окончательное уравнение) может быть такой же?

example in the documentation from Mathworks Участки всего n Точка выхода БПФ. Это охватывает частоты от 0 до почти fs (ровно (n-1)/n * fs). Затем они делают следующее наблюдение (действительный для реальных входов в FFT):

В первой половине диапазона частот (от 0 до частоты Найквиста fs/2) достаточно, чтобы определить частоты компонентов в данных, так как вторая половина - всего лишь отражение первой половины.

other post you refer to просто решил не показывать эту избыточную вторую половину. Затем он использует половину количества точек, которые также охватывают половину диапазона частот.

Фактически коэффициент (fs/n) отличается от fs/2.

Возможно, самый простой способ понять это, чтобы сравнить производительность двух выражений для некоторого малого значения n, говорит n=8 и установка fs=1 (с момента fs умножает оба выражения).С одной стороны, выход из первого выражения [0:n-1]*(fs/n) будет:

0.000 0.125 0.250 0.500 0.625 0.750 0.875 

в то время как выход fs/2*linspace(0,1,n/2+1) будет:

0.000 0.125 0.250 0.500 

Как вы можете видеть набор частот точно так же до Частота Найквиста fs/2.

+0

Самолет и простой. Спасибо за ваше объяснение SleuthEye – Gohann

Смежные вопросы