我写了一个小程序,它需要检测声音级别,如果级别高于设置中的设置,我会写它,我通过 portaudio 完成声音捕获,通过 libvorbis 压缩,但是程序的一部分没有完成,我卡在它上面,我需要检测声音原始 pcm 数据的级别,我对 pcm 数据是什么理解很差,不知道任何音频分析/处理算法,我们是否有现有的 c/c++ 库可以做到这一点?或者是一些可以实现的简单算法c/c++ 存在吗?
问问题
4586 次
2 回答
4
这取决于您如何定义“声级”,它可以像检测峰值一样简单,而更复杂的是遵循行业标准/关于获得响度级别的建议。
PCM 数据通常是带符号值的流:在 8 位 PCM 的情况下为 0x00..0xFF,在 16 位 PCM 的情况下为 -0x8000..+0x7FFF,在浮点值的情况下为 -1.0..+1.0。
最简单的方法是通过寻找给定时间范围内的最大绝对值来检测简单的峰值。您可以在log10
之后申请以转换为分贝。
于 2013-02-21T12:55:32.707 回答
2
查看 Speex 和 WebRTC 库……它们都有语音活动检测器。如果您正在寻找声级的度量,您需要决定线性或对数电平指示器。PCM 的常用格式是 -32768 到 32767 范围(短 16 位)......您可以做的一件简单的事情就是简单地将一个周期内样本的绝对值相加,然后除以样本数以获得平均值期间的水平。
于 2013-02-21T12:55:25.413 回答