¿Cómo verificar los resultados FFT de una onda sinusoidal?

9

Me han dado un archivo de audio (onda sinusoidal) de 1000Hz como entrada para mi algoritmo FFT. Tengo 8192 muestras de espectro de potencia en una matriz.

¿Cuál es la forma mejor y más fácil de verificar si mi salida es correcta o incorrecta?

Si doy un archivo de audio silencioso, la salida es cero para todas las muestras. En una onda sinusoidal, la o / p aumenta de 20 (muestra 0) a 26059811 (muestra 743) y disminuye gradualmente a 40.

Si tengo una idea del rango de salida, entonces puedo probar técnicamente si el FFT está funcionando.

Cualquier idea sería útil.

Consulte este enlace para cualquier duda técnica.

Comunidad
fuente
1
puedes trazar tu matriz? (¿en una hoja de cálculo, quizás?)
Hay 8192 valores en la matriz. Desea que trace manualmente o la hoja de cálculo se encargará de eso. Estoy trabajando en MAC
2
He trazado decenas de miles de muestras en MS Excel; Gnumeric u otro también es adecuado. O gnuplot también.
No olvides la oficina abierta
nombre falso el
@ Nombre falso: no puedo trazar el gráfico ..

Respuestas:

4

Parece que está calculando el espectro promediando 10 ventanas (¿no superpuestas?) Para obtener la magnitud al cuadrado en las frecuencias 8192 u 8193 (de 0 a Nyquist, pero algunos algoritmos pueden reducir la frecuencia de Nyquist en el bin 8192).

Lo primero que debe comprobar es que el pico está en el contenedor correcto. No dijo cuál es la frecuencia de muestreo, pero el bin 743 sería 743/16384 veces la frecuencia de muestreo. Si la señal realmente está a 800 Hz, eso pone Fs a aproximadamente 17640 muestras / segundo. Eso parece mal. Su señal de prueba probablemente estaría a una velocidad estándar como 8000, 16000, 22050, 32000, 44100 o 48000. Para Fs = 22050, el pico estaría bruscamente en el contenedor 800/22050 * 16384 = 594.

Otro criterio para verificar es que la energía total en la señal es aproximadamente la misma en los dominios de tiempo y frecuencia. Aquí hay un ejemplo en Python:

In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)

In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384)  # PSD by Welch's Method

In [4]: sum(x**2)/Fs           # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384       # frequency-domain energy
Out[5]: 0.24148752834391252

La señal de entrada x, que consta de dos sinusoides muestreadas a Fs = 22050 muestras / segundo, se segmenta en 10 ventanas no superpuestas de tamaño NFFT = 2048 muestras. La llamada a psd (densidad espectral de potencia) calcula el espectro y como el promedio de la magnitud al cuadrado de diez DFT de 16384 puntos (en realidad son 8193 puntos ya que x tiene un valor real).

La energía de dominio de frecuencia calculada tiene un factor de escala de N / 16384 porque la función psd escala y al tamaño DFT en lugar de a la longitud total de la señal. Si esto es o no un problema depende de cómo maneje su sistema la normalización de la PSD. Otra normalización opcional es escalar en 1 / Fs. Esto hace coincidir la energía con la señal analógica original. Las normalizaciones predeterminadas deben estar bien documentadas en la biblioteca.

Eryk Sun
fuente
Probé mi señal de onda sinusoidal es de 1000 Hz. Mine FFT da la respuesta correcta. Gracias por su ayuda.
10

Debe trazar la magnitud de la salida de la FFT. No estoy familiarizado con su lenguaje de programación, pero en Python usaría algo como plot(abs(fft(a))). Para una entrada silenciosa, la salida debe ser todos ceros. Para una entrada de onda sinusoidal, debería ver dos picos:

texto alternativo

Para una señal real, los picos serán simétricos de izquierda a derecha. Sin embargo, si está haciendo una FFT real (que es más eficiente desde el punto de vista computacional) solo obtendrá la mitad izquierda de la trama como salida, ya que ignora la imagen espejo redundante.

Si la frecuencia es más alta, los picos estarán más cerca del centro. Si la frecuencia está perfectamente sincronizada con el tamaño del fragmento , el pico solo tendrá un punto de ancho y todo lo demás será exactamente 0. De lo contrario, tendrá una "falda" cónica como la anterior.

endolito
fuente
¿Te refieres al valor del espectro de potencia como la amplitud?
t -> con referencia a la hora?
No te preocupes por el tiempo. Si solo está verificando si la FFT está funcionando, todo lo que necesita hacer es verificar que la forma de la magnitud sea similar a esta.
Endolith
No puedo trazar de todos modos mi FFT está funcionando bien. Trataré de implementar el gráfico en mi tiempo libre definitivamente. Muchas gracias.
1
@clabacchio: Oh. El FFT produce una salida con el eje f = 0 al principio y al final del gráfico. El punto medio de la gráfica es el eje f = fs / 2. A menudo hay una función fftfreq o fftshift para reorganizar el gráfico de modo que la frecuencia 0 esté en el centro. flic.kr/p/arVeZT
endolith
0

He usado la herramienta de análisis de Fourier dentro del Excel Analysis Toolpak para hacer una verificación rápida de los datos y resultados.

uɐɪ
fuente
Estoy trabajando en MAC.
@Warrior: luego use MacPorts o Fink para instalar Gnumeric (también vea esta página para obtener información sobre un contenedor Platypus si lo desea)
Kevin Vermeer