collapse

* Posts Recentes

Três pequenas palestras fantásticas de Rust na RustConf 2021 por blabla
[Hoje às 08:44]


Meu novo robô por josecarlos
[13 de Setembro de 2021, 21:58]


localizador carro. por dropes
[13 de Setembro de 2021, 21:00]


Fonte para Circuito - Qual escolher? por almamater
[12 de Setembro de 2021, 00:07]


Limpeza por ultra-sons por KammutierSpule
[10 de Setembro de 2021, 09:08]


Programação assíncrona Async e Await em Rust com Tokio. por blabla
[08 de Setembro de 2021, 14:46]


My arm por josecarlos
[06 de Setembro de 2021, 21:56]


Digitalização 3D por senso
[05 de Setembro de 2021, 14:45]


Opinião - Projector LED para Natal por senso
[05 de Setembro de 2021, 14:35]


APN - localizador GPS/GSM por jm_araujo
[31 de Agosto de 2021, 19:19]

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

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

Offline blabla

  • Mini Robot
  • *
  • Mensagens: 64
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