Синхронизация в C # аудио анализ в реальном времени - PullRequest
3 голосов
/ 12 августа 2009

Я пытаюсь определить «ударов в минуту» из звука в реальном времени в C #. Это не музыка, которую я обнаруживаю, а постоянный постукивающий звук. Моя проблема заключается в определении времени между этими нажатиями, чтобы я мог определить «количество нажатий в минуту», которое я пытался использовать с помощью класса WaveIn.cs, но я не совсем понимаю, как происходит его выборка. Я не получаю установленное количество образцов в секунду для анализа. Наверное, я просто не знаю, как читать точное количество сэмплов в секунду, чтобы узнать время между сэмплами.

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

Ответы [ 3 ]

3 голосов
/ 12 августа 2009

Я не уверен, какой класс WaveIn.cs вы используете, но обычно с кодом, который записывает аудио, вы либо A) указываете код, чтобы начать запись, а затем в какой-то более поздний момент вы говорите коду остановиться, и вы получаете массив (обычно типа short []), который содержит данные, записанные за этот период времени; или B) указать коду начать запись с заданным размером буфера, и при заполнении каждого буфера код выполняет обратный вызов метода, который вы определили, со ссылкой на заполненный буфер, и этот процесс продолжается до тех пор, пока вы не сообщите ему остановить запись.

Предположим, что ваш формат записи составляет 16 бит (или 2 байта) на семпл, 44100 семплов в секунду и моно (1 канал). В случае (A), допустим, вы начинаете запись, а затем прекращаете запись ровно через 10 секунд. В результате вы получите короткий массив [] длиной 441 000 (44 100 x 10). Я не знаю, какой алгоритм вы используете для обнаружения «отводов», но допустим, что вы обнаруживаете отводы в этом массиве в элементе 0, элементе 22,050, элементе 44,100, элементе 66,150 и т. Д. Это означает, что вы находите метки каждый. 5 секунд (потому что 22 050 - это половина из 44 100 выборок в секунду), что означает, что у вас есть 2 нажатия в секунду и, следовательно, 120 ударов в минуту.

В случае (B) предположим, что вы начинаете запись с фиксированным размером буфера в 44 100 сэмплов (примерно 1 секунда). По мере поступления каждого буфера вы найдете метки в элементе 0 и в элементе 22,050. По той же логике, что и выше, вы вычислите 120 ударов в минуту.

Надеюсь, это поможет. При общем обнаружении ударов лучше всего записывать в течение относительно длительного времени и считать удары по большому массиву данных. Попытка оценить «мгновенный» темп более трудна и подвержена ошибкам, точно так же, как и оценка высоты записи в реальном времени сложнее, чем при записи полной ноты.

2 голосов
/ 12 августа 2009

Я думаю, вы можете путать сэмплы с "кранами".

Образец - это число, представляющее высоту звуковой волны в данный момент времени. Типичный волновой файл может быть сэмплирован 44 100 раз в секунду, поэтому если у вас есть два канала для стерео, у вас будет 88 200 шестнадцатибитных чисел (выборок) в секунду.

Если вы возьмете все эти числа и нанесете на них график, вы получите что-то вроде этого:

alt text
(источник: vbaccelerator.com )

What you are looking for is this peak ------------^

Это кран.

1 голос
/ 12 августа 2009

Предполагая, что мы говорим о том же WaveIn.cs, конструктор WaveLib.WaveInRecorder принимает объект WaveLib.WaveFormat в качестве параметра. Это позволяет вам установить аудио формат, т.е. частота дискретизации, битовая глубина и т. д. Просто отсканируйте аудиосэмплы на наличие пиков или, тем не менее, вы обнаруживаете «постукивания» и запишите среднее расстояние в сэмплах между пиками.

Поскольку вы знаете частоту дискретизации аудиопотока (например, 44100 выборок / секунду), возьмите среднее пиковое расстояние (в выборках), умножьте на 1 / (частота выборок), чтобы получить время (в секундах) между нажатиями разделите на 60, чтобы получить время (в минутах) между нажатиями, и инвертируйте, чтобы получить количество нажатий в минуту.

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...