Domanda

Sto iniziando a creare una prova di concetto per un'idea che ho, e a questo punto, ho bisogno di una guida su come dovrei iniziare.

Devo campionare l'ingresso del microfono ed elaborare quel segnale in tempo reale (pensa Auto-Tune, ma lavorando dal vivo), al contrario di "registrare". per un po '.

Quello che sto facendo è un tipo di " un "ingresso mic al convertitore MIDI", quindi deve rispondere abbastanza velocemente.

Ho studiato un po 'online e apparentemente la strada da percorrere sono le funzioni API DirectSound o WaveIn *. Ora, secondo quanto ho letto, le API WaveIn mi permetteranno di riempire un buffer di una certa dimensione, il che va bene per la registrazione e la post-elaborazione, ma mi chiedo ... Come posso fare l'elaborazione in tempo reale?

Uso i buffer da 10 ms e mantengo un array circolare da 50 ms o 100 ms e ottengo una funzione che avvia l'analisi ogni 10 ms? (che ha accesso agli ultimi 100ms di input, di cui solo 10ms sono nuovi)

Mi sto perdendo qualcosa qui?

Inoltre, come si fa con DirectSound? Mi offre funzionalità migliorate rispetto alle normali API Win32?

È stato utile?

Soluzione

Sia DirectSound che l'API Wave alla fine ti forniscono buffer pieni di dati audio che puoi elaborare. La dimensione di questi buffer può essere variata, ma realisticamente sarà necessario mantenere la latenza a meno di 10 ms per un'utile elaborazione in tempo reale. Ciò significa che l'elaborazione dei dati entro 10 mS arriva dal buffer, meno il tempo che intercorre tra l'arrivo dell'hardware audio e il raggiungimento del buffer, che dipenderà dal driver. Per questo motivo, consiglierei di non elaborare più di 5mS di dati alla volta.

La principale differenza architettonica tra i due è che con DirectSound si alloca un buffer circolare che viene quindi riempito dal driver audio DirectSound mentre l'API Wave esegue una coda di buffer WAVEHDR pre-allocati che vengono riempiti, restituiti all'app e quindi riciclato. Esistono vari metodi di notifica per entrambe le API, come messaggi finestra o eventi. Tuttavia, per l'elaborazione a bassa latenza è probabilmente consigliabile mantenere un thread di streaming dedicato e attendere l'arrivo di nuovi dati.

Per vari motivi, consiglierei DirectSound sull'API Wave per nuovi sviluppi: sarà sicuramente più facile ottenere una latenza inferiore.

Qualunque metodo tu scelga di eseguire l'acquisizione, una volta che hai i tuoi dati li devi semplicemente passare al tuo algoritmo di elaborazione e attendere che il prossimo buffer sia pronto. Finché puoi elaborare i dati più velocemente di quanto arrivano, avrai la tua (pseudo) analisi in tempo reale.

Esistono anche API alternative che potrebbero essere più adatte. Dai un'occhiata a ASIO , Kernel Streaming (solo per XP - non mi preoccuperei) e, nuove in Vista, le API audio principali .

Altri suggerimenti

Ecco un link a un programma (con sorgente) in C ++ che fa analisi della frequenza in tempo reale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top