Frequências mais baixas são mais fortes na FFT?

15

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.

  1. Cortei os dados em quadros de 24576 bytes (4096 * 6).
  2. Aplique a janela Hamming: input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/fs));
  3. Execute-o através do FFTW Process1D().
  4. 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]));
  5. Média de 6 valores para obter uma FFT completa de 4096 bytes.
  6. 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.

FFT

Tedd Hansen
fonte
Por favor, tente primeiro a janela Hamming correta para ver se um fragmento de janela quebrado está causando esse ruído de baixa frequência.
hotpaw2
@Tedd Hansen, como você acabou "identificando as 5 principais frequências sem frequências mais baixas" - o top 5 das bandas de 1/3 de oitava ponderadas?
Denis

Respostas:

12

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.

Hilmar
fonte
A afirmação de que "os sinais de áudio naturais têm um espectro rosa" deixa de lado a escala de tempo. Por um longo tempo (~ 10s de segundos), eu concordo, e certamente por vários minutos essa afirmação tende a ser verdadeira. Mas os espectros aqui são calculados em 0,55 seg. Se a entrada for, por exemplo, música, eu esperaria uma estrutura muito mais tonal.
Mtrw #
2
"tonalidade" afeta mais a estrutura fina do espectro. A forma global (em termos de energia por oitava) ainda será principalmente rosa para a música a menos que seja algo como "solo para triângulo e pratos crash"
Hilmar
11
@mtrw: Uma onda quadrada é certamente um tom, mas os harmônicos de alta frequência ainda caem a uma taxa de 1 / f.
endolith 28/09/12
8

Na etapa 2, a fórmula deve ser input[i] *= (0.54d - 0.46d*(double) Math.Cos((2d*Math.PI*i)/N));, onde Nestá o número de amostras no buffer, no seu caso 24576.

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 é de 5, 10*log10(5) ~= 6.99. A média de 10*log10(4)e 10*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.

mtrw
fonte
fout[i * 2] * fout[i * 2]) + (fout[i * 2 + 1] * fout[i * 2 + 1]4610registro10(5)(10registro10(4)+10registro10(6))/2
Na sua explicação acima, acredito que você deseja uma largura de janela (N) de 4096, pois essa é a largura da FFT sendo aplicada. Essa janela precisaria ser aplicada às 4096 amostras sendo transformadas antes de cada fft.
Jacob
@ Jacob - o OP está calculando a FFT de 6 * 4096 pontos e, em seguida, calcula a média de 6 posições adjacentes para reduzir para 4096 pontos.
MTRW
5

1 / f de ruído ocorre em muitos sistemas físicos, biológicos e econômicos. Alguns pesquisadores a descrevem como onipresente.

ruídos rosa e brancos

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)

Alexey Frunze
fonte
6
O barulho do lado esquerdo é definitivamente-de-rosa, mas a da direita parece uma laranja bit :-)
Embora seja verdade que o ruído 1 / f é onipresente, um front end analógico bem projetado para áudio geralmente apresenta baixos níveis de 1 / f acima, digamos 10 Hz. O ruído branco domina nas faixas de interesse.
Mtrw 30/10/11
4

Isso é esperado? Por quê?

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.

Alguma maneira padrão de consertar isso? Quase parece que alguma mágica Math.Tan () poderia elevá-la onde ela pertence.

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.

Guy Sirton
fonte
A função de janelas não deve afetar a resposta de frequência, deveria?
endolith 28/09/12
@ endolith: Multiplica seus dados pela função de janelas e a função combinada tem uma resposta diferente. Leia o artigo vinculado da Wikipedia que discute isso com mais profundidade. A realidade de lidar com amostras do mundo real é que geralmente há alguma janela (por exemplo, um retângulo) e você só pode aproximar a resposta de frequência do sinal da fonte (infinito) por causa disso.
Guy Sirton
Talvez estejamos pensando em "resposta em frequência" de maneira diferente. Se um sinal é estacionário e você aplica uma função de janela a ele, o espectro deve ter as mesmas amplitudes nas mesmas frequências, independentemente da função de janela usada, diferindo apenas por um fator de escala que afeta igualmente todas as frequências. A largura de cada pico de frequência será diferente, mas a altura dos picos será a mesma em relação um ao outro. A função de janelas não atua como um filtro que atenua algumas frequências mais do que outras.
Endolith 2/10
@endolith: imagine uma onda senoidal infinita, agora multiplique por uma janela cos ^ 2. Você ainda terá um componente na frequência original, mas sua amplitude será "desativada" e você terá novos componentes de frequência vindos da janela. Veja o primeiro parágrafo aqui: en.wikipedia.org/wiki/Spectral_leakage
Guy Sirton
Sim, mas a amplitude "desligada" será a mesma, independentemente da frequência da onda senoidal infinita, não?
Endolith 2/10