Como faço para processar a entrada de microfone em tempo real?
-
06-07-2019 - |
Pergunta
Estou começando a criar uma prova de conceito para uma ideia que eu tenho, e neste momento, eu preciso de alguma orientação a respeito de como eu deveria começar.
Eu preciso provar a entrada de microfone, e processo esse sinal em tempo real (pense Auto-Tune, mas trabalhar ao vivo), em oposição a "gravação" por um tempo.
O que estou fazendo é "tipo de" a "entrada de microfone para conversor de MIDI", por isso precisa de responder muito rápido.
Eu investiguei um pouco on-line, e, aparentemente, o caminho a percorrer é ou DirectSound ou o * funções API WaveIn. Agora, de acordo com o que li, a APIs WaveIn vai deixe-me encher um buffer de um determinado tamanho, o que é bom para a gravação e pós-processamento, mas eu estou querendo saber ... Como posso fazer o processamento em tempo real?
eu uso 10ms buffers e manter um 50ms circulares ou 100ms gama mim, e eu recebo uma função que desencadeia a análise de cada 10ms? (Que tem acesso às últimas 100ms de entrada, dos quais apenas 10ms são novos)
Estou faltando alguma coisa aqui?
Além disso, como isso é feito com DirectSound? Será que ela me deu nenhuma capacidades melhoradas ao longo dos APIs regulares Win32?
Solução
Ambos DirectSound ea API de onda, finalmente, dar-lhe buffers preenchido com dados de áudio que você pode processar. O tamanho desses buffers pode ser variada, mas realisticamente você vai precisar para manter a latência para menos de 10ms para processamento em tempo real útil. Este meio de processamento de dados dentro de 10ms de que chegam no buffer, menos o tempo entre ele chegar ao hardware de áudio e chegar ao tampão, o que vai depender do motorista. Por esta razão eu recomendo não mais processamento do que 5 mS de dados ao mesmo tempo.
A principal diferença arquitetônica entre os dois é que, com DirectSound você alocar um buffer circular que é então preenchido pelo driver de áudio DirectSound enquanto a API do Google Wave tem uma fila de WAVEHDR buffers pré-alocados, que são preenchidos, voltou para o aplicativo e então reciclado. Existem vários métodos de notificação para ambas as APIs, tais como mensagens de janela ou eventos. No entanto, para baixa latência processamento provavelmente é aconselhável manter um fio de streaming dedicado e esperar por novos dados para chegar.
Por várias razões Eu recomendaria DirectSound sobre a API de onda para um novo desenvolvimento -. Ele certamente vai ser mais fácil de alcançar menor latência
Independentemente do método escolhido para fazer a captura, uma vez que você tem seus dados você simplesmente passá-lo para o seu algoritmo de processamento e esperar o próximo buffer para estar pronto. Contanto que você pode processar os dados mais rápido do que ele chega, então você vai ter a sua (pseudo) análise em tempo real.
Há também APIs alternativas que podem ser mais adequado. Ter um olhar para ASIO , Kernel Streaming (para XP only - Eu não me incomoda) e, de novo no Vista, o core audio APIs .
Outras dicas
Aqui está um link para um programa (com fonte) em C ++ que faz análise de frequência em tempo real.