Detecção de pitch usando redes neurais [fechadas
-
24-09-2019 - |
Pergunta
Estou tentando usar Ann para detecção de pitch de notas musicais. A rede é um MLP simples de duas camadas, cujas entradas são basicamente uma DFT (média e distribuída logaritmicamente), e 12 saídas correspondem às 12 notas de uma oitava específica.
A rede é treinada com várias amostras dessas 12 notas tocadas por alguns instrumentos (uma nota de cada vez) e algumas amostras de "silêncio".
Os resultados são realmente bons. A rede é capaz de detectar essas notas tocadas por diferentes instrumentos com precisão com precisão, é relativamente amune ao ruído e nem se perde completamente quando é tocado uma música.
O objetivo, no entanto, é ser capaz de detectar som polifônico. Para que, quando duas ou mais notas são tocadas juntas, os dois neurônios correspondentes disparam. O surpreendente é que a rede já faz isso até certo ponto (sendo treinado apenas em amostras monofônicas), ainda que de forma menos consistente e com menos precisão do que para notas monofônicas. Minha pergunta é como posso aprimorar sua capacidade de reconhecer o som polyphnic?
O problema é que eu não entendo por que ele realmente realmente funciona. As diferentes notas (ou seus DFTs) são basicamente pontos diferentes no espaço para os quais a rede é treinada. Portanto, vejo por que ele reconhece sons semelhantes (pontos próximos), mas não como "conclui" a saída para uma combinação de notas (que formam um ponto distante de cada um dos exemplos de treinamento). Da mesma forma, uma rede e a rede que é treinada sobre (0,0) (0,1) (1,0) = (0), não se espera que "conclua" que (1,1) = (1).
A força bruta Aproach é treinar a rede com o maior número possível de amostras polifônicas. No entanto, como a rede parece, de alguma forma, entender vagamente a idéia das amostras monofônicas, provavelmente há algo mais fundamental aqui.
Algum indicador? (Desculpe pelo comprimento, btw :).
Solução
A razão pela qual ele já funciona já é provavelmente simplesmente que você não o treinou para escolher uma e apenas uma saída (pelo menos eu suponho que você não). No caso simples, quando a saída é apenas um produto de ponto da entrada e os pesos, os pesos se tornariam filtros correspondentes para o tom correspondente. Como tudo é linear, várias saídas seriam ativadas simultaneamente se vários filtros correspondentes viessem simultaneamente boas correspondências (como é o caso das notas polifônicas). Como sua rede provavelmente inclui não linearidades, a imagem é um pouco mais complexa, mas a ideia é provavelmente a mesma.
Em relação às maneiras de melhorá -lo, o treinamento com amostras polifônicas é certamente uma possibilidade. Outra possibilidade é mudar para um filtro linear. A DFT de um som polifônico é basicamente a soma dos DFTs de cada som individual. Você deseja que uma combinação linear de entradas se torne uma combinação linear correspondente de saídas; portanto, um filtro linear é apropriado.
Aliás, por que você usa uma rede neural para isso em primeiro lugar? Parece que apenas olhar para o DFT e, digamos, a frequência máxima daria melhores resultados com mais facilidade.
Outras dicas
Anssi Klapuri é um respeitado pesquisador de áudio que publicou um método para executar a detecção de afinação em gravações polifônicas usando redes neurais.
Você pode comparar o método de Klapuri com o seu. Está totalmente descrito em sua tese de mestrado, Métodos de processamento de sinal para a transcrição automática da música. Você pode encontrar seus muitos artigos on -line ou comprar o livro dele, o que explica o algoritmo e os resultados dos testes. Sua tese de mestrado está ligada abaixo.
https://www.cs.tut.fi/sgn/arg/klap/phd/klap_phd.pdf
A detecção de pitch nas gravações polifônicas é um tópico muito difícil e contém muitas controvérsias - esteja preparado para fazer muita leitura. O link abaixo contém outra abordagem para detecção de pitch em gravações polifônicas que desenvolvi para um aplicativo gratuito chamado Jogador de pitchscope. Meu código -fonte C ++ está disponível no github.com e é referenciado no link abaixo. Uma versão executável gratuita de Jogador de pitchscope Também está disponível na web e é executado no Windows.
Eu experimentei a evolução de um CTRNN (rede neural recorrente de tempo contínuo) ao detectar a diferença entre 2 ondas senoidais. Eu tive sucesso moderado, mas nunca tive tempo de acompanhar um banco desses neurônios (ou seja, em bandas semelhantes à coclear).
Uma abordagem possível seria empregar Programação genética (GP), para gerar trechos curtos de código que detectam o tom. Dessa forma, você seria capaz de gerar uma regra para a forma como a detecção de afinação funciona, o que, esperançosamente, seria legível por humanos.