Как мне обработать вход микрофона в реальном времени?

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

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

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

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

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

Я что-то упустил?

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


person Daniel Magliola    schedule 03.11.2008    source источник


Ответы (1)


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

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

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

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

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

person Stu Mackellar    schedule 03.11.2008
comment
Хорошее объяснение, но я не уверен, почему вы думаете, что DirectSound лучше, чем waveIn * для задержки. В обоих подходах задержка зависит исключительно от того, как долго вы записываете в буфер перед его обработкой. Однако я бы также порекомендовал DirectSound, учитывая, что это более современный API. Я не могу поверить, что waveIn * и waveOut * все еще существуют (и они даже доступны в Windows Mobile, что поразило меня, когда я обнаружил их). - person MusiGenesis; 28.07.2009
comment
Насколько я понимаю, причина того, что DirectSound имеет потенциально более низкую задержку, заключается в том, что он может делать прямую копию DMA в пользовательский буфер - API Wave этого не делает и требует еще одну копию между ними. Кроме того, при использовании Wave API вы не можете получить исключительный контроль над оборудованием, что может означать, что kmixer начинает преобразование частоты дискретизации или преобразование битовой глубины. Вся эта дополнительная обработка складывается, но, конечно, она может быть незначительной по сравнению с внутренней задержкой буферизации. Эти факторы также могут измениться в зависимости от версии ОС. - person Stu Mackellar; 28.07.2009