collapse

* Posts Recentes

Por que nunca se deve confiar no que diz o cliente por dropes
[Ontem às 14:17]


OpAmp Rail2Rail, 30V ... e mais umas coisinhas por dropes
[Ontem às 14:07]


Loja a EVITAR por dropes
[27 de Novembro de 2021, 19:35]


Projecto LED fundem por pouco funcionamento? por filjoa
[24 de Novembro de 2021, 10:45]


Um recurso muito completo com implementações de algoritmos. por blabla
[23 de Novembro de 2021, 12:04]


Como resolver "uhmmm" 50Hz Colunas de PC por dropes
[22 de Novembro de 2021, 14:12]


Software TV sala espera + Publicidades por m90mine
[19 de Novembro de 2021, 14:32]


Stenography - Using programming to save ancient writing method por blabla
[18 de Novembro de 2021, 13:55]


Identificador Via Verde por almamater
[15 de Novembro de 2021, 16:20]


Meu novo robô por josecarlos
[13 de Novembro de 2021, 12:12]

Autor Tópico: Polyphonic note detector using Harmonic Product Spectrum  (Lida 511 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline blabla

  • Mini Robot
  • *
  • Mensagens: 80
Polyphonic note detector using Harmonic Product Spectrum
« em: 22 de Maio de 2021, 11:50 »
Bom dia,

eu fiz recentemente um pequeno projeto de software que é simples mas engraçado  e que pode ser implementado em hardware. Nas referencias que estão na página do projeto no github indico um projeto parecido feito em hardware.

Este projeto permite de uma forma simples detetar quais as notas musicais que estão a ser tocadas em instrumentos musicais polifónicos, várias notas em simultâneo. Ele também funciona bem para o caso monofónico, uma única nota.

O programa recebe como entrada um WAV mono com uma gravação do instrumento ou da musica e devolve a lista de notas que estão a ser tocadas em cada segmento de buffer que é processado pela FFT.

Quando uma nota é tocada num instrumento musical nunca é um tom perfeito, ele é sempre constituído por um tom fundamental e harmónicas, múltiplos inteiros do tom fundamental.
Ora isso causa um aumento da complexidade do algoritmo para detetar a nota musical que está a ser tocada, contudo para o caso de um única nota em cada instante, isso é relativamente fácil de se fazer, mas para o caso polifónico de várias notas em simultâneo já é um pouco mais complexo. E continua a ser alvo de investigação na busca por melhores algoritmos.

Nesta implementação de um pequeno programa que faz isso eu uso uma técnica antiga e simples mas interessante, que é o Harmonic Product Spectrum. Ela basicamente pega no spectrum da FFT, contendo todas as harmonicas de um segmento do WAV mono e faz down-sampling inteiro do spectrum algumas vezes (o que alinha os bins / buckets dos n spectrums e os comprime) e em que depois é feito um produto desses bins. Isto faz com que o spectrum final tenha picos muito elevados nas suas frequências fundamentais, zeros nas outras frequências e faz com que seja fácil fazer a sua deteção através de um threshold. Neste caso recebendo uma parametrização para um fator de escala baseado no valor de RMS (Root Mean Square) do segmento de entrada para a FFT. Logo adaptativo.

Eu coloquei muitas imagens / gráficos para explicar o funcionamento em cada fase do processo para o caso de uma única nota de guitarra clássica ( viola) e para o caso de um acorde de C maior também na guitarra clássica. Os gráficos das referencias que coloquei também ajudam na compreensão da técnica.

Algumas das melhorias simples que ainda podem ser feitas seria o de estudar e afinar um pouco melhor o tamanho do buffer da FFT (é um parâmetro do código com o qual se pode experimentar) e seria em afinar melhor a equação do facto de escala do threshold com base no facto de escala do RMS do segmento, este fator de escala ainda poderia ser melhor afinado.

Espero que gostem:

Guthub - Polyphonic note detector using Harmonic Product Spectrum
https://github.com/joaocarvalhoopen/Polyphonic_note_detector_using_Harmonic_Product_Spectrum

Eu coloquei todas as referencias que usei para aprender sobre este assunto de modo a que outros consigam também facilmente aprender sobre este assunto.

Este é um projeto muito simples mas acho que é bom para começar a aprender sobre esta área.

Cumprimentos,
João