Detecção de pitch em tempo real

Eu estou tentando fazer detecção de pitch em tempo real de um usuário cantando, mas estou correndo em um monte de problemas. Eu tentei muitos methods, incluindo FFT ( FFT Problem (Retorna resultados randoms) ) e autocorrelação ( detecção de pitch de autocorrelação retorna resultados randoms com input de microfone ), mas não consigo obter nenhum método para dar um bom resultado. Alguém pode sugerir um método para acompanhamento de pitch em tempo real ou como melhorar um método que eu já tenho? Eu não consigo encontrar nenhum bom método C / C ++ para detecção de pitch em tempo real.

Obrigado,

Niall

Edit: Só para notar, eu verifiquei que os dados de input do microfone estão corretos, e que, ao usar uma onda senoidal, os resultados são mais ou menos o tom correto.

Edit: Desculpe esta é tarde, mas no momento, estou visualizando a autocolleration, tomando os valores fora da matriz de resultados, e cada índice, e plotando o índice no eixo X eo valor no eixo Y (ambos são divididos por 100000 ou algo assim, e estou usando o OpenGL), plugando os dados em um host VST e usando plugins VST não é uma opção para mim. No momento, parece apenas alguns pontos randoms. Estou fazendo isso corretamente, ou você pode, por favor, me indicar algum código para fazê-lo ou me ajudar a entender como visualizar os dados brutos de áudio e os dados de autocorrelação.

Dando um passo atrás … Para conseguir isso, você DEVE descobrir uma maneira de traçar etapas intermediárias desse processo. O que você está tentando fazer não é particularmente difícil, mas é propenso a erros e complicado. Clipping, windowing, bad wiring, aliasing, offsets de CC, leitura de canais errados, o estranho eixo de freqüência FFT, incompatibilidade de impedâncias, erros de tamanho de frame … quem sabe. Mas se você pode plotar os dados brutos e, em seguida, traçar o FFT, tudo ficará claro.

Eu encontrei várias implementações de código aberto de rastreamento de pitch em tempo real

  • O dywapitchtrack usa um algoritmo baseado em wavelets

  • Realtime C # Pitch Tracker usa uma abordagem de autocorrelação modificada

  • aubio (mencionado por piem; vários algoritmos estão disponíveis)

Há também alguns rastreadores de pitch por aí que podem não ser projetados em tempo real, mas podem ser usados ​​dessa maneira por tudo que eu sei, e também podem ser úteis como referência para comparar seu rastreador em tempo real a:

  • Praat é um pacote de código aberto usado às vezes para extração de notas por linguistas e você pode encontrar o algoritmo documentado em http://www.fon.hum.uva.nl/paul/praat.html

  • Snack e WaveSurfer também contêm um extrator de pitch

Eu sei que esta resposta não vai fazer todo mundo feliz, mas aqui vai.

Isso é difícil, muito difícil. Primeiramente, leia como muitos tutoriais, como você pode encontrar em FFT, Autocorrelação, Wavelets. Embora eu ainda esteja lutando com o DSP, obtive alguns insights dos seguintes.

https://www.coursera.org/course/audio o curso não está em andamento no momento, mas os vídeos ainda estão disponíveis.

http://miracle.otago.ac.nz/tartini/papers/Philip_McLeod_PhD.pdf tese sobre o desenvolvimento de um algoritmo de reconhecimento de pitch.

http://dsp.stackexchange.com um site inteiro dedicado ao processamento digital de sinais.

Se, como eu, você não fez matemática suficiente para seguir completamente os tutoriais, não desista, pois alguns dos diagramas e exemplos ainda me ajudaram a entender o que estava acontecendo.

Em seguida, estão os dados e testes de teste. Escreva uma biblioteca que gera arquivos de teste para usar na verificação de seu algoritmo.

1) Um super simples gerador de onda senoidal pura. Então diga que você está olhando para escrever YAT (Yet Another Tuner) e use seu gerador de seno para criar uma série de arquivos em torno de 440Hz digamos de 420-460Hz em incrementos variados e ver quão sensível e preciso é seu código. Pode resolver até 5Hz, 1Hz, ainda melhor?

2) Em seguida, atualize seu gerador de onda senoidal para que ele acrescente uma série de harmônicos mais fracos ao sinal.

