Как мне обработать вход микрофона в режиме реального времени? - PullRequest
3 голосов
/ 03 ноября 2008

Я начинаю создавать доказательство концепции для моей идеи, и на данный момент мне нужно некоторое руководство относительно того, как я должен начать.

Мне нужно сэмплировать вход микрофона и обрабатывать этот сигнал в режиме реального времени (подумайте о автонастройке, но работайте вживую), в отличие от «записи» некоторое время.

То, что я делаю, это "своего рода" микрофонный вход в MIDI-конвертер, поэтому он должен реагировать довольно быстро.

Я немного исследовал в Интернете, и, видимо, можно использовать функции DirectSound или API WaveIn *. Теперь, согласно тому, что я прочитал, API-интерфейсы WaveIn позволят мне заполнить буфер определенного размера, который подходит для записи и последующей обработки, но мне интересно ... Как мне выполнять обработку в реальном времени?

Использую ли я буферы 10 мс и сохраняю круговой массив 50 мс или 100 мс сам, и получаю функцию, которая запускает анализ каждые 10 мс? (который имеет доступ к последним 100 мс ввода, из которых только 10 мс являются новыми)

Я что-то здесь упускаю?

Кроме того, как это делается с DirectSound? Это дает мне какие-то улучшенные возможности по сравнению с обычными Win32 API?

Ответы [ 2 ]

8 голосов
/ 03 ноября 2008

И DirectSound, и Wave API в конечном итоге предоставляют вам буферы, заполненные аудиоданными, которые вы можете обрабатывать. Размер этих буферов может варьироваться, но реально вам нужно будет поддерживать задержку менее 10 мс для полезной обработки в реальном времени. Это означает обработку данных в течение 10 мс после их поступления в буфер, за вычетом времени между поступлением в звуковое оборудование и получением в буфер, что будет зависеть от драйвера. По этой причине я бы рекомендовал обрабатывать не более 5 мс данных одновременно.

Основное архитектурное различие между ними заключается в том, что с DirectSound вы выделяете кольцевой буфер, который затем заполняется аудио драйвером DirectSound, тогда как Wave API берет очередь предварительно выделенных буферов WAVEHDR, которые заполняются, возвращаются приложению и затем переработано. Для обоих API существуют различные методы уведомления, такие как оконные сообщения или события. Однако для обработки с малой задержкой, вероятно, целесообразно поддерживать выделенный поток потоков и ждать поступления новых данных.

По разным причинам я бы порекомендовал DirectSound поверх Wave API для новых разработок - конечно, будет легче добиться меньшей задержки.

Какой бы метод вы ни выбрали для захвата, когда у вас есть данные, вы просто передаете их в свой алгоритм обработки и ждете готовности следующего буфера. Пока вы можете обрабатывать данные быстрее, чем они поступают, у вас будет (псевдо) анализ в реальном времени.

Существуют также альтернативные API, которые могут быть более подходящими. Взгляните на ASIO , потоковую передачу ядра (только для XP - я бы не стал беспокоиться) и, впервые в Vista, Core Audio APIs .

1 голос
/ 03 ноября 2008

Вот ссылка на программу (с источником) на C ++, которая выполняет анализ частоты в реальном времени.

...