【问题标题】:Most simple and fast method for audio activity detection?最简单快速的音频活动检测方法?
【发布时间】:2011-03-10 13:11:30
【问题描述】:

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

我首先想到将元素的所有平方或绝对值相加并将它们的总和与阈值进行比较,但是这种方法在我的系统上非常慢,即使它是 O(n) em>。

【问题讨论】:

  • L 是指线性还是对数?
  • 也许您应该发布平方和 + 阈值方法的代码 - 它根本不应该“非常慢” - 也许您的实施效率低下?

标签: c algorithm audio embedded signal-processing


【解决方案1】:

不久前我做过类似的事情。经过一些实验后,我找到了一个在我的案例中运行良好的解决方案。

我使用了大约 120 毫秒内运行平均值的立方变化率。当有静音(只有噪音)时,表达式应该在零附近徘徊。一旦速度在几次运行中开始增加,您可能会采取一些行动。


rate = cur_avg^3 - prev_avg^3

我使用立方体是因为正方形不够激进。如果立方体对您来说变慢,请尝试使用正方形和位移。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    很明显,复杂度至少应该是O(n)。目前可能有一些简单的算法可以计算一些值范围,但我会在网络上寻找Voice Activity Detectionrelated code samples

    【讨论】:

      【解决方案3】:

      您可以尝试计算两个简单的“统计数据”——首先是展开(最大-最小)。沉默的传播非常低。其次是多样性 - 将可能值的范围划分为 16 个括号(= 值范围),并在遍历元素时确定该元素在哪个括号中。噪音在所有括号中都有相似的数字,而音乐或语音应该喜欢其中的一些而忽略其他的。

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 别忘了添加一个简单的滤波器来去除所有的高频噪声。低通滤波器可以像“记住”前一个样本一样简单,并将其与当前样本进行平均,然后使用它代替原始样本。非常快速且非常有效
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多