如何修改音频的音量增益

embedded/2024/9/25 5:47:43/

一、前言

在开发音频相关的功能(比如说语音通话、播放音乐)时,经常会遇到音量太小的问题,这时候就需要我们对原始数据进行处理。本文将介绍如何通过修改原始音频数据来增加增益,本文包含如下内容:
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通道的,修改音频增益的代码实现应如下所示:

void change_gain(char *buf, snd_pcm_uframes_t frames, int seek){//1frame的数据大小为:通道数 * 16/8 = 2 * 2(Byte)            int length = frames * 4;for(int i = 0; i < length - 1; i += 2){//将两个8bit的数据组合成完整的16bit数据    unsigned short value = (buf[i] & 0xFF) | ((buf[i + 1] & 0xFF) << 8);//移位修改增益                        value <<= seek;//获取低8位数据                        buf[i] = (value & 0xFF);//获取高8为数据    buf[i + 1] = (value >> 8) & 0xFF;}}

这里取向左移动3位,理论上会增加18.06个dB,最后的测试数据如下:
修改前的数据:
在这里插入图片描述

(4-1)
修改后的数据:
在这里插入图片描述

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


http://www.ppmy.cn/embedded/116471.html

相关文章

python全栈学习记录(十八)re、os和sys、subprocess

re、os和sys、subprocess 文章目录 re、os和sys、subprocess一、re1.正则字符2.正则表达式的使用3.group的使用4.贪婪匹配与惰性匹配5.其他注意事项 二、os和sys1.os2.sys 三、subprocess四、打印进度条 一、re python中的re模块用来使用正则表达式&#xff0c;正则就是用一系…

C++什么时候生成默认的拷贝构造函数

1. 默认拷贝构造存在的问题 因为默认使用的是位拷贝&#xff0c;那么如果存在指针一类对象&#xff0c;那么不同对象会持有相同对象资源。 2. 什么时候触发拷贝构造函数 &#xff08;1&#xff09;用一个对象&#xff0c;当另一个对象的构造参数。 A b; A a(b); &#xff…

哪个快?用300万个图斑测试ArcGIS Pro的成对叠加与经典叠加

​​​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 在使用ArcGIS Pro的过程中&#xff0c;很多朋友发现&#xff0c;Pro有个成对叠加工具集。很多…

光子架与电子架 -- 主从子架

主从子架模式可以实现物理上的多个子架在网管上作为一个网元统一管理&#xff0c;这样可以节省IP资源与管理开销&#xff0c;方便维护。 主从子架级联模式 在主从子架模式下&#xff0c;仅主子架可以和网管相连。和网管相连的主子架所在网元为网关网元。主从子架支持树型级联和…

一文入门生成式AI(理解ChatGPT的原理)

一、什么是生成式AI&#xff1f; 以ChatGPT为代表的生成式AI&#xff0c;是对已有的数据和知识进行向量化的归纳&#xff0c;总结出数据的联合概率。从而在生成内容时&#xff0c;根据用户需求&#xff0c;结合关联字词的概率&#xff0c;生成新的内容。 可以这么联想&#x…

Qt日志输出及QsLog日志库

目录 Qt日志输出及QsLog日志库日志输出格式化日志普通格式化条件格式化环境变量设置格式化日志输出位置日志输出对象信息禁用输出 QsLog日志库使用方法1. 将QsLog目录添加到项目中2. 配置CMakeLists.txt文件3. 配置.pro文件4. 日志记录器的配置5. 运行程序6. 启用行号和文件名C…

Mybatis进阶

一、日志管理 mybatis主要使用logback来管理日志&#xff0c;具体内容之前的java进阶有说&#xff0c;链接如下 java基础进阶——log日志、类加载器、XML、单元测试、注解、枚举类_java logs是什么意思-CSDN博客 二、动态SQL 动态SQL指的是根据参数数据动态组织SQL的技术。 …