collapse

* Posts Recentes

The Bar Z Summer Bash 2021 por SerraCabo
[19 de Junho de 2021, 18:06]


Uma visão importante para quem faz software e ou hardware. por blabla
[18 de Junho de 2021, 10:47]


DIY Physical Vapor Deposition (PVD) using Thermal Evaporation por SerraCabo
[15 de Junho de 2021, 12:20]


Traduzir automaticamente o Quake 3 de C para Rust. por blabla
[12 de Junho de 2021, 12:23]


O porquê que os programadores gostam tanto da linguagem de programação Rust. por blabla
[12 de Junho de 2021, 09:56]


Campainha de Telefone Antiga por almamater
[10 de Junho de 2021, 12:29]


localizador carro. por dio123
[10 de Junho de 2021, 09:10]


Compras Aliexpress por jm_araujo
[09 de Junho de 2021, 12:56]


Módulo Shelly 2.5 por zordlyon
[09 de Junho de 2021, 11:20]


Sensor CAN por KammutierSpule
[07 de Junho de 2021, 07:58]

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

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

Offline blabla

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