Crear un espectrograma

10

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:

  1. Asignar una estructura FFT, es decir. kiss_fft_alloc(N,0,NULL,NULL) ¿Dónde Nestá el tamaño de la ventana que estoy usando? El búfer de entrada será una matriz de Nelementos de tipo kiss_fft_scalar. El búfer de salida será una matriz de N/2 + 1elementos de tipo kiss_fft_cpx.
  2. NNúmero de decodificación (tamaño de ventana) de muestras PCM.
  3. 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.
  4. Realice ventanas (es decir, Hanning) en el búfer de entrada.
  5. 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().
  6. Para los N/2valores 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)
  7. Trace los N/2valores del paso 6.
  8. 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.
  9. Pase al paso 5, repitiendo estos pasos hasta que se procesen todas las muestras.
  10. 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.x

Gracias de antemano por cualquier guía que pueda brindar.

raynebc
fuente

Respuestas:

8

Se ve muy bien para mí. Sin embargo, en el paso 3, realmente desea escalar la señal de -1 a 1, de lo contrario, está agregando DC. Usted mencionó restar la media: no recomendaría hacer esto para un espectrograma, ya que eso está filtrando efectivamente DC, que el espectrograma debería mostrar si está allí.

Elegir un tamaño de ventana tiene que ver con las compensaciones. Una ventana más grande le dará una resolución de frecuencia más nítida, pero una resolución de tiempo más borrosa. Una ventana más corta le dará lo contrario: resolución de tiempo más nítida pero resolución de frecuencia más borrosa. La elección adecuada del tamaño de la ventana dependerá de los datos que intente analizar. Por lo general, será una potencia de 2 solo porque las FFT tienden a gustar potencias de 2. Una regla general decente es que su ventana debe ser al menos aproximadamente dos veces más larga que el período de la frecuencia más baja que le gustaría poder tener con precisión resolver.

Quizás se pregunte si es posible lidiar mejor con esta compensación, y existen técnicas para eso: generalmente involucran computar espectrogramas con varios tamaños de FFT diferentes a la vez y combinarlos. Hay buena información visual en esta página web: http://www.izotope.com/tech/aes_adapt/

Si el tamaño de su ventana es demasiado pequeño, dos frecuencias muy cercanas pueden ser indistinguibles entre sí, ya que ambas terminan en el mismo contenedor FFT. Si el tamaño de su ventana es demasiado grande, se pueden combinar dos eventos cercanos en el tiempo, o un transitorio agudo puede convertirse en un ataque gradual. Mira esa página web que publiqué para ver algunas formas de visualizar esto.

Un tamaño de ventana más grande no necesariamente reduce la cantidad de FFT. Ha elegido calcular un espectrograma utilizando una transformada de Fourier de corta duración donde hay una superposición de la mitad del tamaño de FFT. Podría usar un factor de superposición más alto si lo desea. Elegir un tamaño de ventana es mucho más cuestión de compensar el tiempo / frecuencia que la cantidad de FFT que tiene que calcular. Al diseñar un espectrograma (o cualquier STFT), puede pensar en elegir el tamaño de su ventana y el tamaño del salto , la distancia entre bloques, como parámetros independientes.

Cuando lo traza, el tiempo generalmente está en el eje x, la frecuencia está en el eje y (generalmente una escala logarítmica, escala Mel, etc., en lugar de una escala lineal), y luego las magnitudes se representan con intensidad de color, es decir los colores muy oscuros corresponden a pequeñas magnitudes y los colores muy brillantes corresponden a grandes magnitudes.

schnarf
fuente
Tu enlace parece estar muerto. ¿Podrías actualizarlo?
Daniel Wolf