音频活动检测的最简单和最快方法是什么?

8
给定一个由320个元素(int16)组成的数组,表示持续20ms的音频信号(16位LPCM)。我正在寻找一种最简单和非常快速的方法,用来判断这个数组是否包含活动音频(如语音或音乐),而不是噪声或沉默。我不需要非常高质量的决策,但它必须非常快。
起初我想通过将所有元素的平方或绝对值相加,并将它们的总和与阈值进行比较,但这种方法在我的系统上非常慢,即使它是O(n)的。

L 是指线性还是对数? - msw
2
也许你应该发布你的平方和+阈值方法的代码——它真的不应该是“非常慢”的——也许你实现得不够高效? - Paul R
4个回答

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功率严重不足...

3
别忘了加一个简单的滤波器来去除所有高频噪声。低通滤波器可以很简单,只需“记住”前一个采样值,并将其与当前采样值平均,然后使用这个平均值代替原始采样值。非常快速和有效。 - Toad

2
你可以尝试计算两个简单的“统计量” - 第一个是差距(最大值-最小值)。沉默会有非常低的差距。第二个是变化程度 - 将可能的值范围分成16个区间(=值范围),当你遍历元素时,确定该元素属于哪个区间。噪音在所有区间中的数字应该相似,而音乐或语音应该更喜欢其中一些并忽略其他区间。

这应该可以在数组中仅通过一次遍历来完成,您不需要复杂的算术运算,只需进行一些值的加法和比较即可。

另外,考虑一些近似值,例如仅取每四个值,从而将所检查的元素数量减少到80。对于音频信号,这应该是可以接受的。


1

我之前做过类似的事情。经过一些试验,我找到了一个在我的情况下工作得足够好的解决方案。

我使用了大约120毫秒内运行平均值的立方体变化率。当只有噪音(没有声音)时,表达式应该接近零。一旦速率在几次运行中开始增加,你可能有一些动作正在进行。


rate = cur_avg^3 - prev_avg^3

我使用了一个立方体,因为正方形不够强劲。如果立方体对你来说太慢了,可以尝试使用正方形和位移操作。希望这能帮到你。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接