Путаница, возможно, связана с тем фактом, что два примера, на которые вы ссылались, рисуют результаты 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')
Уважаемый PZwan, Спасибо. На самом деле это был полный ответ и очень полезный код, чтобы понять ваше объяснение и общие вещи DFT и fft из matlab. – Gohann
Дорогой Гохан, это было мое удовольствие. Я рад, что это было полезно для вас. – PZwan