Transformação discreta de Fourier - encontrando o fundamental rapidamente?


9

Primeiro, peço desculpas porque sou desenvolvedor de software e faz muito tempo que não mergulhei na matemática pura, então minha pergunta pode parecer tola. Espero que não.

O contexto é o reconhecimento de pitch na música.

Se você tomar uma nota musical e aplicar uma transformação de Fourier a ela, terá uma soma infinita de amplitudes para determinadas frequências. Por exemplo, se eu tocar uma nota cujo fundamental é , em qualquer instrumento, após a transformação de Fourier, terei harmônicos em . Toda frequência terá uma dada amplitude que define o timbre do instrumento (piano, voz, trompete, ... todos seguem essa lei, mas você terá amplitudes diferentes para cada harmônica)FF,2F,3F,...,nF

Agora, o que eu gostaria de fazer é partir de um determinado sinal de áudio, encontrar . Só isso. É mais complicado do que parece, porque você sempre terá ruído de fundo e assim por diante ... Além disso, F não é necessariamente a frequência com a maior amplitude!FF

Portanto, minha ideia para encontrar é aplicar um DFT (na verdade, um FFT para velocidade) e encontrar uma frenquência F , de modo que F + 2 F + 3 F + + n F seja o máximo na saída da FFT.FFF+2F+3F+...+nF

Você acha que isso é possível? Você acha que isso é possível em um tempo muito curto (digamos <5 milissegundos)?


Provavelmente isso poderia ser uma resposta: edaboard.com/thread197897.html

Bem, sim, mas esse é um método diferente, não é? IMHO, é mais fácil, mas muito menos fiável porque não pode distinguir entre sons harmônicos e inarmônicos ...
Dinaiz

Respostas:


6

O que você está descrevendo é muito semelhante ao método de estimativa de pitch do Espectro Harmônico do Produto, conforme listado neste artigo da Stanford CCRMA .

Uma FFT não fornece uma "soma infinita de amplitudes", mas um número finito de posições no resultado, dependendo do tamanho da FFT.

5 mS é apenas 1 período de uma nota de 200 Hz e apenas uma fração de um período abaixo de 200 Hz. O reconhecimento de afinação musical geralmente requer ouvir ou analisar um número múltiplo de períodos da periodicidade de um som afinado. E muita música usa notas abaixo do G2. Se você tiver um comprimento suficiente de dados, o cálculo de uma estimativa de afinação a partir desses dados poderá demorar apenas na ordem de microssegundos em vez de milissegundos em um PC ou dispositivo móvel moderno.


Bom ponto. No entanto, se você já possui 2F e 3F, não precisa realmente de F, precisa? No seu exemplo, 2F = 400Hz e 3F = 600Hz, então você provavelmente pode descobrir que F era 200 mesmo sem ouvir som suficiente para ter um período de 5 ms, não é? Também ouvi falar sobre transformar wavelet. Você acha que esse é o melhor método para fazer isso?
Dinaiz

@ Dinaiz: Depende da fonte do som agudo e se esses fragmentos de frequências de overtone são realmente estacionários ou não. Wavelets são uma questão completamente separada.
usar o seguinte código

Portanto, esse método não é adequado para encontrar f0 "quase em tempo real". No atual estado da arte, é possível encontrar f0, em menos de alguns milissegundos, com qualquer instrumento, ou é uma causa perdida e devo desistir de minha busca? : D
Dinaiz 04/07/2012
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.