Como você analisa a frequência fundamental de uma amostra PCM ou WAV?

Eu tenho uma amostra realizada em um buffer do DirectX. É uma amostra de uma nota tocada e capturada de um instrumento. Como faço para analisar a frequência da amostra (como um afinador de violão faz)? Acredito que as FFTs estão envolvidas, mas não tenho indicações para os HOWTOs.

A FFT pode ajudá-lo a descobrir onde está a frequência, mas não pode dizer exatamente qual é a frequência. Cada ponto da FFT é um “bin” de freqüências, portanto, se houver um pico em sua FFT, tudo o que você sabe é que a freqüência que você deseja está em algum lugar dentro dessa checkbox ou faixa de freqüências.

Se você quiser realmente preciso, você precisa de uma FFT longa com alta resolução e muitas checkboxs (= muita memory e muita computação). Você também pode adivinhar o pico real de uma FFT de baixa resolução usando interpolação quadrática no espectro de escala de log, que funciona surpreendentemente bem.

Se o custo computacional é o mais importante, você pode tentar obter o sinal em uma forma na qual você pode contar travessias nulas, e quanto mais você contar, mais precisa será sua medição.

Nenhum destes funcionará se o fundamental estiver faltando , no entanto. 🙂

Eu descrevi alguns algoritmos diferentes aqui , e o FFT interpolado é geralmente o mais preciso (embora isso só funcione quando o fundamental é o harmônico mais forte – caso contrário, você precisa ser mais esperto em encontrá-lo), com cruzamentos nulos um segundo próximo (embora isso só funcione para formas de onda com um cruzamento por ciclo ). Nenhuma dessas condições é típica.

Tenha em mente que os parciais acima da frequência fundamental não são harmônicos perfeitos em muitos instrumentos, como piano ou guitarra. Cada parcial é na verdade um pouco desafinada ou inarmônica . Assim, os picos de frequência mais alta na FFT não estarão exatamente nos múltiplos inteiros da fundamental, e a forma da onda mudará levemente de um ciclo para o próximo, o que elimina a autocorrelação.

Para obter uma leitura de frequência realmente precisa, eu diria que use a autocorrelação para adivinhar a fundamental e depois encontre o pico verdadeiro usando a interpolação quadrática. (Você pode fazer a autocorrelação no domínio da frequência para salvar os ciclos da CPU.) Há muitas dicas, e o método correto para usar depende da sua aplicação.

Existem também outros algoritmos que são baseados em tempo, não baseados em frequência. A autocorrelação é um algoritmo relativamente simples para detecção de pitch. Referência: http://cnx.org/content/m11714/latest/

Eu escrevi c # implementações de autocorrelação e outros algoritmos que são legíveis. Confira http://code.google.com/p/yaalp/ .

http://code.google.com/p/yaalp/source/browse/#svn/trunk/csaudio/WaveAudio/WaveAudio Lista os arquivos e PitchDetection.cs é o que você deseja.

(O projeto é GPL; portanto, entenda os termos se você usar o código).

FFTs (Fast-Fourier Transforms) de fato estariam envolvidos. As FFTs permitem aproximar qualquer sinal analógico com uma sum de ondas senoidais simples de frequências fixas e amplitudes variables. O que você essencialmente está fazendo é pegar uma amostra e decompô-la em pares de amplitude-> frequência e depois pegar a frequência que corresponde à amplitude mais alta.

Espero que outro leitor SO possa preencher as lacunas que estou deixando entre a teoria e o código!

Sintonizadores de guitarra não usam FFT ou DFT. Geralmente eles contam apenas travessias nulas. Você pode não obter a frequência fundamental porque algumas formas de onda têm mais cruzamentos de zero do que outras, mas normalmente você pode obter um múltiplo da frequência fundamental dessa maneira. Isso é o suficiente para obter a nota, embora você possa ter uma ou mais oitavas de folga.

A filtragem de baixa passagem antes da contagem dos cruzamentos de zero geralmente pode eliminar os cruzamentos com excesso de zero. Ajustar o filtro de baixa passagem requer algum conhecimento da faixa de freqüência que você deseja detectar

Um pouco mais especificamente:

Se você começar com o PCM bruto em uma matriz de input, o que você basicamente tem é um gráfico da amplitude da onda em relação ao tempo. Focar uma FFT transformará isso em um histograma de frequência para freqüências de 0 a 1/2 da taxa de amostragem de input. O valor de cada input na matriz resultante será a ‘força’ da subfreqüência correspondente.

Então, para encontrar a freqüência da raiz dada uma matriz de input de tamanho N amostrada em amostras S / segundo:

FFT(N, input, output); max = max_i = 0; for(i=0;imax) max_i = i; root = S/2.0 * max_i/N ; 

A recuperação de frequências fundamentais em um sinal de áudio PCM é uma tarefa difícil, e haveria muito o que falar sobre isso …

De qualquer forma, geralmente o método baseado no tempo não é adequado para sinais polifônicos, porque uma onda complexa dada pela sum de diferentes componentes harmônicos devido a múltiplas frequências fundamentais tem uma taxa de cruzamento zero que depende apenas do componente de freqüência mais baixa … o domínio da freqüência a FFT não é o método mais adequado, já que o espaçamento entre notas segue uma escala exponencial, não linear. Isso significa que uma resolução de frequência constante, usada no método FFT, pode ser insuficiente para resolver notas de frequência mais baixa se o tamanho da janela de análise no domínio do tempo não for grande o suficiente.

Um método mais adequado seria uma transformada Q constante, que é aplicada após um processo de filtragem passa-baixas e decimação por 2 (ou seja, dividindo a cada passo a frequência de amostragem) do sinal, a fim de obter diferentes sub-bandas com diferentes frequências resolução. Desta forma, o cálculo da DFT é otimizado. O problema é que também a resolução de tempo é variável e aumenta para as sub-bandas inferiores …

Finalmente, se estamos tentando estimar a frequência fundamental de uma única nota, os methods FFT / DFT são aceitáveis. As coisas mudam para um contexto polifônico, em que parciais de diferentes sons se sobrepõem e summ / cancelam sua amplitude dependendo de sua diferença de fase, e assim um único pico espectral pode pertencer a diferentes conteúdos harmônicos (pertencentes a diferentes notas). Correlação, neste caso, não dá bons resultados …

Aplique um DFT e, em seguida, obtenha a frequência fundamental dos resultados. Pesquisando informações da DFT, você obterá as informações de que precisa – eu ligaria para algumas, mas elas diferem muito em termos de conhecimento de matemática.

Boa sorte.