Определение темпа

 

Rada

опытный

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

Вопрос - можно ли, с практической точки зрения, для данной задачи использовать автокорреляцию сигнала? Например, оцифровываем сигнал в реальном времени, попутно отфильтровывая цифровым фильтром так что остаются только низы. Ползём по функции автокорреляции сигнала, и находим максимумы с периодом T. 60/T даёт темп.

Хочу услышать замечания по данному подходу. В первую очередь - о вычыслительной нагрузке. Конволюция считается с временем O(N2), где N - кол-во сэмплов. Поэтому для определения автокорреляции 1000 точек например, надо произвести порядка миллиона вычислений; для реальных вычислений (десятки и сотни тысяч точек) ситуация становится невыполнимой на имеющихся средствах. Следует ли из этого, что сначала нужно произвести быстрое преобразование Фурье в O(N *ln(N)) времени, и уже потом вычислять конволюцию в O(N) (по теореме F(g convolution h) = F(g) * F(h))?
С себя можно начать когда все остальное будет в порядке.  
Это сообщение редактировалось 05.08.2004 в 23:16

au

   
★★
Замучаетесь вы музыку автокореллировать, хотя если очень хочется, то можно попробовать.
Я сейчас на автопилоте, так что сильно умного ничего сказать пытаться не буду. Но ваша задача решается довольно просто и без вычислительных подвигов. Позже, если вспомню %)
 
+
-
edit
 

AleX413

опытный

Проще. Фильтр НЧ, потом амплитуда огибающей, потом либо ее масимумы, либо максимумы первой производной - по месту смотреть надо. И все...
 

Rada

опытный

AleX413>Проще. Фильтр НЧ, потом амплитуда огибающей, потом либо ее масимумы, либо максимумы первой производной - по месту смотреть надо. И все...[»]

Так в том и проблема, что просто смотреть на огибающюю мощности не позволяет выделить темп во многих случаях. Допустим, имеем нечто джаза, со сложным ритмом. Как будем вычислять темп? По первому бару, по второму? А автокорреляция хороша тем, что позволяет производить адаптивное "накопление", т.е. выделять периодичность без предварительного знания об оной.
С себя можно начать когда все остальное будет в порядке.  

Rada

опытный

au>Замучаетесь вы музыку автокореллировать, хотя если очень хочется, то можно попробовать.
au>Я сейчас на автопилоте, так что сильно умного ничего сказать пытаться не буду. Но ваша задача решается довольно просто и без вычислительных подвигов. Позже, если вспомню %)[»]

У меня есть идея просто идти в окне секунд 5-10 скажем, автокоррелируя мощность НЧ сигнала.
С себя можно начать когда все остальное будет в порядке.  
RU CaRRibeaN #08.08.2004 11:41
+
-
edit
 

CaRRibeaN

координатор

Могу сказать, что даже прога за 16 килобаксов, весьма себе навороченная не умеет определять правильно темп композиций с ломанной бочкой. Да и автокорреляция тут врядли поможет, получаем несколько пиков...
Shadows of Invasion.  
+
-
edit
 

Petrovic

новичок

Может, я чего-то не догоняю, но чем не подходит простое БПФ? Просто в результате посмотреть на максимумы на сверх низких частотах в районе 0,5 - 2 Гц, если я правильно понял, BPM именно в таком диапазоне находится.
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru