Имеем звуковой квазипериодичный сигнал (например музыка), требуется определить темп музыки (нипример в ударах-в-минуту). Существует множество выпускаемых счётчиков темпа, которые по-видимому используют пик-детектирование. Такой метод обладает кучей недостатков - зависимость от формы (спектра) сигнала, зависимость от структуры ритма музыки (неточность в подчёте темпа при наличии "сбитых" ритмов), и т.д.
Вопрос - можно ли, с практической точки зрения, для данной задачи использовать автокорреляцию сигнала? Например, оцифровываем сигнал в реальном времени, попутно отфильтровывая цифровым фильтром так что остаются только низы. Ползём по функции автокорреляции сигнала, и находим максимумы с периодом 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