He estado tratando de resolver la lógica de esta tarea y planeo usar el paquete fuente KissFFT para realizar la transformación rápida de Fourier. Por favor, avíseme si esto parece correcto:
- Asignar una estructura FFT, es decir.
kiss_fft_alloc(N,0,NULL,NULL)
¿DóndeN
está el tamaño de la ventana que estoy usando? El búfer de entrada será una matriz deN
elementos de tipokiss_fft_scalar
. El búfer de salida será una matriz deN/2 + 1
elementos de tipokiss_fft_cpx
. N
Número de decodificación (tamaño de ventana) de muestras PCM.- Para cada muestra PCM, promedie la amplitud de cada canal (muestras sin signo) y escale de 0 a 2 (divida por 65536.0), almacenando el resultado en el búfer de entrada.
- Realice ventanas (es decir, Hanning) en el búfer de entrada.
- Realice una transformación rápida de Fourier en el búfer de entrada, almacenando en el búfer de salida. Como estoy usando valores reales como entrada, puedo usar
kiss_fftr()
. - Para los
N/2
valores de salida, obtenga la magnitud al cuadrado de los datos transformados y convierta los valores a la escala dB con la siguiente fórmula:10 * log10 (re * re + im * im)
- Trace los
N/2
valores del paso 6. - Deseche la primera mitad del búfer de entrada, decodifique las siguientes muestras PCM (tamaño de ventana / 2) y realice el escalado y la ventana a los datos. Esto debería deslizar efectivamente la ventana de entrada y evitar tener que rehacer las matemáticas en las muestras PCM procesadas.
- Pase al paso 5, repitiendo estos pasos hasta que se procesen todas las muestras.
- Libere la memoria usada de
kiss_fft_alloc()
.
Se sugirió que reste un valor de la ventana de entrada antes de realizar la FFT, de modo que el valor de CC resultante tenga una magnitud de cero. ¿Debo restar la media o el promedio de los datos de entrada?
Además, ¿qué cosas debo tener en cuenta al elegir un tamaño de ventana? Además de que tiene que ser un número par según las instrucciones de KissFFT, ¿hay algún beneficio al usar un tamaño de ventana pequeño, es decir? ¿proporcionará un mejor gráfico? Supongo que un tamaño de ventana grande reduce la cantidad de FFT que se deben realizar, ¿es ese el único beneficio de usar un tamaño de ventana grande?
Por último, cuando llego al punto en que los datos están listos para trazar, ¿cómo hago para trazarlos? Cuando trabajé en alguna lógica del gráfico de forma de onda en el pasado, acabo de trazar 3 valores para cada píxel a lo largo del eje (amplitud mínima, amplitud máxima, amplitud RMS), pero no sé qué se supone que debo hacer con Datos de espectrograma.
Gracias de antemano por cualquier guía que pueda brindar.
fuente