Detectando a frequência fundamental

Há este festival de tecnologia no IIT-Bombay, na Índia, onde eles estão tendo um evento chamado “Artbots”, onde devemos projetar artbots com habilidades artísticas. Eu tive uma idéia sobre um robô musical que pega uma música como input, detecta as notas da música e a reproduz em um piano. Eu preciso de algum método que me ajude a calcular os tons das notas da música. Alguma idéia / sugestão sobre como fazer isso?

Isso é exatamente o que estou fazendo aqui como meu projeto do último ano 🙂 exceto uma coisa que meu projeto é sobre rastrear o tom da voz humana (e eu não tenho o robô para tocar a música)

A maneira mais rápida que posso pensar é utilizar a biblioteca BASS . Ele contém funções prontas para uso que podem fornecer dados FFT do dispositivo de gravação padrão. Dê uma olhada no exemplo de código “livespec” que vem com o BASS.

A propósito, os dados brutos da FFT não serão suficientes para determinar a frequência fundamental. Você precisa de um algoritmo como o Harmonic Product Spectrum para obter o F0.

Outra consideração é a fonte de áudio. Se você for fazer FFT e aplicar o Harmonic Product Spectrum nele. Você precisará garantir que a input tenha apenas uma fonte de áudio. Se contiver várias fonts, como nas canções modernas, haverá muitas frequências a serem consideradas.

Teoria do Espectro do Produto Harmônico

Se o sinal de input é uma nota musical, então seu espectro deve consistir de uma série de picos, correspondendo à freqüência fundamental com componentes harmônicos em múltiplos inteiros da freqüência fundamental. Assim, quando comprimimos o espectro várias vezes (downsampling) e comparamos com o espectro original, podemos ver que os picos harmônicos mais fortes se alinham. O primeiro pico no espectro original coincide com o segundo pico no espectro comprimido por um fator de dois, que coincide com o terceiro pico no espectro comprimido por um fator de três. Assim, quando os vários espectros são multiplicados juntos, o resultado formará um pico claro na frequência fundamental.

Método

Primeiro, dividimos o sinal de input em segmentos aplicando uma janela Hanning, onde o tamanho da janela e o tamanho do salto são dados como uma input. Para cada janela, utilizamos a Transformada de Fourier de Curto Prazo para converter o sinal de input do domínio de tempo para o domínio de frequência. Quando a input estiver no domínio da frequência, aplicamos a técnica do Spectrum Harmonic Product a cada janela.

O HPS envolve duas etapas: redução da resolução e multiplicação. Para reduzir a resolução, comprimimos o espectro duas vezes em cada janela por meio de reamostragem: na primeira vez, comprimimos o espectro original por dois e pela segunda vez, por três. Uma vez que isto é completado, nós multiplicamos os três espectros juntos e encontramos a frequência que corresponde ao pico (valor máximo). Esta frequência particular representa a frequência fundamental dessa janela em particular.

Limitações do método HPS

Algumas características interessantes deste método incluem: é computacionalmente barato, razoavelmente resistente ao ruído aditivo e multiplicativo, e ajustável a diferentes tipos de inputs. Por exemplo, poderíamos mudar o número de espectros comprimidos para usar, e poderíamos replace a multiplicação espectral por uma adição espectral. No entanto, como a percepção do pitch humano é basicamente logarítmica, isso significa que os pitches baixos podem ser rastreados com menos precisão que os tons altos.

Outro grave déficit do método HPS é que sua resolução é tão boa quanto a duração da FFT usada para calcular o espectro. Se fizermos uma FFT rápida e curta, estamos limitados no número de frequências discretas que podemos considerar. Para obter uma resolução mais alta em nossa saída (e, portanto, ver menos granularidade em nossa saída de inclinação), precisamos fazer uma FFT mais longa, o que requer mais tempo.

de: http://cnx.org/content/m11714/latest/

