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.
- Corté los datos en marcos de 24576 bytes (4096 * 6).
- Aplicar ventana de Hamming:
input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/fs));
- Ejecútelo a través de FFTW
Process1D()
. - 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]));
- Promedio de 6 valores para obtener una FFT completa de 4096 bytes.
- 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.
Respuestas:
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.
fuente
En el paso 2, la fórmula debe ser
input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/N));
, dondeN
es el número de muestras en el búfer, en su caso24576
.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 es5
,10*log10(5) ~= 6.99
. El promedio de10*log10(4)
y10*log10(6)
es6.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.
fuente
fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]
El ruido 1 / f ocurre en muchos sistemas físicos, biológicos y económicos. Algunos investigadores lo describen como ubicuo.
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)
fuente
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.
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.
fuente