¿Las frecuencias más bajas son más fuertes en FFT?

15

Estoy calculando FFT a partir de la entrada de micrófono. Noto que las frecuencias más bajas siempre parecen tener más potencia (mayor dB) que las frecuencias más altas.

  1. Corté los datos en marcos de 24576 bytes (4096 * 6).
  2. Aplicar ventana de Hamming: input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/fs));
  3. Ejecútelo a través de FFTW Process1D().
  4. Convertir de números complejos: output[i] = 10.0 * Math.Log10((fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]));
  5. Promedio de 6 valores para obtener una FFT completa de 4096 bytes.
  6. Pinte una imagen bonita (colores asignados a una paleta).

El promedio (punto 5) se realiza para reducir el ruido FFT.

Como la imagen muestra tanto con sonido como con micrófono apagado, hay más energía (y más ruido) en las frecuencias más bajas. Esto indica que es más que solo un problema de micrófono / sub.

Mis preguntas:
1. ¿Se espera esto? ¿Por qué?
2. ¿Alguna forma estándar de arreglar esto? Casi parece un poco de magia Math.Tan () podría elevarlo a donde pertenece.

Mi objetivo es poder identificar las 5 frecuencias principales sin que las frecuencias bajas ganen por defecto.

FFT

Tedd Hansen
fuente
Pruebe primero la ventana de Hamming correcta para ver si un fragmento de ventana roto es lo que está causando este ruido de baja frecuencia.
hotpaw2
@Tedd Hansen, ¿cómo terminaste "identificando las 5 frecuencias más altas sin frecuencias más bajas", las 5 mejores de bandas de 1/3 de octava ponderadas?
denis

Respuestas:

12

Sí, esto es muy esperado. Lo que ve es un espectro " rosa ", es decir, energía constante por ancho de banda relativo, en comparación con " blanco ", que es energía constante por ancho de banda absoluto. Para las señales rosadas, la energía entre 1-2kHz es la misma que para 2-4kHz (cada una representa una duplicación del ancho de banda o una "octava".

La mayoría de las señales de audio naturales (voz, música, películas, etc.) tienen un espectro rosado. Además, la mayoría de los ruidos de fondo acústicos (ruido de micrófono, ruido HVAC, fluctuaciones de presión de aire, fondo genérico) tienden a ser de color rosa o incluso más sesgados hacia las frecuencias más bajas.

Los sistemas auditivos humanos también funcionan de esa manera. En el oído interno, las señales de audio se dividen en bandas de ancho de banda relativo constante (llamadas "bandas críticas") que son más o menos lo mismo que un espectro de tercera octava.

La mejor manera de ver los datos del espectro de audio es trazarlos en una escala de frecuencia logarítmica.

Hilmar
fuente
La afirmación de que "las señales de audio naturales tienen un espectro rosado", omite la consideración de la escala de tiempo. A lo largo de mucho tiempo (~ 10 segundos) estoy de acuerdo, y ciertamente durante varios minutos esa afirmación tiende a ser cierta. Pero los espectros aquí se calculan durante 0,55 segundos. Si la entrada es, por ejemplo, música, esperaría una estructura mucho más tonal.
mtrw
2
La "tonalidad" afecta más a la estructura fina del espectro. La forma general (en términos de energía por octava) seguirá siendo mayormente rosada para la música a menos que sea algo así como "solo para triángulo y platillo"
Hilmar
1
@mtrw: Una onda cuadrada es ciertamente un tono, pero los armónicos de alta frecuencia aún se caen a una velocidad de 1 / f.
endolito
8

En el paso 2, la fórmula debe ser input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/N));, donde Nes el número de muestras en el búfer, en su caso 24576.

En los pasos 4 y 5, haría el promedio bin-wise en los valores de magnitud al cuadrado, no en los valores de dB. Digamos que tienes las magnitudes al cuadrado [4,6]. Su promedio es 5, 10*log10(5) ~= 6.99. El promedio de 10*log10(4)y 10*log10(6)es 6.90.

El primer problema podría ser la causa del sesgo hacia las frecuencias bajas, ya que provocará una fuga espectral, y las frecuencias bajas obtendrán más contaminación de la línea de CC (que inevitablemente es una estimación pobre). El segundo problema probablemente no hará una diferencia en las frecuencias bajas, pero creo que se acerca a la intención de su medición.

