Suponiendo que usa una transformada discreta de Fourier para observar las frecuencias, debe tener cuidado con la forma de interpretar las frecuencias normalizadas en las físicas (es decir, Hz).
De acuerdo con la FFTW tutorial sobre cómo calcular el espectro de potencia de una señal:
#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);
}
Nota Maneja longitudes de datos que no son siquiera. Tenga en cuenta especialmente si se da la longitud de los datos, FFTW le dará un "contenedor" correspondiente a la frecuencia de Nyquist (frecuencia de muestreo dividido por 2). De lo contrario, no lo obtiene (es decir, el último contenedor está justo debajo de Nyquist).
A MATLAB example es similar, pero que están eligiendo la longitud de 1000 (un número par) para el ejemplo:
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;
En general, puede ser la implementación (de la DFT) dependiente. Debería crear una onda sinusoidal pura de prueba a una frecuencia conocida y luego asegurarse de que el cálculo arroje el mismo número.
FFT le dará la frecuencia de componentes sinusoidales de su señal. Si desea medir la frecuencia de la señal real (cualquier forma) de lo que debe olvidarse sobre FFT y usar escaneo de muestra para cruce por cero, o pico de búsqueda pico etc ... dependen bastante de la forma y el desplazamiento de su señal. Por cierto, en FFT tienes 2 peeks, uno es el espejo del primero si la señal de entrada está en el dominio real) así que ignora la segunda mitad de FFT – Spektre