Как контролировать микрофон на наличие шума? - PullRequest
6 голосов
/ 08 января 2009

Я пытаюсь найти алгоритм, чтобы определить, когда пользователь дует в микрофон (например, Ninentdo DS или iPhone) на устройстве WM6 с C #.

Я думал использовать Waveform для чтения с микрофона в режиме реального времени в небольшой буфер, но я немного растерялся, как распознать дующий звук, наверное, он звучит как белый шум. У кого-нибудь есть идеи, как это сделать?

Любая помощь будет принята с благодарностью.

Ответы [ 5 ]

4 голосов
/ 08 января 2009

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

Это не тривиальная задача, но, поскольку большая часть записи и математической работы выполнена, вы, вероятно, можете заставить ее работать без особых проблем.

3 голосов
/ 08 января 2009
Ответ

sthg упоминает искажение как вероятный результат удара в микрофон. Я только что провел быструю проверку, и моя запись обдува (на дешевом микрофоне) показала большое количество сэмплов с минимальными и максимальными значениями (например, 32767 и -32768 в WAV-файле 16 бит на сэмпл), Похоже, плоская вершина была применена к каждому из пиков. Очень простой способ обнаружить звук выдувания может состоять в том, чтобы просто подсчитать все сэмплы, которые имеют минимальное / максимальное значения, и если они представляют более 5% от общего (или некоторого другого порога), предположите, что происходит дуть.

3 голосов
/ 08 января 2009

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

Мне пришлось делать подобный проект несколько лет назад, и я просто искал пики громкости, значительно превышающие обычные уровни речи. Работал нормально.

1 голос
/ 14 февраля 2009

Я не смотрел на спектр этого, но я думаю, что вы должны увидеть ограниченный по полосе спектр шума с большей энергией ниже нескольких сотен Гц. Это означает, что вам не требуется полная БПФ звуковой полосы пропускания, а 16K точек - это излишне. Даже на 256-точечном БПФ в небольшой полосе пропускания вы сможете отличить шум от дутого микрофона от речи.

1 голос
/ 08 января 2009

Это не совсем то же самое, но вот мой ответ на вопрос об обнаружении появления заметки:

Обнаружение появления заметки

Ответ описывает подход, основанный на повышении уровня сигнала выше заданного порогового значения. Этот подход будет работать, чтобы обнаружить дующий шум, хотя он также вообще будет реагировать на любой шум, поэтому разговор и т. Д. Также вызовут его.

Вы могли бы использовать FFT, но я думаю, что это будет слишком медленно для использования в реальном времени, особенно на устройстве с Windows Mobile (хотя это может быть достаточно быстро). Тем не менее, шум от дуя вряд ли будет иметь доминирующую частоту, если только воздуходувка не свистит конкретную ноту. Если БПФ достаточно быстр, вы, возможно, захотите поискать шумы, которые не имеют доминирующей частоты (вы могли бы предположить, что что-либо с доминирующей частотой или частотами было речью или каким-либо инструментом) и которые были бы сильно взвешенными к верхнему концу звукового диапазона (выше 10000 Гц или около того).

...