最简单快速的音频活动检测方法?

时间:2010-07-01 09:28:01

标签: c algorithm audio embedded signal-processing

给定的是320个元素(int16)的数组,它表示持续时间为20毫秒的音频信号(16位LPCM)。我正在寻找一种最简单,最快速的方法,它应该决定这个数组是否包含有效音频(如语音或音乐),而不是噪音或静音。我不需要高质量的决定,但必须非常快。

我首先想要添加元素的所有正方形或绝对值,并将它们的总和与阈值进行比较,但这种方法对我的系统来说非常慢,即使它是 O(n)

4 个答案:

答案 0 :(得分:6)

你不会比平方和方法快得多。

到目前为止,您可能没有做过的一项优化是使用总计。也就是说,在每个时间步骤中,不是对最后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 ......

答案 1 :(得分:2)

你可能会尝试计算两个简单的“统计数据” - 首先是传播(最大 - 最小)。沉默的传播率很低。第二种是多样性 - 将可能值的范围划分为16个括号(=值范围),当您浏览元素时,确定该元素所在的括号。所有括号的噪音都有相似的数字,而音乐或语音应该更喜欢其中一些而忽略其他。

这应该可以在一次通过数组时完成,你不需要复杂的算术,只需要添加和比较值。

还要考虑一些近似值,例如只取每四个值,从而将已检查元素的数量减少到80.对于音频信号,这应该没问题。

答案 2 :(得分:1)

我曾经做过类似的事。经过一些实验,我得出了一个在我的案例中运作得很好的解决方案。

我使用了运行平均值的立方体的变化率大约120ms。当有沉默(只有噪音)时,表达式应该在零附近徘徊。一旦费率开始增加几次,你可能会继续采取行动。


rate = cur_avg^3 - prev_avg^3

我使用了一个立方体,因为这个正方形不够激进。如果立方体对你来说很慢,请尝试使用方形和比特移位。希望这会有所帮助。

答案 3 :(得分:0)

显然复杂性至少应为O(n)。可能一些计算某些值范围的简单算法目前是好的,但我会在网络和Voice Activity Detection上寻找related code samples