¿Por qué la transformada de Fourier de un solo ciclo de onda sinusoidal no es una sola barra?

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:

ingrese la descripción de la imagen aquí

100 ciclos:

ingrese la descripción de la imagen aquí

100000 ciclos:

ingrese la descripción de la imagen aquí

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"?

ingrese la descripción de la imagen aquí

PD: estas capturas de pantalla en particular se basan en el código aquí .

Además de la respuesta aceptada, tenga en cuenta que no hay motivo para creer que la transformada de Fourier de tiempo discreto (que está calculando con la DFT) sería un impulso para una señal de entrada que es un período de una sinusoide. La transformada de Fourier de tiempo continuo de una sinusoide es un impulso, sí, pero esa sinusoide tiene una duración infinita. Cuando limita la señal en el tiempo, eso es equivalente a multiplicar por una función de ventana rectangular. El resultado en el dominio de la frecuencia es la convolución del impulso y la transformada de Fourier de la ventana, que es esencialmente lo que estás observando.
Gracias por el comentario. Entonces, ¿cómo explicas que si cambio el número NFFT a la longitud del vector, el resultado es una sola barra?
Buena pregunta. Esto ocurre debido a una suposición inherente en la DFT. Se supone que la señal de longitud finita dada en la entrada de la DFT se extiende periódicamente en ambas direcciones con una duración infinita. Por lo tanto, cuando tiene un número entero de ciclos dentro de la "apertura" de la DFT, termina con la transformación de una sinusoide de duración infinita: un solo impulso. Esto corresponde al caso de fuga espectral exactamente cero, y rara vez ocurre en la práctica.

Respuestas (1)

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, NFFTque 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 a fft(X, n)donde nes el tamaño de Xen la primera dimensión no singleton. Si la longitud de Xes menor que n, Xse completa con ceros a la longitud n. Si la longitud de Xes mayor que n, la secuencia Xse trunca. Cuando Xes 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,384para que no haya relleno con ceros de la señal, observará una perfectFFT.

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 .

Estuvo justo en frente de mi cara todo este tiempo. Bien hecho señor, acabo de cambiar el número NFFT a la longitud del vector y eso fue todo.
@MisterMystère: vea la edición para ver el enlace al material relevante que escribí en la universidad. Una explicación mucho más completa, incluyendo imágenes.
(Aunque olvidé volver a escribir las fórmulas matemáticas, ahora se corrigió).
Solo un recordatorio de que hay pocas ventajas en el relleno a nextpow2 usando algoritmos FFT de matlab, que creo que es fftw (la transformada de Fourier más rápida en el oeste)