collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]


Focos LED SMD por almamater
[16 de Dezembro de 2023, 14:12]


I Belive por dropes
[15 de Dezembro de 2023, 13:59]


Carga de corrente eletrónica ZPB30A1 60W por jm_araujo
[11 de Dezembro de 2023, 13:27]

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

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

Offline blabla

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