Самый простой и быстрый способ обнаружения аудио активности? - PullRequest
8 голосов
/ 01 июля 2010

Дан массив из 320 элементов (int16), которые представляют аудиосигнал (16-битный LPCM) длительностью 20 мс. Я ищу самый простой и очень быстрый метод, который должен решить, содержит ли этот массив активный звук (например, речь или музыка), но не шум или тишину. Мне не нужно очень высокое качество решения, но оно должно быть очень быстрым.

Сначала мне пришло в голову добавить все квадраты или абсолютные значения элементов и сравнить их сумму с порогом, но такой метод очень медленный в моей системе, даже если он равен O (n) * 1004. *.

Ответы [ 4 ]

6 голосов
/ 01 июля 2010

Вы не станете намного быстрее, чем метод суммирования квадратов.

Одна из оптимизаций, которую вы, возможно, не выполняете, - это использование промежуточной суммы.То есть на каждом временном шаге вместо суммирования квадратов последних n выборок сохраняйте промежуточную сумму и обновляйте ее квадратом самой последней выборки.Чтобы избежать увеличения и увеличения вашего промежуточного итога, добавьте экспоненциальный спад.В псевдокоде:

decay_constant=0.999;  // Some suitable value smaller than 1
total=0;
for t=1,...
    // Exponential decay
    total=total*decay_constant;

    // Add in latest sample
    total+=current_sample;

    if total>threshold
        // do something
    end
end

Конечно, вам придется настроить константу и порог затухания в соответствии с вашим приложением.Если это не достаточно быстро, чтобы работать в режиме реального времени, у вас есть серьезно DSP ...

2 голосов
/ 01 июля 2010

Вы можете попробовать вычислить две простые «статистики» - сначала будет распространяться (max-min).Молчание будет иметь очень низкое распространение.Вторым будет разнообразие - разделите диапазон возможных значений, скажем, на 16 скобок (= диапазон значений), и, когда вы будете проходить элементы, определите, в какую скобку входит этот элемент.Шум будет иметь одинаковые номера для всех скобок, тогда как музыка или речь должны отдавать предпочтение некоторым из них, пренебрегая другими.

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

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

1 голос
/ 01 июля 2010

Я сделал что-то подобное некоторое время назад.После некоторых экспериментов я пришел к решению, которое в моем случае работало достаточно хорошо.

Я использовал скорость изменения куба скользящего среднего в течение примерно 120 мс.Когда наступает тишина (только шум), выражение должно колебаться вокруг нуля.Как только скорость начинает увеличиваться в течение нескольких пробежек, вы, вероятно, продолжаете действовать.


rate = cur_avg^3 - prev_avg^3

Я использовал куб, потому что квадрат был недостаточно агрессивным.Если вам нужно замедлить куб, попробуйте использовать квадрат и битовое смещение.Надеюсь, это поможет.

0 голосов
/ 01 июля 2010

Очевидно, что сложность должна составлять не менее O (n).Возможно, некоторые простые алгоритмы, которые вычисляют некоторый диапазон значений, на данный момент хороши, но я бы искал Обнаружение голосовой активности в Интернете и связанных примеров кода .

...