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

StackOverflow https://stackoverflow.com/questions/258551

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top