Предполагая, что вы используете дискретное преобразование Фурье для просмотра частот, вы должны быть осторожны с тем, как интерпретировать нормализованные частоты обратно в физические (т. Е. Гц).
В соответствии с руководством FFTW о том, как рассчитать спектр мощности сигнала:
#include <rfftw.h>
...
{
fftw_real in[N], out[N], power_spectrum[N/2+1];
rfftw_plan p;
int k;
...
p = rfftw_create_plan(N, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE);
...
rfftw_one(p, in, out);
power_spectrum[0] = out[0]*out[0]; /* DC component */
for (k = 1; k < (N+1)/2; ++k) /* (k < N/2 rounded up) */
power_spectrum[k] = out[k]*out[k] + out[N-k]*out[N-k];
if (N % 2 == 0) /* N is even */
power_spectrum[N/2] = out[N/2]*out[N/2]; /* Nyquist freq. */
...
rfftw_destroy_plan(p);
}
Обратите внимание, что он обрабатывает длины данных, которые не являются четными. Обратите особое внимание, если указана длина данных, FFTW выдаст вам «корзину», соответствующую частоте Найквиста (частота дискретизации, деленная на 2). В противном случае вы не получите его (т. Е. Последний бин находится чуть ниже Найквиста).
A Пример MATLAB похож, но они выбирают длину 1000 (четное число) для примера:
N = length(x);
xdft = fft(x);
xdft = xdft(1:N/2+1);
psdx = (1/(Fs*N)).*abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
freq = 0:Fs/length(x):Fs/2;
В общем, это может зависеть от реализации (ДПФ). Вам следует создать тестовую чистую синусоидальную волну с известной частотой, а затем убедиться в том, что расчет дает то же число.