collapse

* Posts Recentes

Compras Aliexpress por almamater
[Ontem às 23:19]


TEK collection por SerraCabo
[Ontem às 20:37]


The first fully functional non-silicon ARM Processor, PlasticArm por blabla
[22 de Julho de 2021, 09:26]


Pequenos guias com informação sobre programação e eletrónica. por blabla
[20 de Julho de 2021, 09:50]


Procuro esp8266 Nodemcu v3 lua com ch340 por jm_araujo
[19 de Julho de 2021, 13:47]


Dúvida sobre o sensor RCWL-0516 por blabla
[17 de Julho de 2021, 22:39]


localizador carro. por dio123
[17 de Julho de 2021, 21:42]


A new Golden Age for Computer Architecture - David Patterson por blabla
[15 de Julho de 2021, 12:17]


Ajuda em contador de pessoas com IR por blabla
[14 de Julho de 2021, 09:56]


How to learn modern Embedded Systems por blabla
[11 de Julho de 2021, 12:12]

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

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

Offline blabla

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