Allregia
Jul 1 2013, 21:22
Уважаемые коллеги, не подскажет ли кто-нибудь пожалуйста алгоритм, или черканет несколько строчек на С:
1) есть цифровой аудиопоток, нужно ловить в нем паузы (выставлять флаг), длительностью больше заданного порога (порядок длительности паузы - десятки мс).
2) данные представлены в виде signed int32 слов, в которых сами данные могут быть 24 или 16 бит (это заранее не известно - что тоже проблема), выровненных влево, частота дискретизации заранее известна - 48 или 96кгц.
3) это реальный музыкальный сигнал, детектировать нужно паузы межу треками, но так чтобы не детектировались паузы в музыке. я думаю, уровень шумов в паузе между треками должен быть существенно ниже уровня шумов в музыкальной паузе, (т.к. в паузе это "цифровой ноль"), поэтому выбрав соотв. образом порог срабатывания по амплитуде (например -40-50дБ) можно решить задачу.
4) лучше пропустить паузу, чем ложно детектировать когда ее на самом деле нет.
Спасибо за помощь.
Allregia
Jul 4 2013, 06:06
Ну, раз никто не знает, буду делать так, как бы делал в железе - HPF-ABS-LPF.
Фильтры для простоты возьму 1-го порядка.
Allregia
Jul 4 2013, 18:46
Хотя, можно наверное и автокорреляцией сделать.
STAR_IK
Jul 5 2013, 06:43
Так если между треками "цифровой ноль", тогда и отлавливайте ноль. Взять среднее арифметическое по некоторому количеству отсчетов и если оно будет равна нулю, значит пауза. В музыкальном треке нуля никогда не будет, всегда будет некоторый шум.
Allregia
Jul 5 2013, 07:10
Цитата(STAR_IK @ Jul 5 2013, 08:43)

Так если между треками "цифровой ноль", тогда и отлавливайте ноль.
1) Необязательно ноль, там может быть константа (постоянная составляющая).
2) То что Вы предлагаете, у меня описано в п.3 исходного сообщения.
во 1х DC-filter:
http://peabody.sapp.org/class/dmp2/lab/dcblock/во 2х поиск по "pause detection" или "silence detection" находит кучу публикаций и готовых алгоритмов
Allregia
Jul 5 2013, 09:47
Цитата(zöner @ Jul 5 2013, 11:12)

Да, такие фильтры типа "скользящего среднего" я и использовал.
Цитата
во 2х поиск по "pause detection" или "silence detection" находит кучу публикаций и готовых алгоритмов
Мне в основном попадались ссылки на готовые девайсы и готовые программы
Nick Nickl's
Jul 6 2013, 19:25
Тупо считал амплитуду сигнала в некотором временном интервале (половина нижней частоты сигнала), если на заданном количестве интервалов она меньше порога считал что сигнала нет. точно алгоритм не помню - лет 10 назад это было писал логи с радиостанций. Убрать постоянную составляющую тоже не проблема
да, чем не устроил простейший пиковый детектор ?
для надежности можно добавить скользящий фильтрик от случайных выбросов, и гистерезис.
Allregia
Jul 7 2013, 10:17
Цитата(zцner @ Jul 7 2013, 10:10)

да, чем не устроил простейший пиковый детектор ?
Уже устроил

Цитата
для надежности можно добавить скользящий фильтрик от случайных выбросов, и гистерезис.
Я сделал как писал выше - HPF для устранения постоянки, затем ABS ("выпрямитель"), затем LPF для сглаживания.
Только LPF я сделал с разными постоянными времени для нарастания (малое тау) и спада сигнала (большое тау).
Затем если сигнал ниже порога в течение заданного времени - выставляю флаг "пауза", как только сигнал выше порога - сразу сбрасываю этот флаг.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.