Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выделение пауз в цифровом аудиосигнале
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Allregia
Уважаемые коллеги, не подскажет ли кто-нибудь пожалуйста алгоритм, или черканет несколько строчек на С:

1) есть цифровой аудиопоток, нужно ловить в нем паузы (выставлять флаг), длительностью больше заданного порога (порядок длительности паузы - десятки мс).

2) данные представлены в виде signed int32 слов, в которых сами данные могут быть 24 или 16 бит (это заранее не известно - что тоже проблема), выровненных влево, частота дискретизации заранее известна - 48 или 96кгц.

3) это реальный музыкальный сигнал, детектировать нужно паузы межу треками, но так чтобы не детектировались паузы в музыке. я думаю, уровень шумов в паузе между треками должен быть существенно ниже уровня шумов в музыкальной паузе, (т.к. в паузе это "цифровой ноль"), поэтому выбрав соотв. образом порог срабатывания по амплитуде (например -40-50дБ) можно решить задачу.

4) лучше пропустить паузу, чем ложно детектировать когда ее на самом деле нет.

Спасибо за помощь.

Allregia
Ну, раз никто не знает, буду делать так, как бы делал в железе - HPF-ABS-LPF.
Фильтры для простоты возьму 1-го порядка.
Allregia
Хотя, можно наверное и автокорреляцией сделать.
STAR_IK
Так если между треками "цифровой ноль", тогда и отлавливайте ноль. Взять среднее арифметическое по некоторому количеству отсчетов и если оно будет равна нулю, значит пауза. В музыкальном треке нуля никогда не будет, всегда будет некоторый шум.
Allregia
Цитата(STAR_IK @ Jul 5 2013, 08:43) *
Так если между треками "цифровой ноль", тогда и отлавливайте ноль.


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


Да, такие фильтры типа "скользящего среднего" я и использовал.


Цитата
во 2х поиск по "pause detection" или "silence detection" находит кучу публикаций и готовых алгоритмов


Мне в основном попадались ссылки на готовые девайсы и готовые программы sad.gif
Nick Nickl's
Тупо считал амплитуду сигнала в некотором временном интервале (половина нижней частоты сигнала), если на заданном количестве интервалов она меньше порога считал что сигнала нет. точно алгоритм не помню - лет 10 назад это было писал логи с радиостанций. Убрать постоянную составляющую тоже не проблема
zöner
да, чем не устроил простейший пиковый детектор ?
для надежности можно добавить скользящий фильтрик от случайных выбросов, и гистерезис.
Allregia
Цитата(zцner @ Jul 7 2013, 10:10) *
да, чем не устроил простейший пиковый детектор ?


Уже устроил sm.gif

Цитата
для надежности можно добавить скользящий фильтрик от случайных выбросов, и гистерезис.


Я сделал как писал выше - HPF для устранения постоянки, затем ABS ("выпрямитель"), затем LPF для сглаживания.
Только LPF я сделал с разными постоянными времени для нарастания (малое тау) и спада сигнала (большое тау).
Затем если сигнал ниже порога в течение заданного времени - выставляю флаг "пауза", как только сигнал выше порога - сразу сбрасываю этот флаг.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.