Виявлення барабану в хвилину у галасливому файлі .wav


12

Я шукаю алгоритм (и), щоб вирішити таку проблему: З огляду на шумний звуковий сигнал WAV (деякий шум вітру + тертя на мікрофоні), як виявити BPM м'якого удару барабана?

Я спробував погубувати тему, але результати є досить поганими, через велику кількість програмного забезпечення, пов'язаного з mp3, як для аналізу, так і для генерування відбитків пальців. Жоден з них не надає інформацію про те, як насправді це зробити.

Мені відомі алгоритми для усунення шуму, але це все ще залишає мене з проблемою виявлення BPM. І залежно від того, як вирішується проблема BPM, можливо, мені навіть не потрібно позначати (оскільки барабан має тенденцію до низьких частот, а шум на більш високих, для попередньої обробки може бути достатньо простої низької частоти).


Відповіді:


13

Один з методів, який працює, якщо є відносно сильний ударний удар, - це прийняти величину STFT форми хвилі, а потім автоматично співвіднести її лише в часовому вимірі. Піком функції автокореляції буде биття, або його підмножина.

Це еквівалентно розбиванню сигналу на безліч різних діапазонів частот, знаходження амплітудної оболонки кожного, автокореляція кожної огинаючої та їх підсумовування. Шум та інші частини музики усереднюються в результаті операції перехресної кореляції.

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

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

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


FFT - це загалом корисна методика пошуку періодичних сигналів. Може виникнути невелика хитрість, якщо сигнал не такий регулярний, як хотілося: барабанщик міг би прискорити або сповільнити протягом пісні - навмисно чи ні - і це може зіпсувати результати FFT в частотній області.
Rethunk

1
@Rethunk: Якщо BPM змінюється з часом, вам потрібно буде це зробити шматками і знайти BPM для кожного.
ендоліт

Зауважте, що ритми зазвичай асоціюються з музикою, і ви бачите ще одну частину музики на цьому малюнку: горизонтальні лінії, які змінюють висоту в такт. Таким чином, в основному є три енергетичні внески: удари (вертикаль), ноти (горизонталі) і шум (залишок).
MSalters

@MSalters: Ноти теж можуть співвідноситись, хоча
endolith

4

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

  1. Якщо ви знаєте спектр частоти барабана, смуговий фільтр подає сигнал таким чином, що залишаються лише частоти, відповідні барабану. Залежно від барабана це може бути досить вузьким і повинно позбутися від значної більшості шуму.
  2. Потім обчисліть огинаючу часову область сигналу ("найстрашніший пік" - це найпростіший спосіб зробити це) з постійною часом, яка приблизно відповідає довжині ударів барабана.
  3. Потім зробіть автокореляцію
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.