计算PCM分贝音频数据与大小

suoniao 2020-09-14
需要:0索币
1:计算分贝 音频数据与大小
首先我们分别累加每个采样点的数值,除以采样个数,得到声音平均能量值。
然后再将其做100与32767之间的等比量化。得到1-100的量化值。
通常情况下,人声分布在较低的能量范围,这样就会使量化后的数据大致分布在1-20的较小区间,不能够很敏感的感知变化。
所以我们将其做了5倍的放大,当然计算后大于100的值,我们将其赋值100.

//参数为数据,采样个数
//返回值为分贝
#define VOLUMEMAX 32767
int SimpleCalculate_DB(short* pcmData, int sample)
{
signed short ret = 0;
if (sample > 0){
int sum = 0;
signed short* pos = (signed short *)pcmData;
for (int i = 0; i < sample; i++){
sum += abs(*pos);
pos++;
}
ret = sum * 500.0 / (sample * VOLUMEMAX);
if (ret >= 100){
ret = 100;
}
}
return ret;
}
2:计算均方根(RMS) 即能量值
static const float kMaxSquaredLevel = 32768 * 32768;
constexpr float kMinLevel = 30.f;
void Process(const int16_t* data, size_t length)
{
float sum_square_ = 0;
size_t sample_count_ = 0;
for (size_t i = 0; i < length; ++i) {
sum_square_ += data[i] * data[i];
}
sample_count_ += length;.
float rms = sum_square_ / (sample_count_ * kMaxSquaredLevel);
//20log_10(x^0.5) = 10log_10(x)
rms = 10 * log10(rms);
if (rms < -kMinLevel)
rms = -kMinLevel;
rms = -rms;
return static_cast<int>(rms + 0.5);
}
3:获取音频数据最大的振幅(即绝对值最大)(0-32767),除以1000,得到(0-32)。从数组中获取相应索引所对应的分贝值。(提取自webrtc)
const int8_t permutation[33] =
{0,1,2,3,4,4,5,5,5,5,6,6,6,6,6,7,7,7,7,8,8,8,9,9,9,9,9,9,9,9,9,9,9};
int16_t WebRtcSpl_MaxAbsValueW16C(const int16_t* vector, size_t length)
{
size_t i = 0;
int absolute = 0, maximum = 0;
for (i = 0; i < length; i++) {
absolute = abs((int)vector[i]);
if (absolute > maximum) {
maximum = absolute;
}
}
if (maximum > 32767) {
maximum = 32767;
}
return (int16_t)maximum;
}
void ComputeLevel(const int16_t* data, size_t length)
{
int16_t _absMax = 0;
int16_t _count = 0;
int8_t _currentLevel = 0;
int16_t absValue(0);
absValue = WebRtcSpl_MaxAbsValueW16(data,length);
if (absValue > _absMax)
_absMax = absValue;
if (_count++ == 10) {
_count = 0;
int32_t position = _absMax/1000;
if ((position == 0) && (_absMax > 250)){
position = 1;
}
_currentLevel = permutation[position];
_absMax >>= 2;
}
}
---------------------

作者:Zoe今忆
回帖
  • 消灭零回复
局域网文件共享软件
相关主题
计算PCM分贝音频数据与大小 0
YUV 是一种颜色编码方法,和它等同的还有 RGB 颜色编码方法。YUV 的采样与格式 0
FFmpeg从入门到精通教程音视频核心库FFmpeg编解码实战FFmpeg SDL音视频渲染 0
利用WebRTC实现音视频直播系统 0
16年版本安卓NDK开发教程android音视频开发 0
QSqlQuery::exec: database not open 0
在安卓系统上运行一个HTTP服务器的软件NanoHttpd 0
在安卓系统上面运行一个HTTP服务器的软件NanoHttpd 0
Qt5.12.4requested database does not belong to the calling thread 0
构建Qt界面的工具栏,主要用到QToolBar类 0
QToolButton详细使用图解教程 给主界面添加图标和文字 0
两个不同网络的电脑怎么实现文件的互相访问呢? 1
解决 dns 污染,一定是要用国外的 dns,而且 dns 流量需要经过你的隧道 0
Qt利用QClipboard复制hello suoniao到剪贴板 0
Qt剪切板复制图片和文本的方法将QImage格式复制到剪贴板,QPixmap要比QImage慢 0
QT 提供了QSystemTrayIcon类用于实现程序的托盘。QT提供了托盘示例 0
mainwindow单击关闭按钮不会触发关闭操作,它只是退出 0
何用Go语言开发一个高负荷的WebSocket服务 0
c++使用protobuf与GO语言做数据通信 0
golang应该是可以代替对使用c++存在误解的人吧,代替语言是不可能的 0
相关主题
QSqlQuery::exec: database not open 0
在安卓系统上运行一个HTTP服务器的软件NanoHttpd 0
在安卓系统上面运行一个HTTP服务器的软件NanoHttpd 0
Qt5.12.4requested database does not belong to the calling thread 0
构建Qt界面的工具栏,主要用到QToolBar类 0
QToolButton详细使用图解教程 给主界面添加图标和文字 0
两个不同网络的电脑怎么实现文件的互相访问呢? 1
解决 dns 污染,一定是要用国外的 dns,而且 dns 流量需要经过你的隧道 0
Qt利用QClipboard复制hello suoniao到剪贴板 0
Qt剪切板复制图片和文本的方法将QImage格式复制到剪贴板,QPixmap要比QImage慢 0
QT 提供了QSystemTrayIcon类用于实现程序的托盘。QT提供了托盘示例 0
mainwindow单击关闭按钮不会触发关闭操作,它只是退出 0
何用Go语言开发一个高负荷的WebSocket服务 0
c++使用protobuf与GO语言做数据通信 0
golang应该是可以代替对使用c++存在误解的人吧,代替语言是不可能的 0
怎么使用Javascript下载文件 json文件下载 0
addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed 0
获取QT QTreeWidget控件当前Item的文本text值 0
wavesurfer.js是一款基于HTML5 canvas和Web Audio的音频播放器插件 0
web端音频播放插件wavesurfer.js简单使用图文教程 绘制音频波纹图 0