Estou trabalhando em um programa de afinação de piano e parte dele requer detecção de afinação em tempo real. Aqui está o esquema que tenho até agora, que funciona até certo ponto, mas provavelmente poderia usar algum refinamento.
Estou capturando áudio PCM mono, 44,1kHz, 16 bits em pedaços de 2 ^ 14 amostras. Combino as 4 últimas amostras em um buffer de 2 ^ 16 comprimentos, aplico uma janela Hann ao buffer e execute uma FFT nele. Depois, agrupo os resultados da FFT em duas resoluções. Primeiro, agrupo em 200 buckets e, em seguida, corro o algoritmo de detecção de pitch HPS nessa granularidade. Não preciso ter uma frequência exata aqui, só quero chegar perto. Então, eu faço o bucket em 12000 buckets, o que me dá 1 centavo de resolução de 10Hz a 10kHz. Depois que conheço uma frequência aproximada do algoritmo HPS de 200 bin, procuro um pico no intervalo da caixa de 12000 bin para obter uma frequência mais exata.
Isso parece funcionar bem para as notas no meio do teclado. O que acontece com as notas baixas é de cerca de 1,5s de identificação incorreta da nota, como geralmente a 2ª ou a 3ª parcial da nota real e, em seguida, uma identificação correta da nota.
Em todas as parcelas espectrais que criei para ver o que está acontecendo, há mais largura nos picos que eu esperaria. Essa largura é visualmente um tanto consistente da caixa de 200 a 12000 caixas. Eu esperava que os picos fossem mais estreitos no estojo de 200 caixas.
Portanto, o processamento de sinal é novo para mim; portanto, pode haver problemas que eu não gostaria de perguntar, mas em termos de perguntas específicas, os tamanhos das amostras são suficientes para esta tarefa? Hann é a escolha certa da janela? Devo suavizar os dados também antes da FFT? Qual é a sensibilidade do HPS ao número de compartimentos? Eu estava pensando que, se eu usasse muitas caixas, a desarmonicidade talvez não fizesse as partes parciais se sobreporem aos seus fundamentos com a abordagem simples do algoritmo HPS de dividir por 2, 3, 4, etc.
Respostas:
Semelhante a este tópico:
Existe um algoritmo para encontrar uma frequência sem DFT ou FFT?
A FFT não é uma maneira particularmente eficiente de criar um sintonizador. Métodos melhores (e mais baratos) incluem correlação automática, loops bloqueados em fases e loops bloqueados por atraso, etc.
Um exemplo é usar o rastreamento de máximos e mínimos locais para aprimorar a freqüência fundamental e, em seguida, usar um oscilador local e um loop de fase para rastrear essa frequência com precisão. Isso pode rastrear um elemento fundamental em movimento durante o ajuste de forma rápida, contínua e com grande precisão, mesmo se a frequência for baixa e se o fundamental for fraco.
fonte
Uma pesquisa por 'software de afinação de piano' ou itens semelhantes produzirá um grande número de hits - alguns bons, outros não tão bons.
Todo tipo de instrumento musical possui características acústicas / físicas / ambientais únicas que afetam seu som. E isso pode ficar complicado, como sugerem milhares de livros e trabalhos de pesquisa (por exemplo: tonalidade, características de ataque / decaimento, desarmonicidade, etc.).
A detecção de pitch é, por si só, um campo abrangente. O seguinte é apenas uma pequena fração do que está disponível: artigo de visão geral 1 e de câmbio pilha pós e artigo de visão geral 2
Quanto às suas perguntas específicas: 1) o tamanho da amostra parece um exagero - dependendo do SNR e da estabilidade da forma de onda, você pode obter precisão de alta frequência usando outros métodos usando menos ciclos. (alguns métodos são baseados na FFT). E você pode capturar ataques / decaimentos com um longo tempo de amostragem, 2) qualquer janela que não seja retangular aumentará a largura do feixe no domínio da frequência, mas isso não significa que você não deve usar um - Hann parece comum com o HPS , pelo que vi, 3) conforme observado no primeiro link acima, o HPS não funciona muito bem em baixa frequência e a desarmonicidade o afetará nas cordas mais baixas. Quanto ao seu método geral, sem ter que escrever muitas páginas, só posso dizer que o faria de maneira diferente, dependendo da faixa de frequência e dos harmônicos com os quais estava lidando.
fonte
Outra resposta sugere PLL. Eu acho que você deve ficar longe da PLL: a maioria da literatura sobre rastreamento de afinação se concentra na correlação automática (procure por "Rastreamento de afinação YIN" - YIN é um algoritmo moderno de rastreamento de afinação baseado na correlação automática) e FFT. Eu acredito PLL é mais adequado para rastreamento de pequenas flutuações na freqüência, como com rádio.
A correlação automática é um bom lugar para começar. É rápido, eficiente e preciso. No entanto, existem truques para tornar a FFT muito precisa e rápida (a maioria das técnicas que usam a FFT apenas analisa a magnitude, mas você também pode usar as informações de fase); portanto, se você estiver familiarizado com as FFTs, também poderá usar essa técnica.
Se você usar alguma dessas técnicas, sugiro pré-filtragem com uma passagem baixa para reduzir harmônicos e focar no fundamental. Com a FFT, você pode, em vez disso, ou além disso, usar truques como analisar o primeiro máximo local.
Esse pode ser um bom ponto de partida para a filtragem e assim por diante. Também fornecerá algumas dicas sobre como evitar muito trabalho, além de links para o código-fonte: http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html
Este livro possui seções que explicam o YIN e o FFT usando informações de fase: http://www.amazon.com/DAFX-Digital-Udo-ouml-lzer/dp/0470665998
Finalmente, você terá que entender as especificidades dos pianos. Não tenho certeza se o próprio afinador precisa fazer algo WRT especial, por exemplo, afinação esticada, ou se isso depende da pessoa que afina o piano, mas você precisará entender pelo menos essas coisas. Outro pôster sugeriu a observação de harmônicos desafinados, mas a questão principal é identificar e afinar o fundamental, para que os harmônicos desafinados não sejam importantes, desde que você os identifique adequadamente.
fonte
Os grandes picos que você vê podem ser o resultado de fenômenos físicos, não um artefato de processamento de sinal. Em geral, picos estreitos em um resultado de FFT representam um senoide não modulado exatamente periódico na janela no domínio do tempo. Mas as vibrações das cordas do piano não são tão estacionárias. Eles evoluem com o tempo, criando uma modulação perceptível.
Vários efeitos: várias cordas de piano por nota trocam energia através da mesa de som; a energia total da vibração decairá com o tempo; os modos de vibração podem ser levemente inarmônicos; a frequência exata da vibração de cada modo (harmônico) pode mudar com o decaimento da amplitude devido à rigidez e diâmetro da corda diferentes de zero; e cada harmônico pode se deteriorar a uma taxa diferente etc.
Você pode ter que decidir qual dessas múltiplas modulações deseja chamar de "afinação" (os livros de audiologia podem ajudar) e encontrar um método para rastrear melhor dentro do "pico amplo" da FFT.
fonte
Com as notas mais baixas dos pianos, especialmente nas verticalidades, o espectro tende a ser esticado (a distância entre o tom fundamental e o primeiro som é um pouco mais do que uma oitava, etc.). É isso que dá aos pianos seu som percussivo, a nota mais baixa nas colunas verticais mais antigas costuma parecer mais um baque do que uma nota e, pelo que entendi, é por isso que as colunas verticais têm seu som tonk honky percussivo. Devido a esses bons afinadores de piano (as pessoas que não são algoritmos) ajustam os pianos com tons mais baixos do que o fundamental para as notas mais baixas, o ouvido humano tende a se concentrar na interação dos tons mais baixos para essas notas. O alongamento da série harmônica também pode ser a causa dos picos mais amplos do que o esperado no espectro.
fonte