Apenas um comentário: O harmônico fundamental também pode estar faltando em um som (harmônico), isso não muda o tom percebido. Como um caso limite, se você pegar uma onda quadrada (digamos, uma nota C #) e suprimir completamente o primeiro harmônico, a nota percebida ainda será C #, na mesma oitava . De certa forma, nosso cérebro é capaz de compensar a ausência de alguns harmônicos, mesmo os primeiros, quando adivinha uma nota. Portanto, para detectar um pitch com técnicas de domínio de freqüência, você deve levar em conta todos os harmônicos (maxima local na magnitude da transformada de Fourier) e extrair algum tipo de “maior divisor comum” de suas freqüências. A detecção de tom não é um problema trivial …

A DAFX tem cerca de 30 páginas dedicadas à detecção de pitch, com exemplos e código Matlab.

Autocorrelação – http://en.wikipedia.org/wiki/Autocorrelação

Zero-crossing – http://en.wikipedia.org/wiki/Zero_crossing (este método é usado em sintonizadores de guitarra baratos)

Experimente o acompanhamento de tom YAAPT , que detecta a frequência fundamental nos domínios de tempo e frequência. Você pode fazer o download do código-fonte do Matlab a partir do link e procurar por picos na saída da FFT usando a parte do processo espectral.

Pacote do Python http://bjbschmitt.github.io/AMFM_decompy/pYAAPT.html#

Você tentou o artigo da Wikipedia sobre detecção de arremesso ? Ele contém algumas referências que podem ser interessantes para você.

Além disso, aqui está uma lista de aplicativos e bibliotecas DSP , onde você pode pesquisar. A lista menciona apenas pacotes de software Linux, mas muitos deles são multi-plataforma, e há um monte de código-fonte que você pode olhar.

Apenas FYI, detectando o tom das notas em uma gravação monofônica está ao alcance da maioria das pessoas com experiência em DSP. Detectar os tons de todas as notas, incluindo acordes e outras coisas, é muito mais difícil.

Apenas um pensamento – mas você precisa processar um stream de áudio digital como input?

Se não, considere usar uma representação simbólica da música (como MIDI). Os passos das notas serão então explicitamente declarados, e você pode sintetizar sons (e movimentos) correspondentes ao tom, ritmo e muitos outros parâmetros musicais com extrema facilidade.

Se você precisar analisar um stream de áudio digital (mp3, wav, input ao vivo, etc.), tenha em mente que, embora a detecção de sons monofônicos simples seja bastante avançada, a detecção de tom polifônico é um problema não resolvido. Nesse caso, você pode achar útil minha resposta a essa pergunta .

Para extrair a frequência fundamental da melodia da música polifônica, você pode experimentar o plug-in MELODIA: http://mtg.upf.edu/technologies/melodia

Extrair o F0 de todos os instrumentos em uma música (rastreamento multi-F0) ou transcrevê-los em notas é uma tarefa ainda mais difícil. Tanto a extração da melodia quanto a transcrição da música ainda são problemas de pesquisa aberta, portanto, independentemente do algoritmo / ferramenta que você usa, não espere obter resultados perfeitos para ambos.

Se você está tentando detectar as notas de uma gravação polifônica (várias notas ao mesmo tempo) boa sorte. Esse é um problema muito complicado. Eu não sei de nenhuma maneira de ouvir, digamos, uma gravação de um quarteto de cordas e ter um algoritmo separado das quatro vozes. (Wavelets talvez?) Se for apenas uma nota por vez, existem vários algoritmos de controle de pitch, muitos deles mencionados em outros comentários.

O algoritmo que você deseja usar dependerá do tipo de música que você está ouvindo. Se você quiser pegar pessoas cantando, há muitos bons algoritmos desenvolvidos especificamente para voz. (É aí que a maioria das pesquisas é.) Se você está tentando pegar instrumentos específicos, terá que ser um pouco mais criativo. Os algoritmos de voz podem ser simples porque o alcance da voz humana é geralmente limitado a cerca de 100-2000 Hz. (O alcance falante é muito mais estreito). As frequências fundamentais de um piano, no entanto, vão de cerca de 27 Hz. para 4200 Hz., então você está lidando com uma faixa mais ampla geralmente ignorada pelos algoritmos de detecção de pitch de voz.

A forma de onda da maioria dos instrumentos será bastante complexa, com muitos harmônicos, então uma abordagem simples, como contagem de zeros ou apenas a autocorrelação, não funcionará. Se você soubesse aproximadamente qual faixa de frequência estava procurando, você poderia passar o filtro passa-baixa e depois a contagem zero. Eu acho que você estaria melhor com um algoritmo mais complexo, como o Harmonic Product Spectrum mencionado por outro usuário, ou YAAPT (“Ainda Outro Algoritmo para o Pitch Tracking”), ou algo semelhante.

Um último problema: alguns instrumentos, especialmente o piano, terão o problema de perder os fundamentos e a falta de harmonia. Os fundamentos que faltam podem ser tratados pelos algoritmos de controle de pitch … de fato, eles precisam ser, já que os fundamentos são freqüentemente cortados na transmissão eletrônica … embora você provavelmente ainda tenha alguns erros de oitava. Inharmonicity no entanto, vai lhe dar problemas se alguém toca uma nota nas oitavas inferiores do piano. Algoritmos de rastreamento de tom normais não são projetados para lidar com a desarmonicidade porque a voz humana não é significativamente desarmonicamente.

Você basicamente precisa de um analisador de espectro. Você pode conseguir uma FFT em uma gravação de uma input analógica, mas muito depende da resolução da gravação.

o que vem imediatamente à minha mente:

  • filtrar freqüências muito baixas (bateria, linha de baixo),
  • filtrar freqüências altas (harmônicas)
  • FFT,
  • procure por picos na saída da FFT para a melodia

Não tenho certeza se isso funciona para sons muito polifônicos – talvez pesquisando “FFT, análise, melodia etc.” retornará mais informações sobre possíveis problemas.

Saudações