C++ 检测原始pcm数据中的声级

C++ 检测原始pcm数据中的声级,c++,audio,pcm,audio-processing,C++,Audio,Pcm,Audio Processing,我编写了一个小程序,需要检测声级,如果声级高于设置中设置的声级,我就编写它。我通过portaudio进行了声音捕获,通过libvorbis进行压缩,但程序的一部分没有完成,我卡住了,我需要检测原始pcm数据的声级,我不太了解pcm数据是什么,也不知道任何音频分析/处理算法,是我们现有的c/c++库可以做到这一点,还是存在一些可以在c/c++中实现的简单算法?查看Speex和WebRTC库。。。它们都有语音活动检测器。如果您正在寻找声级的测量方法,则需要确定线性或对数声级指示器。PCM的常见格式为

我编写了一个小程序,需要检测声级,如果声级高于设置中设置的声级,我就编写它。我通过portaudio进行了声音捕获,通过libvorbis进行压缩,但程序的一部分没有完成,我卡住了,我需要检测原始pcm数据的声级,我不太了解pcm数据是什么,也不知道任何音频分析/处理算法,是我们现有的c/c++库可以做到这一点,还是存在一些可以在c/c++中实现的简单算法?

查看Speex和WebRTC库。。。它们都有语音活动检测器。如果您正在寻找声级的测量方法,则需要确定线性或对数声级指示器。PCM的常见格式为-32768至32767范围(16位短)。。。你可以做的一件简单的事情就是简单地将一个周期内样本的绝对值相加,然后除以样本数,得到该周期的平均音量。

这取决于你如何定义“声级”,它可以像检测峰值一样简单,更复杂的是,按照行业标准/建议获得响度级别

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


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

我已经签署了16位48khz pcm,据我所知,我需要对48000个样本求和,并将其与电平进行比较?要在一秒钟内检测液位?当然,您可以选择您想要的任何时间段。。。一秒钟就可以了。记住对>绝对<值求和…好吧,它工作得更好,仍然不是我想要的,但比我的初始代码更好,你可以看看这里,也许你对声级/静音检测有更多建议,也许我应该应用一些过滤器来减少一般噪音(我房间里几乎没有电脑和其他噪音技术)是的,你必须使用阈值来找出你的噪音水平在哪里。。。研究自动增益控制算法。您还可以计算过零率(样本从正到负或返回的次数),因为这也是有用的信息……目前我实现了在时间范围内寻找最大值,但这几乎无法使用