DSP – consigue la amplitud de todas las frecuencias

esta pregunta está relacionada con: DSP: procesamiento de audio: ¿squart o log para aprovechar fft?

en el que me perdí el algoritmo correcto para elegir.

Ahora,

Objetivo:

Quiero obtener todas las frecuencias de mi señal que recibo de un archivo de audio.

Contexto:

Yo uso numpy, y scikits.audiolab. Hice mucha lectura sobre el tema de dsp, también fui a dspguru.com, leí artículos y blogs agradables en la red.

El código que utilizo es este:

import numpy as np from scikits.audiolab import Sndfile f = Sndfile('first.ogg', 'r') # Sndfile instances can be queried for the audio file meta-data fs = f.samplerate nc = f.channels enc = f.encoding print(fs,nc,enc) # Reading is straightfoward data = f.read_frames(10) print(data) print(np.fft.rfft(data)) 

Soy nuevo en DSP.

Mi pregunta

Me gustaría poder separar todas las frecuencias de una señal para comparar diferentes señales. Uso numpy.fft.rfft en la matriz de sonido; Pero ahora, esta operación sola no es suficiente. Entonces, ¿cuál es la mejor solución para obtener todas las magnitudes de frecuencias correctamente?

Vi que al multiplicar los valores resultantes, se eliminan los números complejos y se transforma el conjunto en un número real.

Ahora que por favor Es asi ?

Si necesitas que te aclare algo, solo pregunta.

Muchas gracias !

  • Usted dice “Quiero obtener todas las frecuencias de mi señal, que recibo de un archivo de audio”. Pero lo que realmente quieres es la magnitud de las frecuencias.

  • En tu código, parece que (no sé python) solo leíste las primeras 10 muestras. Suponiendo que su archivo es mono, está bien, pero probablemente quiera ver un conjunto más grande de muestras, digamos 1024 muestras. Una vez que lo haga, por supuesto, querrá repetir en el siguiente conjunto de N muestras. Puede o no querer superponer los conjuntos de muestras, y puede querer aplicar una función de ventana, pero lo que ha hecho aquí es un buen comienzo.

  • Lo que dice Sleepyhead es verdad. La salida de la fft es compleja. Para encontrar la magnitud de una frecuencia dada, necesita encontrar la longitud o el valor absoluto del número complejo, que es simplemente sqrt (r ^ 2 + i ^ 2).

La transformada matemáticamente de Fourier devuelve valores complejos a medida que se transforma con la función *exp(-i*omega*t) . Así que la PC le da espectro como un número complejo correspondiente a las transformaciones coseno y seno. Para obtener la amplitud, solo necesita tomar el valor absoluto: np.abs(spectrum) . Para obtener el espectro de potencia, cuadrar el valor absoluto. La representación compleja es valiosa ya que puede obtener no solo la amplitud, sino también la fase de las frecuencias, que también pueden ser útiles en DSP.

Si lo entendí bien, desea recorrer todos los datos (sonido) y la amplitud de captura, para esto haga un “while” sobre la captura de datos en cada momento 1024 muestras

 data = f.read_frames(1024) while data != '': print(data) print(np.fft.rfft(data)) data = f.read_frames(1024)