Программно обнаружить и извлечь аудио конверт - PullRequest
6 голосов
/ 14 февраля 2011

Все предложения и ссылки на соответствующую информацию приветствуются здесь. Это сценарий:

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

Я хотел бы запустить алгоритм на серии выборок, чтобы определить, когда происходит событие, то есть начало и конец конверта. Затем я бы использовал эту начальную и конечную точку для извлечения этих данных для использования в другом месте.

Каков наилучший способ справиться с этим? Любой псевдокод? Пример кода? Исходный код?

Я в конечном итоге напишу это на C.

Спасибо!


РЕДАКТИРОВАТЬ 1

Разбор файла wav не является проблемой. Но некоторый псевдокод для определения конверта был бы хорош! :)

Ответы [ 5 ]

7 голосов
/ 14 февраля 2011

Обычный метод:

  1. принять абсолютное значение формы волны, абс (х [т])
  2. фильтр нижних частот (скажем, отсечка 10 Гц)
  3. применить порог
3 голосов
/ 14 февраля 2011

Вы можете использовать тот же метод, что и старомодный аналоговый измеритель. Исправьте вектор выборки, передайте результат абсолютного значения через фильтр нижних частот (FIR, IIR, скользящее среднее и т. Д.), Затем сравните с некоторым порогом. Для более точного времени события вам нужно будет вычесть время групповой задержки фильтра нижних частот.

Добавлено: Вам также может потребоваться предварительно отключить постоянный ток (например, с помощью фильтра верхних частот или другого блокировщика постоянного тока, эквивалентного емкостной связи).

1 голос
/ 26 августа 2013

Я написал класс детектора активности на Java.Это часть моей коллекции Java DSP с открытым исходным кодом .

1 голос
/ 16 июля 2013

Исходный код простых детекторов конвертов можно найти в архиве Music-DSP .

0 голосов
/ 10 декабря 2018

фильтр нижних частот первого порядка C # Код:

    double old_y = 0;

    double R1Filter(double x, double rct)
    {
        if (rct == 0.0)
            return 0;
        if (x > old_y)
            old_y = old_y-(old_y - x)*rct/256;
        else
            old_y = old_y + (x - old_y) * rct/256;
        return old_y;
    }

Когда rct = 2, это работает так: enter image description here

Сигнал = (мкм + мкм * ма * Cos (big_omega * x)) * (Cos (small_omega1 * x) + Cos (small_omega2 * x)) где ucm = 3, big_omega = 200, small_omega1 = 4, small_omega2 = 12 и ma = 0,8

Обратите внимание, что фильтр может изменять фазу сигнала основной полосы.

...