给定的是320个元素(int16)的数组,它表示持续时间为20毫秒的音频信号(16位LPCM)。我正在寻找一种最简单,最快速的方法,它应该决定这个数组是否包含有效音频(如语音或音乐),而不是噪音或静音。我不需要高质量的决定,但必须非常快。
我首先想要添加元素的所有正方形或绝对值,并将它们的总和与阈值进行比较,但这种方法对我的系统来说非常慢,即使它是 O(n)
答案 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)