FFT de onda sinusoidal no llega como se esperaba, es decir, un solo punto

14

El diagrama cian es un espectro de 50 Hz, y el magenta es una onda sinusoidal de 50,1 Hz (que tiene una amplitud de 0,7). Ambos se muestrean a 1024 muestras / s. Realicé un FFT de 1024 puntos para obtener este espectro.

¿Por qué solo el espectro de 50Hz es un valor único? ¿Por qué el seno de 50.1 Hz consiste en otras frecuencias aparte de 50.1 Hz; ¿De dónde vienen estas nuevas frecuencias?

¡No hice ningún procesamiento no lineal en la señal de 50,1 Hz! Además, los 50.1 Hz parecen tener una amplitud máxima más pequeña, es decir, no es 0.7, cuando en realidad la onda sinusoidal que generé tiene una amplitud de 0.7.

¿Por qué es esto?

Dos espectros, para 50Hz y 50.1Hz respectivamente Obtenido por el comando MATALB fft ();

gpuguy
fuente
¿Podría publicar el código que usó para producir esta trama? Mi mejor conjetura es que debido a que sus señales están tan juntas, el fft no puede resolverlas adecuadamente. Eso, o alguna mancha espectral porque las muestras no se alinean con las frecuencias.
Tom Kealy
44
Las respuestas a continuación son correctas. El término para lo que está observando se llama fuga espectral , y se observa cuando analiza una sinusoide cuya frecuencia no se encuentra exactamente en el centro de uno de sus contenedores de salida DFT.
Jason R
por favor, ¿puedo saber qué tramaste contra qué para que puedas obtener tu pico en la marca de 50Hz?
Nazario_Jnr
Consulte esta respuesta para obtener una descripción detallada de cuál es el problema y cómo solucionarlo.
Dilip Sarwate

Respuestas:

14

En realidad, la respuesta de Matt ya ofrece una visión del problema aquí: el DFT es implícitamente periódico tanto en el dominio del tiempo como en el de la frecuencia (vea esta pregunta ). A partir de sus parámetros, podemos calcular que su período de observación es de 1 s. Eso significa que observa 50 períodos de un tono de 50 Hz. La extensión periódica de ese intervalo de observación siempre dará como resultado una onda sinusoidal sin apariencia. Si toma el tono de 50.1 Hz, está transformando 50.1 períodos de una oscilación. La extensión periódica de esa señal dará como resultado saltos de fase que causarán afluentes espectrales adicionales.

Fs/ /nortereFT=1024Hz/ /1024=1Hz

Ambos efectos descritos anteriormente contribuyen al espectro que estás observando.

Deve
fuente
1
Eso tiene sentido. Pero para ser más claros, la fuga espectral que describió es un problema con la herramienta (FFT) para observar espectros. No es un defecto perse en la señal. Significa que si 'escucho' una señal de audio de 50.1 Hz, aparecerá en mis oídos como un solo tono y no como una especie de 'ruido'. Estoy en lo cierto?
gpuguy
1
Estás absolutamente en lo correcto. Muestra cuán importante es entender lo que el DFT está haciendo realmente para poder interpretarlo correctamente. Como nota al margen: lo que "escucharía" en una implementación real también depende de cómo esté convirtiendo la señal discreta en analógica.
Deve
11

Este es el efecto de truncar o ventanas la señal sinusoidal. Debe truncar de tal manera que si agrega la señal desplazada a la truncada, seguirá siendo la onda sinusoidal original.

Matt L.
fuente
6

Solo obtendrá un único punto FFT de resultado para una frecuencia de sinusoide pura no modulada que es exactamente un número entero periódico en la apertura o ancho FFT. Cualquier otra frecuencia de sinusoide aparecerá convolucionada con la transformación (un Sinc periódico) de la ventana predeterminada (un rectángulo).

50.1 Hz no es exactamente periódico en la ventana de 1 segundo de su FFT.

Esos otros contenedores o frecuencias de resultado de FFT de "fuga" son necesarios para representar la discontinuidad producida entre los límites de la ventana por cualquier señal que no sea exactamente un número entero periódico en el ancho de FFT. Esto se debe a que todos los vectores base de un DFT son exactamente enteros periódicos dentro del ancho del DFT, y por lo tanto no tienen una discontinuidad aguda entre el final y el comienzo del vector base. Por lo tanto, cualquier señal que no tenga esas características no puede representarse con un solo vector base DFT (y su complejo conjugado), por lo que la información sobre el resto de la señal tiene que ir a algún lado.

Dado que la energía total es preservada por la transformación FFT (teorema de Parseval'a), la energía en los depósitos de "fuga" se lleva del depósito máximo. Por lo tanto, la magnitud de la papelera máxima debe ser menor.

hotpaw2
fuente
5

¿Apuesto a que su onda sinusoidal es cero en la primera y última muestra? No debe ser Debe alinearse de modo que la siguiente muestra después de la última muestra sea cero, de modo que pueda copiar y pegar copias de la señal una tras otra y se verán continuas, sin muestras duplicadas. Tal vez piense en él como un fondo de escritorio en mosaico, donde un borde tiene que coincidir perfectamente con el borde opuesto cuando está en mosaico. :)

Consulte https://gist.github.com/endolith/236567 para ver un ejemplo de Python:

# Sampling rate
fs = 128 # Hz

# Time is from 0 to 1 seconds, but leave off the endpoint, so that 1.0 seconds is the first sample of the *next* chunk
length = 1 # second
N = fs * length
t = linspace(0, length, num = N, endpoint = False)

# Generate a sinusoid at frequency f
f = 10 # Hz
a = cos(2 * pi * f * t)

# Use FFT to get the amplitude of the spectrum
ampl = 1/N * abs(fft(a))

Vea cómo dos copias de la señal se unen de extremo a extremo para formar una onda continua:

ingrese la descripción de la imagen aquí

Cuando esto sucede, la energía FFT está contenida completamente en un solo contenedor:

ingrese la descripción de la imagen aquí

endolito
fuente
1
Tuve el mismo problema que OP. Se resolvió gracias a establecer endpoint = False flag. Pensé que el espacio lineal es (cerrado, abierto) de forma predeterminada, pero resulta ser (cerrado, cerrado). Encontré el error gracias a tu código.
Trismegistos
-1

Esto ocurre debido a fugas espectrales y ventanas. La respuesta ideal, es decir, la función de impulso es para onda sinusoidal de tiempo continuo. Cuando toma DFT de una onda sinusoidal discreta en una computadora digital, básicamente está tomando la Transformada de Fourier de seno sinusoidal y en ventana y luego muestreando en el dominio de frecuencia. Esto provoca la fuga espectral. Consulte: http://w.astro.berkeley.edu/~jrg/ngst/fft/leakage.html

Akshat
fuente