Pregunta

Estoy empezando a crear una prueba de concepto para una idea que tengo, y en este punto, necesito alguna orientación sobre cómo debería comenzar.

Necesito muestrear la entrada del micrófono y procesar esa señal en tiempo real (piense en Auto-Tune, pero trabajando en vivo), en lugar de "grabar". por un tiempo.

Lo que estoy haciendo es "tipo de" una entrada de micrófono al convertidor MIDI, por lo que debe responder bastante rápido.

Investigué un poco en línea, y aparentemente el camino a seguir es DirectSound o las funciones API WaveIn *. Ahora, según lo que leí, las API de WaveIn me permitirán llenar un búfer de cierto tamaño, lo cual está bien para la grabación y el procesamiento posterior, pero me pregunto ... ¿Cómo hago el procesamiento en tiempo real?

¿Utilizo búferes de 10 ms y mantengo una matriz circular de 50 ms o 100 ms, y obtengo una función que activa el análisis cada 10 ms? (que tiene acceso a los últimos 100 ms de entrada, de los cuales solo 10 ms son nuevos)

¿Me estoy perdiendo algo aquí?

Además, ¿cómo se hace esto con DirectSound? ¿Me da alguna capacidad mejorada sobre las API normales de Win32?

¿Fue útil?

Solución

Tanto DirectSound como Wave API finalmente le proporcionan buffers llenos de datos de audio que puede procesar. El tamaño de estos búferes puede variar, pero de manera realista deberá mantener la latencia a menos de 10 ms para un procesamiento útil en tiempo real. Esto significa procesar datos dentro de los 10 mS de su llegada al búfer, menos el tiempo transcurrido entre que llega al hardware de audio y llega al búfer, que dependerá del controlador. Por esta razón, recomendaría procesar no más de 5 ms de datos a la vez.

La principal diferencia arquitectónica entre los dos es que con DirectSound se asigna un búfer circular que luego se llena con el controlador de audio DirectSound, mientras que la API Wave toma una cola de búferes WAVEHDR preasignados que se llenan, se devuelven a la aplicación y Luego reciclado. Existen varios métodos de notificación para ambas API, como mensajes de ventana o eventos. Sin embargo, para el procesamiento de baja latencia, probablemente sea aconsejable mantener un hilo de transmisión dedicado y esperar a que lleguen nuevos datos.

Por varias razones, recomendaría DirectSound sobre la API Wave para nuevos desarrollos; sin duda será más fácil lograr una latencia más baja.

Cualquiera que sea el método que elija para realizar la captura, una vez que tenga sus datos, simplemente páselos a su algoritmo de procesamiento y espere a que el próximo búfer esté listo. Mientras pueda procesar los datos más rápido de lo que llegan, tendrá su (pseudo) análisis en tiempo real.

También hay API alternativas que pueden ser más adecuadas. Eche un vistazo a ASIO , Kernel Streaming (solo para XP, no me molestaría) y, nuevo en Vista, las Core Audio API .

Otros consejos

Aquí hay un enlace a un programa (con fuente) en C ++ que hace análisis de frecuencia en tiempo real.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top