Detecção de pico em código performático
-
27-09-2019 - |
Pergunta
Eu estava procurando implementar a detecção de arremesso de voz no iPhone usando o método HPS. Mas os tons detectados não são muito precisos. Performous Faz um trabalho decente de detecção de arremesso.
Eu olhei através do código, mas não entendi completamente a teoria por trás dos cálculos. Eles usam FFT e encontram os picos. Mas a parte em que eles usam a fase da saída da FFT me confundiu. Eu sou que eles usam algumas heurísticas para frequências de voz.
Então, alguém poderia explicar o algoritmo usado no Performous para detectar o tom?
Solução
Performous] [1] extrai a inclinação do microfone. Além disso, o código é de código aberto. Aqui está uma descrição do que o algoritmo faz, do cara que o codificou (Tronic no irc.freenode.net#performous).
- Entrada PCM (com buffer)
- FFT (1024 amostras por vez, remova 200 amostras da frente do buffer depois)
- Método de reatribuição (contra a FFT anterior que foram 200 amostras anteriormente)
- Filtragem de picos (esta parte pode ser feita muito melhor ou até deixada de fora)
- Combinando picos em conjuntos de harmônicos (chamamos a combinação de tom)
- Filtragem temporal de tons (atualize o conjunto de tons detectados anteriormente, em vez de simplesmente usar os recém -detectados)
- Escolha o melhor tom vocal (limites de frequência, ponderação, também podem usar a matriz harmônica, mas acho que não fazemos)
Eu ainda não consegui dessas informações para descobrir e implementá -las. Se alguém gerenciar isso, poste seus resultados aqui e comente esta resposta para que me notifique.
A tarefa seria criar um invólucro C ++ mínimo em torno deste código.