Обнаружение ударов в минуту в шумном файле .wav

12

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

Я попытался найти предмет, но результаты довольно плохие из-за большого количества программного обеспечения, связанного с mp3, для анализа и создания идентификатора отпечатка пальца. Никто из них не предоставляет информацию о том, как на самом деле это сделать.

Я знаю алгоритмы для удаления шума, но это все еще оставляет меня с проблемой обнаружения BPM. И в зависимости от того, как решается проблема BPM, возможно, мне даже не понадобится шумоподавление (поскольку барабан имеет тенденцию быть на низких частотах, а шум на более высоких, простой низкочастотный сигнал может быть достаточной предварительной обработкой).

Алекс К
источник
1
Это похоже на мою проблему с обнаружением храпа .
Даниэль Р Хикс

Ответы:

13

Один метод, который работает, если есть относительно сильный удар барабана, состоит в том, чтобы взять величину STFT формы волны, а затем автоматически коррелировать ее только во временном измерении. Пиком функции автокорреляции будет удар или его кратное.

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

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

введите описание изображения здесь

Я придумал это для школьного проекта, чтобы найти единственное значение BPM для целых музыкальных файлов, но оно также может быть адаптировано к потоку аудио с изменением BPM. Вам нужно будет обрабатывать фрагменты, которые как минимум вдвое длиннее периода BPM, который вы ищете.

эндолиты
источник
БПФ является обычно полезным методом для поиска периодических сигналов. Может быть небольшая хитрость, если сигнал не такой регулярный, как вам хотелось бы: барабанщик может ускоряться или замедляться в течение песни - умышленно или нет - и это может испортить результаты FFT в частотной области.
Откат
1
@ Возврат: если BPM меняется со временем, вам нужно будет сделать это порциями и найти BPM для каждого.
эндолит
Обратите внимание, что ритмы обычно ассоциируются с музыкой, и на этом рисунке вы также видите другую часть музыки: горизонтальные линии, которые изменяют высоту в такте. Таким образом, есть в основном три энергетических вклада: удары (вертикали), ноты (горизонтали) и шум (остаток).
MSalters
@MSalters: заметки тоже могут коррелировать
эндолит
4

Автокорреляция, безусловно, является хорошим базовым методом для этого. Есть несколько вещей, которые вы можете сделать, чтобы потенциально улучшить это:

  1. Если вам известен частотный спектр вашего барабана, выполните полосовую фильтрацию сигнала, чтобы остались только частоты, относящиеся к барабану. В зависимости от барабана это может быть довольно узким и должно избавить от подавляющего большинства шума.
  2. Затем вычислите огибающую во временной области сигнала («пик потерь» - самый простой способ сделать это) с постоянной времени, которая приблизительно соответствует длине ударов барабана.
  3. Затем сделайте автокорреляцию
Hilmar
источник