Estou calculando a FFT a partir da entrada do microfone. Percebo que frequências mais baixas sempre parecem ter mais potência (dB mais alto) do que frequências mais altas.
- Cortei os dados em quadros de 24576 bytes (4096 * 6).
- Aplique a janela Hamming:
input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/fs));
- Execute-o através do FFTW
Process1D()
. - Converter de números complexos:
output[i] = 10.0 * Math.Log10((fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]));
- Média de 6 valores para obter uma FFT completa de 4096 bytes.
- Pinte imagens bonitas (cores mapeadas para uma paleta).
A média (pt. 5) é feita para diminuir o ruído da FFT.
Como a imagem mostra tanto com o som quanto com o microfone desligado, há mais energia (e mais ruído) nas frequências mais baixas. Isso indica que é mais do que apenas um problema de microfone / sub.
Minhas perguntas:
1. Isso é esperado? Por quê?
2. Alguma maneira padrão de corrigir isso? Quase parece que alguma mágica Math.Tan () poderia elevá-la onde ela pertence.
Meu objetivo é ser capaz de identificar as 5 principais frequências sem que as frequências mais baixas ganhem por padrão.
Respostas:
Sim, isso é muito esperado. O que você vê é um espectro " rosa ", ou seja, energia constante por largura de banda relativa, em comparação com " branco ", que é energia constante por largura de banda absoluta. Para sinais cor de rosa, a energia entre 1-2kHz é a mesma que 2-4kHz (cada uma representa uma duplicação de largura de banda ou uma "oitava").
A maioria dos sinais de áudio naturais (fala, música, filmes etc.) tem um espectro rosa. Além disso, a maioria dos ruídos acústicos de fundo (ruído do microfone, HVAC, flutuações da pressão do ar, fundo genérico) tendem a ser rosados ou até mais inclinados para frequências mais baixas.
Os sistemas auditivos humanos também funcionam dessa maneira. No ouvido interno, os sinais de áudio são divididos em bandas de largura de banda relativa constante (chamadas "bandas críticas"), que são aproximadamente as mesmas que um espectro de terceira oitava.
A melhor maneira de analisar os dados do espectro de áudio é plotá-los em uma escala de frequência logarítmica.
fonte
Na etapa 2, a fórmula deve ser
input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/N));
, ondeN
está o número de amostras no buffer, no seu caso24576
.Nas etapas 4 e 5, eu faria a média binária dos valores de magnitude ao quadrado, não os valores de dB. Digamos que você tenha as magnitudes ao quadrado
[4,6]
. Sua média é de5
,10*log10(5) ~= 6.99
. A média de10*log10(4)
e10*log10(6)
é6.90
.O primeiro problema pode ser a causa do viés em direção a frequências baixas, pois causará vazamento espectral, e as frequências baixas obterão mais contaminação da linha CC (o que é inevitavelmente uma estimativa ruim). O segundo problema provavelmente não fará diferença nas frequências baixas, mas acho que se aproxima da intenção de sua medição.
fonte
fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]
1 / f de ruído ocorre em muitos sistemas físicos, biológicos e econômicos. Alguns pesquisadores a descrevem como onipresente.
Ruído rosa (à esquerda) e ruído branco (à direita) em um espectrograma de FFT com eixo vertical de frequência linear (em um analisador de espectro de áudio ou similar semelhante, o ruído rosa seria plano, sem inclinação para baixo e o ruído branco aumentando)
fonte
Muitos sons naturais têm harmônicos , então haverá frequências fundamentais mais baixas e menos energia em múltiplos mais altos do fundamental. Pode haver um viés de CD, o que significaria muita energia à esquerda. Outra influência é a sua função de janelas que distorce a resposta de frequência.
Você pode lidar com o viés de DC usando um filtro passa-alto. Uma implementação simples é subtrair a média de longo prazo de cada amostra (EDIT: ou mais simples, descartar as frequências mais baixas, por exemplo, <50Hz do resultado da FFT). Você também pode experimentar diferentes funções da janela. verifique (como aponta @mtrw) que você está aplicando a janela corretamente. Quaisquer outras não linearidades na resposta podem ser corrigidas medindo alguma entrada ideal e normalizando para essa curva.
fonte