Предполагая, что вы используете дискретное преобразование Фурье, чтобы смотреть на частоты, тогда вы должны быть осторожны, как интерпретировать нормализованные частоты обратно в физические (т. Е. Гц).
В соответствии с FFTW tutorial о том, как рассчитать спектр мощности сигнала:
#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). В противном случае вы не получите его (т. Е. Последний бит чуть ниже Найквиста).
MATLAB example похож, но они выбирают длину 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;
В целом, это может быть реализация (ДПФ) в зависимости. Вы должны создать тестовую чистую синусоидальную волну с известной частотой, а затем убедитесь, что вычисление дает одинаковое число.
FFT даст вам частоту синусоидальных компонентов вашего сигнала. Если вы хотите измерить частоту реального сигнала (любой формы), чем вы должны забыть о БПФ и использовать выборочное сканирование для пересечения нуля, или пиковый поиск пика и т. Д. ... немного зависят от формы и смещения вашего сигнала. btw on FFT у вас есть 2 peeks one - это зеркало первого, если входной сигнал находится в реальном домене), поэтому игнорируйте вторую половину FFT – Spektre