Transformada logarítmica de Fourier (LFT) no sinal de áudio

9

Estou tentando analisar as músicas da maneira mais precisa possível. Claro que tentei o FFT, mas tenho alguns problemas.

Descobri frequências baixas com resolução muito baixa do que a audição humana. Tentei muito tempo a FFT para resolver esse problema, mas mesmo analisando com 8192 amostras / s na taxa de amostragem de 44100Hz (significa falta de resolução de tempo), não obtive resolução suficiente em baixas frequências.

Eu descobri que existem poucas soluções.

Em primeiro lugar, uma interpolação quadrática nos compartimentos da FFT.
Mas não parece um caminho perfeito. Os problemas desse método são:

1. 'Se eu quiser determinar as freqs entre os compartimentos de freq, quais três compartimentos devo selecionar para fazer uma interpolação?'
2. 'Mesmo que eu faça isso, não há informações adicionais sobre o resultado. Sei que interpolações são um método complicado.

Em segundo lugar, extrair cada uma das caixas de frequência com a frequência desejada, para que eu possa extrair as caixas logaritmicamente.
Mas tenha um problema crítico de custo computacional: (talvez acima) N ^ 2.

Terceiro, LFT (Logarithmic Fourier Transform).
Isso requer amostras espaçadas logaritmicamente e me fornece o resultado exatamente o que eu procuro com uma velocidade incrivelmente rápida; /programming/1120422/is-there-an-fft-that-uses-a-logarithmic-division-of-frequency

Mas eu não tenho idéia com esse algoritmo. Tentei entender o artigo e implementá-lo, mas era impossível por falta de minhas habilidades em inglês e matemática.

Então, eu preciso de uma ajuda da implementação do LFT.

Laie
fonte

Respostas:

8

A solução mais simples e pragmática é usar uma FFT normal de tamanho suficientemente grande para que você obtenha a resolução necessária na menor frequência de interesse. Por exemplo, se você deseja uma resolução de 1 Hz na menor frequência de interesse, precisará de uma janela FFT de 1 segundo, ou seja, o tamanho da FFT precisa ser igual à taxa de amostragem, por exemplo, 44100.

Observe que, mesmo se você pudesse implementar uma FFT logarítmica, ela ainda estaria sujeita às leis da física (teoria da informação) e você ainda precisaria de uma janela de amostra de comprimento semelhante - tudo o que você obteria seria conveniência (sem a necessidade de agregar caixas de saída) ) à custa do desempenho.

Paul R
fonte
É estranho. Eu sei que, teoricamente, não há mais dados. Se eu usar um FFT de tamanho grande, é verdade que ele não é capaz de analisar as configurações muito rápidas do instrumento musical. E também é verdade que não consigo obter uma resolução mais alta em baixa frequência. Mas e o sistema auditivo humano? Como esse sistema está obtendo uma resolução mais alta, tanto em tempo quanto em frequências?
3
Talvez você deva considerar uma abordagem hierárquica, em que dizima cada oitava sucessiva por um fator de 2, para poder usar janelas de tempo curto em frequências mais altas e janelas de tempo mais longas em frequências mais baixas? Isso seria algo análogo a um banco de filtros auditivos, em que a largura de banda aumenta com a frequência.
Paul R
Ótima abordagem. Goertzel de longo tempo em baixas frequências, goertzel de curto tempo em altas frequências? Faz sentido. Mas exigirá grandes custos computacionais.
Provavelmente é mais eficiente do que realizar uma FFT grande, mesmo que seja mais complexa. Por exemplo, para uma hierarquia de 4 oitavas, você pode querer FFTs de 4 x 2048 pontos e 3 filtros passa-baixo para amostragem x2 reduzida. A resolução da FFT mais baixa será tão boa quanto uma FFT de 16384 pontos na taxa de amostragem completa, mas como a FFT é O (n log n), o custo computacional total será muito menor.
Paul R
aha, FFT 2048, amostra para baixo x2, FFT 2048, amostra para baixo x2 .... do que eu tenho resolução de tempo e frequência, com custos muito menores que 16384 FFT. Ótimo. E agora tenho a outra solução: na amostra 16384, o goertzel de cada vez em 32. Assim, com a acumulação, posso extrair freqüências baixas e altas com custos menores. Muito obrigado. :)
0

Se a análise que você pretende executar exigir a frequência dos sinais em cada compartimento, você pode usar a Transformada de Fourier de Tempo Curto para conseguir isso.

Cada compartimento da FFT produz um número complexo que representa o componente real e imaginário - ou após um pouco de fase e magnitude de manipulação.

Como frequência = dPhi / dt, (Phi == fase), tomando os compartimentos correspondentes de pares de espectros STFT consecutivos, você pode calcular a frequência.

O DSP Dimension tem um bom artigo sobre o processo.

Marko
fonte
Parece que estou contemplando um problema ainda mais complexo. Posso usar o FFT, mas na análise do sinal de áudio, porém, não é adequado.
3
Veja a versão "Q constante" da Transformada de Fourier em Tempo Curto. Esse arranjo do STFT fornece resolução de frequência que se ajusta logaritmicamente para acomodar requisitos para diferentes faixas de frequência.
usar o seguinte comando
Eu vou dar uma olhada. Eu pensei que era apenas uma operação simples de transformação de banco de filtros aplicada ao resultado fft.
Laie