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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top