3) Em seguida, há variações do mundo real sobre harmônicos. Assim, enquanto para a maioria dos instrumentos de corda, você verá uma série de harmônicos como simples simples da frequência fundamental F0, para instrumentos como clarinetes e flautas, devido à maneira como o ar se comporta na câmara, os harmônicos pares estarão ausentes ou muito fracos. E para alguns instrumentos, F0 está faltando, mas pode ser determinado a partir da distribuição dos outros harmônicos. F0 sendo o que o ouvido humano percebe como pitch.

4) Jogue em alguma distorção deliberada deslocando as frequências dos picos harmônicos para cima e para baixo de maneira irregular

O ponto é que, se você estiver criando arquivos com resultados conhecidos, é mais fácil verificar se o que você está construindo realmente funciona, obviamente.

Há também várias “bibliotecas” que contêm amostras de som. https://freesound.org da série Coursera mencionada acima. http://theremin.music.uiowa.edu/MIS.html

Em seguida, esteja ciente de que seu microfone não é perfeito e, a menos que você tenha gasto milhares de dólares, ele terá um intervalo de resposta de frequência bastante variável. Em particular, se você estiver trabalhando com notas baixas, os microfones mais baratos, leia os internos no seu PC ou telefone, terão um rolloff significativo começando em torno de 80-100Hz. Por razoavelmente bons externos você pode chegar a 30-40Hz. Vá encontrar os dados no seu microfone.

Você também pode verificar o que acontece tocando o som através dos alto-falantes e, em seguida, gravando com seu microfone favorito. Mas é claro que agora estamos falando de dois conjuntos de curvas de resposta de frequência.

Quando se trata de desempenho, há um número de bibliotecas disponíveis gratuitamente, embora esteja ciente dos vários modelos de licenciamento.

Acima de tudo, não desista depois das primeiras tentativas. Boa sorte.

Eu tive um problema semelhante com a input de microfone em um projeto que fiz há alguns anos – acabou sendo devido a um deslocamento DC.

Certifique-se de remover qualquer preconceito antes de tentar a FFT ou qualquer outro método que você esteja usando.

Também é possível que você esteja enfrentando problemas de headroom ou clipping.

Os charts são a melhor maneira de diagnosticar a maioria dos problemas com áudio.

Aqui está o código-fonte C ++ para um algoritmo incomum de dois estágios que eu criei que pode fazer Detecção de Pitch em Tempo Real em arquivos MP3 polifônicos enquanto é reproduzido no Windows. Este aplicativo gratuito ( PitchScope Player , disponível na web) é freqüentemente usado para detectar as notas de um solo de guitarra ou saxofone em uma gravação de MP3. O algoritmo é projetado para detectar o tom mais dominante (uma nota musical) em qualquer momento do tempo dentro de um arquivo de música MP3. Nota Os conjuntos são inferidos com precisão por uma mudança significativa no tom mais dominante (uma nota musical) em qualquer momento durante a gravação de MP3.

Quando uma única tecla é pressionada em um piano, o que ouvimos não é apenas uma freqüência de vibração sonora, mas um composto de múltiplas vibrações sonoras que ocorrem em diferentes freqüências relacionadas matematicamente. Os elementos desse composto de vibrações em diferentes freqüências são chamados de harmônicos ou parciais. Por exemplo, se pressionarmos a tecla C do meio no piano, as freqüências individuais dos harmônicos do compósito começarão em 261,6 Hz como a freqüência fundamental, 523 Hz seria o 2º Harmônico, 785 Hz seria o 3º Harmônico, 1046 Hz seja o 4º Harmônico, etc. Os últimos harmônicos são múltiplos inteiros da frequência fundamental, 261,6 Hz (ex: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046). Ligado na parte inferior, é um instantâneo dos harmônicos reais que ocorrem durante uma gravação polifônica em MP3 de um solo de guitarra.

