2013-02-21 37 views
3

我正在写小型程序,需要检测声级并写入,如果级别高于设置中的设置,我通过portaudio完成声音捕获,通过libvorbis进行压缩,但程序的一部分未完成,我坚持下去,我需要检测原始pcm数据的声级,我对pcm数据不了解,并且不知道任何音频分析/处理算法,我们是否有现成的c/C++库可以做到这一点?或者是一些可以在c/C++中实现的简单算法?检测原始pcm数据的声音水平

回答

1

看看Speex和WebRTC库......它们都有语音活动检测器。如果您正在寻找衡量声级的方法,则需要确定线性或对数级指标。 PCM的通用格式是-32768至32767范围(16位短)...您可以做的一件简单的事情就是简单地总结样本在一个时间段内的绝对值并除以样本数以得到平均值该阶段的水平。

+0

我已经签了16位48khz pcm,据我所知我需要总计48000个样本,并与级别进行比较?在一秒钟内检测水平? – sss123next 2013-02-21 13:24:54

+0

当然,你可以选择你想要的任何时间段......一秒钟就可以。记得总结>绝对<值... – mark 2013-02-21 13:28:41

+0

我会尝试和回复 – sss123next 2013-02-21 13:31:31

3

这取决于你如何定义“声级”,它可以像检测一个峰一样简单,并且可以按照以下行业标准/建议来获得响度级。

PCM数据通常是有符号值的流:8位PCM时为0x00..0xFF,16位PCM为-0x8000 .. + 0x7FFF,浮点值时为-1.0 .. + 1.0 。

最简单的方法是通过查找给定时间范围内的最大绝对值来检测简单峰。之后您可以将log10转换为分贝。

+0

当前我实施了在时间范围内寻找最大值(s)但是这种工作几乎不可用 – sss123next 2013-02-21 13:26:41