He probado diferentes códigos de transformada de Fourier en ondas sinusoidales individuales, y todos producen un espectro distribuido con una resonancia en la frecuencia de la señal cuando teóricamente deberían mostrar una sola barra.
La frecuencia de muestreo tiene poco efecto (10 kHz aquí), sin embargo, el número de ciclos sí:
Un ciclo:
100 ciclos:
100000 ciclos:
Parece que la transformada de Fourier converge solo para un número infinito de ciclos, ¿por qué? ¿No debería una ventana de tiempo de exactamente un ciclo dar los mismos resultados que la de N ciclos?
Aplicación: Esto es tanto por curiosidad como porque quiero saber cuánto excitará la respuesta escalonada de un sistema de primer orden la resonancia de un ensamblaje mecánico. Por lo tanto, necesito una transformada de Fourier precisa de la respuesta... en la que ya no confío. ¿Qué podría hacer para mejorar la precisión entonces, basado en el caso de "onda sinusoidal"?
PD: estas capturas de pantalla en particular se basan en el código aquí .
Este es un artefacto de ventana.
El código vinculado rellena una señal de 10.000 muestras con ceros para que la longitud sea una potencia de dos.
%% Author :- Embedded Laboratory
%%This Project shows how to apply FFT on a signal and its physical
% significance.
fSampling = 10000; %Sampling Frequency
tSampling = 1/fSampling; %Sampling Time
L = 10000; %Length of Signal
t = (0:L-1)*tSampling; %Time Vector
F = 100; %Frequency of Signal
%% Signal Without Noise
xsig = sin(2*pi*F*t);
...
%%Frequency Transform of above Signal
subplot(2,1,2)
NFFT = 2^nextpow2(L);
Xsig = fft(xsig,NFFT)/L;
...
Tenga en cuenta que en el código anterior, la FFT se toma con el tamaño de FFT, NFFT
que es la siguiente potencia de 2 más grande que la longitud de la señal (en este caso, 16 384). De la documentación de Mathworksfft()
:
Y = fft(X,n)
devuelve la DFT de n puntos.fft(X)
es equivalente afft(X, n)
donden
es el tamaño deX
en la primera dimensión no singleton. Si la longitud deX
es menor quen
,X
se completa con ceros a la longitudn
. Si la longitud deX
es mayor quen
, la secuenciaX
se trunca. CuandoX
es una matriz, la longitud de las columnas se ajusta de la misma manera.
Esto significa que en realidad no está tomando una FFT de una 'onda sinusoidal pura': está tomando la FFT de una onda sinusoidal con una señal plana después.
Esto es equivalente a tomar la FFT de una onda sinusoidal multiplicada por una función de ventana cuadrada. El espectro FFT es entonces la convolución del espectro de frecuencia de onda sinusoidal (una función de impulso) con el espectro de frecuencia de onda cuadrada (sinc(f).)
Si cambia L = 16,384
para que no haya relleno con ceros de la señal, observará una perfect
FFT.
Otras palabras clave de búsqueda: "Fuga espectral", "Función de ventana", "Ventana de Hamming".
Editar: limpié parte del material que escribí sobre este tema en la universidad, que entra en muchos más detalles. He publicado eso en mi blog .
jason r
Señor Mystère
jason r