Em vez de uma FFT, eu uso uma transformada DFT modificada, com espaçamento de freqüência logarítmica, para detectar primeiro essas harmônicas possíveis procurando frequências com níveis de pico (veja o diagrama abaixo). Por causa da maneira que eu recolho dados para o meu Log DFT modificado, eu não tenho que aplicar uma function de janela ao sinal, nem adicionar e sobrepor. E eu criei o DFT para que seus canais de freqüência estejam logaritmicamente localizados, a fim de alinhar diretamente com as freqüências onde as harmônicas são criadas pelas notas de uma guitarra, saxofone, etc.

Agora sendo aposentado, decidi lançar o código-fonte do meu mecanismo de detecção de pitch dentro de um aplicativo de demonstração gratuito chamado PitchScope Player . O PitchScope Player está disponível na web e você pode fazer o download do executável do Windows para ver meu algoritmo trabalhando em um arquivo mp3 de sua escolha. O link abaixo para GitHub.com levará você ao meu código fonte completo, onde você pode ver como eu detecto os harmônicos com uma transformação Logarithmic DFT personalizada e, em seguida, procurar parciais (harmônicos) cujas freqüências satisfazem a relação inteira correta que define um ‘ pitch ‘.

My Pitch Detection Algorithm é na verdade um processo de dois estágios: a) Primeiro o ScalePitch é detectado (‘ScalePitch’ tem 12 valores de pitch possíveis: {E, F, F #, G, G #, A, A #, B, C, C #, D, D #}) b) e depois de ScalePitch ser determinado, então a oitava é calculada examinando todas as harmônicas para as 4 possíveis notas de Octave-Candidato. O algoritmo é projetado para detectar o tom mais dominante (uma nota musical) em qualquer momento no tempo dentro de um arquivo MP3 polifônico. Isso geralmente corresponde às notas de um solo instrumental. Os interessados ​​no código-fonte C ++ do meu algoritmo de detecção de tom de dois estágios podem querer iniciar na function Estimate_ScalePitch () dentro do arquivo SPitchCalc.cpp no ​​GitHub.com. https://github.com/CreativeDetectors/PitchScope_Player

Abaixo está a imagem de uma DFT Logarítmica (criada pelo meu software C ++) por 3 segundos de um solo de guitarra em uma gravação polifônica de mp3. Mostra como os harmônicos aparecem para notas individuais em uma guitarra, enquanto toca um solo. Para cada nota nesta DFT logarítmica, podemos ver seus múltiplos harmônicos se estendendo verticalmente, porque cada harmônico terá a mesma largura de tempo. Depois que a oitava da nota é determinada, então sabemos a frequência do fundamental.

insira a descrição da imagem aqui

Confira aubio e a biblioteca de código aberto que inclui vários methods de última geração para rastreamento de pitch.

Dê uma olhada neste aplicativo de amostra:

http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx

Eu percebo que o aplicativo está em C # e você precisa de C ++, e percebo que isso é .Net / Windows e você está em um mac … Mas eu percebi que sua implementação de FFT pode ser um ponto de referência inicial. Tente comparar sua implementação de FFT com a dele. (Ele é a versão iterativa e abrangente da FFT de Cooley-Tukey). Eles são semelhantes?

Além disso, o comportamento “random” que você está descrevendo pode ser porque você está pegando dados retornados por sua placa de som diretamente sem montar os valores da matriz de bytes corretamente. Você pediu a sua placa de som para testar 16 valores de bit e, em seguida, deu a ela uma matriz de bytes para armazenar os valores? Nesse caso, lembre-se de que dois bytes consecutivos no array retornado formam uma amostra de áudio de 16 bits.

O código Java para um detector real em tempo real está disponível em http://code.google.com/p/freqazoid/ .

Funciona razoavelmente bem em qualquer computador que execute Java em tempo real pós-2008. O projeto foi descartado e pode ser retirado por qualquer parte interessada. Contacte-me se você quiser mais detalhes.

Eu fiz uma pergunta semelhante aqui:

Algoritmo em tempo real C / C ++ / Obj-C para verificar a nota (não o tom) da input vocal

EDITAR:

O Performous contém um módulo C ++ para detecção de pitch em tempo real

Também algoritmo Yin Pitch-Tracking

Você pode adaptar qualquer coisa de sintonizadores de instrumento? Meu sintonizador de guitarra deliciosamente compacto é capaz de detectar o tom das cordas muito bem. Eu vejo essa referência a um afinador de piano que explica um algoritmo até certo ponto.