Detecção de pitch humano em tempo real

11

Estou tentando implementar um jogo de canto que analise a entrada bruta do microfone e diga ao jogador o quão bom ele está cantando. Isso precisa ser feito em tempo real.

Eu me deparei com muitos tópicos fazendo a mesma pergunta, mas ainda não terminei a tarefa, provavelmente devido à minha falta de experiência no campo e à pouca experiência em matemática. Eu implementei um algoritmo baseado no artigo da alteração de pitch do site DSPDimension: http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/

Extraio a verdadeira frequência e magnitude, exatamente como o artigo explica, mas não sei encontrar a frequência fundamental com isso. Tentei obter a lixeira com maior magnitude, mas isso só me dá resultados corretos para sinais de tom mais alto, não importa qual fator de superamostragem eu uso, ainda recebo dados ruins para sinais de baixa frequência. Essa abordagem está completamente errada ou estou no caminho certo, mas estou perdendo alguma coisa?

Desde já, obrigado,

EDIT: Eu esqueci de mencionar que só estou interessado na aula de pitch, então está tudo bem se o fundamental estiver faltando, mas eu tenho um tom forte na amostra.

EDIT2: Obrigado a todos, acabei de terminar uma versão do algoritmo que funciona como um encanto. O problema da estimativa do tom baixo foi devido ao meu teste de entrada. Quando cantei a nota, ela combinou corretamente. Além disso, estou considerando todas as harmônicas agora, não apenas o pico mais alto.

Felipe Lira
fonte
A Wikipedia tem algumas informações.
Emre

Respostas:

9

Tentei obter a lixeira com maior magnitude, mas isso só me dá resultados corretos para sinais de tom mais alto, não importa qual fator de superamostragem eu uso, ainda recebo dados ruins para sinais de baixa frequência.

Isso ocorre porque os harmônicos são maiores que o fundamental. Plote seu espectro e você verá. Um método melhor para encontrar o verdadeiro fundamento é a autocorrelação. Então você está "deslizando" a forma de onda para além de si mesma e encontra atrasos nos quais a forma da onda se alinha.

http://www.phon.ucl.ac.uk/courses/spsci/matlab/lect10.html

Você realmente quer que eles cantem a nota exata ou está tudo bem se eles cantam uma oitava acima ou abaixo, dependendo do registro de voz?

endólito
fonte
Você está certo, eu esqueci de mencionar que estou interessado apenas na aula de pitch. Estou usando este site para testar minha ferramenta: seventhstring.com/tuningfork/tuningfork.html . Para a entrada de A (220Hz), retorna E (660Hz) como a classe de afinação encontrada. Dei uma olhada no sprectum e 220Hz está realmente lá, mas com uma magnitude menor que 660Hz. Depois de filtrar valores abaixo de uma magnitude mínima e frequências de limite na minha faixa desejada, o sprectum que obtive disso tem 4 picos. [pico, mag] = [220, 0,0203], [618, 0,0142], [660, 0,0668], [703, 0,0497].
Felipe Lira
Acabei de pensar que talvez eu devesse levar em consideração o deslocamento de fase enquanto calculava a magnitude, exatamente como estou fazendo para obter a verdadeira frequência. Isso faz sentido? O que eu quero dizer é que, se eu tiver um deslocamento de fase de aproximadamente 90º para uma posição, o "pico" seria na magnitude 0, não é?
Felipe Lira
@elipedrl: Então você está basicamente escrevendo um afinador de violão. :) Pelo que entendi, eles passam o filtro passa-baixo para limpar a forma da onda e depois contam picos para obter o tom. electronicdesign.com/article/articles/... aboutmicrocontroller.blogspot.com/2008/04/... Há maneiras melhores, no entanto, se você estiver indo para a exatidão, em vez de baixo preço gist.github.com/255291
endolith
@elipedrl: O deslocamento de fase de uma posição deve ser irrelevante para o tom. Cada compartimento é um número complexo e você está interessado no valor absoluto ou na magnitude desse número. en.wikipedia.org/wiki/Absolute_value#Complex_numbers
endolith 27/03
1
e se você tiver duas FFTs mais curtas por algum motivo (latência, quantidade de tempo etc.), um cálculo de fase do codificador de voz é menos computado do que fazer outra FFT mais longa e interpolar isso.
hotpaw2
6

Sim, o uso de um estimador de frequência de pico para afinação está errado. O pitch é um fenômeno psicoacústico, portanto a detecção ou estimativa do pitch é diferente da estimativa da frequência. Existem muitos métodos de estimativa de pitch apresentados em respostas anteriores para perguntas semelhantes aqui. Há mais de 1 para escolher.

Aqui está um: /programming/4227420/matlab-missing-fundamental-from-an-fft/4231322#4231322 e outro: Dicas para melhorar a detecção de afinação

ADICIONADO Nº 1: Perguntas semelhantes a essa são feitas com tanta frequência que escrevi uma postagem de blog mais longa sobre o tópico: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft- frequency.html

hotpaw2
fonte
Atualizei a pergunta com as informações de que estou interessado apenas na aula de pitch. Eu realmente espero que a FFT com um pós-processamento seja suficiente para isso, estou muito atrasada e mudar a abordagem seria horrível para mim.
Felipe Lira
@elipedrl: FFT deve funcionar então. Obter vários picos e selecionar um deles de maneira inteligente deve ser bom o suficiente. Lembre-se de que os picos válidos estarão próximos de (mas não exatamente) múltiplos inteiros do fundamental, enquanto os picos falsos não. Você deve evitar a seleção de picos espúrios e a seleção do 3º harmônico, etc., que não estejam a uma oitava da nota que você está procurando.
endolith 27/03
É possível, embora talvez improvável, que nenhum pico de frequência esteja na frequência do tom musical. Algumas vogais masculinas podem estar próximas disso, restando apenas altas conotações após a filtragem pelo formante da vogal.
hotpaw2
O método Harmonic Product Spectrum pode ser adequado para encontrar uma estimativa de menor denominador comum do LCD de um grupo de picos espectrais, pós-processamento dos resultados iniciais da FFT.
hotpaw2