mtrw
fuente
fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]4 46 610Iniciar sesión10(5 5)(10Iniciar sesión10(4 4)+10Iniciar sesión10(6 6))/ /2
En su explicación anterior, creo que desea un ancho de ventana (N) de 4096, ya que este es el ancho de la FFT que se aplica. Esta ventana debería aplicarse a las 4096 muestras que se transforman antes de cada fft.
Jacob
@Jacob: el OP calcula la FFT de 6 * 4096 puntos, luego promedia 6 contenedores adyacentes para reducir a 4096 puntos.
mtrw
5

El ruido 1 / f ocurre en muchos sistemas físicos, biológicos y económicos. Algunos investigadores lo describen como ubicuo.

ruidos rosados ​​y blancos

Ruido rosa (izquierda) y ruido blanco (derecha) en un espectrograma FFT con eje vertical de frecuencia lineal (en un analizador de espectro de audio típico o similar, el ruido rosa sería plano, no inclinado hacia abajo, y el ruido blanco aumentaría)

Alexey Frunze
fuente
66
El ruido de la izquierda es definitivamente rosa, pero el de la derecha se ve un poco naranja :-)
Si bien es cierto que el ruido 1 / f es omnipresente, un extremo frontal analógico bien diseñado para audio generalmente tiene bajos niveles de ruido 1 / f por encima, digamos 10 Hz. El ruido blanco domina en las bandas de interés.
mtrw
4

¿Se espera esto? ¿Por qué?

Muchos sonidos naturales tienen armónicos , por lo que habrá frecuencias fundamentales más bajas y luego menos energía en múltiplos más altos de los fundamentales. Puede haber una polarización DC que significaría mucha energía a la izquierda. Otra influencia es su función de ventana que distorsiona la respuesta de frecuencia.

¿Alguna forma estándar de arreglar esto? Casi parece un poco de magia Math.Tan () podría elevarlo a donde pertenece.

Puede lidiar con el sesgo de CC utilizando un filtro de paso alto. Una implementación simple es restar el promedio a largo plazo de cada muestra (EDITAR: o incluso más simple, descartar las frecuencias más bajas, por ejemplo, <50Hz de su resultado FFT). También puede experimentar con diferentes funciones de ventana. asegúrese (como señala @mtrw) de que está aplicando la ventana correctamente. Cualquier otra no linealidad en la respuesta puede corregirse midiendo alguna entrada ideal y normalizando esa curva.

Guy Sirton
fuente
La función de ventanas no debería afectar la respuesta de frecuencia, ¿verdad?
endolito
@endolith: Sí, multiplicas tus datos por la función de ventana y la función combinada tiene una respuesta diferente. Lea el artículo vinculado de Wikipedia que analiza esto con más profundidad. La realidad de tratar con muestras del mundo real es que generalmente hay alguna ventana (por ejemplo, un rectángulo) y solo puede aproximar la respuesta de frecuencia de la señal de fuente (infinita) debido a eso.
Guy Sirton el
Tal vez estamos pensando en la "respuesta de frecuencia" de manera diferente. Si una señal es estacionaria, y usted le aplica una función de ventana, el espectro debe tener las mismas amplitudes a las mismas frecuencias, sin importar qué función de ventana utilice, que difiere solo por un factor de escala que afecta a todas las frecuencias por igual. El ancho de cada pico de frecuencia será diferente, pero la altura de los picos será la misma entre sí. La función de ventanas no actúa como un filtro que atenúa algunas frecuencias más que otras.
endolito el
@endolith: imagina una onda sinusoidal infinita, ahora multiplica por una ventana cos ^ 2. Todavía tendrá un componente en la frecuencia original, pero su amplitud estará "desactivada" y tendrá nuevos componentes de frecuencia procedentes de la ventana. Vea el primer párrafo aquí: en.wikipedia.org/wiki/Spectral_leakage
Guy Sirton
Sí, pero la amplitud "off" será la misma sin importar la frecuencia de la onda sinusoidal infinita, ¿no?
Endolith