怎样修改音频的音量增益

[复制链接]
发表于 2026-1-18 20:39:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、媒介

在开辟音频相干的功能(好比说语音通话、播放音乐)时,常常会碰到音量太小的题目,这时间就须要我们对原始数据举行处理惩罚。本文将先容怎样通过修改原始音频数据来增长增益,本文包罗如下内容:
1.音频数据在软件上的形态
2.音频增益盘算公式
3.修改音频增益的代码实现
二、音频数据在软件上的形态

声音在天然界是以模拟信号的情势存在的,为了便于传输和存储,电子装备通常会将声音转成电信号。每个收罗到的电信号在软件上都会对应一个数值,软件上通过对这些数值举行处理惩罚,终极实现对音频的调解。
软件上通常使用十六进制来表现音频对应的电信号数值,如下图所示:

(2-1)
音频采样的频率越高、位深越大,就越音频可以或许还原原始的音频。位深越大,音频样本的分辨率就越高。常用的有8bit、16bit、24bit、32bit。
三、音频增益盘算公式

声音的巨细通常用分贝(dB)来权衡。
在软件上,可以通过同意提供每个采样点的值来增长音频的增益,不外这种方式不太好量化修改后的详细增益。
软件上常使用对原始音频数据举行移位的方式修改音频的增益,这种方式位移数和增益(dB)的数学关系如下:
Gain(dB)= 20 * log10 (2的n次方)       (n为位移数)
= 6.02 * n
也就是说,原始数据左移一位,增长6.02个dB。(右移则减小)
四、修改音频增益的代码实现

假定体系中播放的音频数据是16位深小端存储的(低位在前,高位在后),且数据是2通道的,修改音频增益的代码实现应如下所示:
  1. void change_gain(char *buf, snd_pcm_uframes_t frames, int seek)
  2.                     
  3. {
  4.         //1frame的数据大小为:通道数 * 16/8 = 2 * 2(Byte)            
  5.         int length = frames * 4;
  6.                                        
  7.         for(int i = 0; i < length - 1; i += 2)
  8.                     
  9.         {
  10.                 //将两个8bit的数据组合成完整的16bit数据   
  11.                 unsigned short value = (buf[i] & 0xFF) | ((buf[i + 1] & 0xFF) << 8);
  12.                 //移位修改增益                        
  13.                 value <<= seek;
  14.                 //获取低8位数据                        
  15.                 buf[i] = (value & 0xFF);
  16.                 //获取高8为数据   
  17.                 buf[i + 1] = (value >> 8) & 0xFF;
  18.                     
  19.         }
  20.                                        
  21. }
复制代码
这里取向左移动3位,理论上会增长18.06个dB,末了的测试数据如下:
修改前的数据:

(4-1)
修改后的数据:

(4-2)
修改前后数据相差也在18dB左右,阐明修改乐成了。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表