音频处理——解析PCM格式实例(音量调控)
目录
- 举例
- 音量控制
- 数据溢出
- 对数描述
举例
要注意的是,PCM的数据在内存中是纯数据的二进制,也就是说我们无法通过解析文件得知他的采样率、采样精度、声道数等信息,只能先得知它的参数再对其进行解析。
我用于解析的PCM文件参数如下
- 采样精度——16bit
- 采样率——16000Hz
- 声道——单声道
- 音频帧率——40
- 每帧的采样点——640
波形如下
此文件为欢迎光临的语音
音频文件的尺寸 = 采样频率 x 采样精度 x 通道数 x 采样时间
于是示例文件的尺寸 = 16000 x 2 x 1 x 1.584 = 50688byte
音量控制
我们先看一个真正的音频样本波形:
如果我们放大5倍波形,也就是振幅乘以5,此时我们听到了更大的声音,此时样本波形如下:
假如我们有2048bytesPCM数据,样本大小两个字节,共有1024个样本,我们要放大两倍声音,代码可以按如下写:
int16_t pcm[1024] = read in some pcm data;
for (ctr = 0; ctr < 1024; ctr++)
{pcm[ctr] *= 2;
}
虽然看着是很简单,但是需要考虑一些问题
数据溢出
因为每个样本取值范围是有限制的,调节音量时不可能随便增大,比如一个signed 16 bits的样本,值为5000,我们放大10倍,由于有符号位16bits数据取值范围为-32768~32767,5000乘以10得到的50000超过了32767,数据溢出了,最后值可能变为-15536,不是我们期望的。此时我们就需要裁剪了,确保数值在正确范围内。如下代码对前面说到的放大两倍声音做了裁剪处理:
int16_t pcm[1024] = read in some pcm data;
int32_t pcmval;
for (ctr = 0; ctr < 1024; ctr++)
{pcmval = pcm[ctr] * 2;if (pcmval < 32767 && pcmval > -32768) {pcm[ctr] = pcmval} else if (pcmval > 32767) {pcm[ctr] = 32767;} else if (pcmval < -32768) {pcm[ctr] = -32768;}
}
对数描述
平时表示声音强度我们都是用分贝(db)作单位的,声学领域中,分贝的定义是声源功率与基准声功率比值的对数乘以10的数值。根据人耳的心理声学模型,人耳对声音感知程度是对数关系,而不是线性关系。人类的听觉反应是基于声音的相对变化而非绝对的变化。对数标度正好能模仿人类耳朵对声音的反应。所以用分贝作单位描述声音强度更符合人类对声音强度的感知。前面我们直接将声音乘以某个值,也就是线性调节,调节音量时会感觉到刚开始音量变化很快,后面调的话好像都没啥变化,使用对数关系调节音量的话声音听起来就会均匀增大。
如下图,横轴表示音量调节滑块,纵坐标表示人耳感知到的音量,图中取了两块横轴变化相同的区域,音量滑块滑动变化一样,
但是人耳感觉到的音量变化是不一样的,在左侧也就是较安静的地方,感觉到音量变化大,在右侧声音较大区域人耳感觉到的音量变化较小。
下面我们讲下音量值乘数取值,这里我只简单的用tan函数模拟,效果也不错,至于使用对数如何调整请参考文末链接:
int some_level;float multiplier = tan (some_level / 100.0 );
上面代码中音量乘数取值为tan (some_level / 100.0 ),最后实现代码如下:
int16_t pcm[1024] = read in some pcm data;
int32_t pcmval;
uint8_t level = certain value;
float multiplier = tan(level/100.0);
for (ctr = 0; ctr < 1024; ctr++) {pcmval = pcm[ctr] * multiplier;if (pcmval < 32767 && pcmval > -32768) {pcm[ctr] = pcmval} else if (pcmval > 32767) {pcm[ctr] = 32767;} else if (pcmval < -32768) {pcm[ctr] = -32768;}
}
其中level取值需要具体测试实现,一般使用时level取值为某个范围的几个数,比如取10个数,这样音量就有10个阶跃可以调节。
如下图,最后声音音量近似按对数关系增长了:
如果想了解利用对数关系调节音量的具体实现,请参考:
PCM音量控制
音频处理——解析PCM格式实例(音量调控)相关推荐
- 【FFmpeg杂记】音频解码输出PCM格式数据分析
FFmpeg音频解码后输出的为PCM数据,PCM中的声音数据没有被压缩. FFmpeg中音视频数据基本上都有Packed和Planar两种存储方式,对于双声道音频来说,Packed方式为两个声 ...
- 音视频学习(十一、PCM格式介绍)
我们原始的音频数据就是PCM格式,通过咪头采样会来的数据也是PCM格式,所以有必要多普及一下音频的基础知识.我基础也不好,这是转载了一篇写的比较不错的博客,大家一起学习. 这是一篇转载的文章,转载的链 ...
- Android 音视频开发(一):PCM 格式音频的播放与采集
什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...
- 【Android RTMP】音频数据采集编码 ( FAAC 头文件与静态库拷贝到 AS | CMakeList.txt 配置 FAAC | AudioRecord 音频采样 PCM 格式 )
文章目录 安卓直播推流专栏博客总结 一. FAAC 头文件与静态库拷贝到 Android Studio 二. CMakeList.txt 构建脚本配置 三. Java 层 AudioRecord 音频 ...
- Android音频处理 PCM格式
Android音频处理--通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能 Android音频开发(2):使用AudioRecord录制pcm格式音频 AudioTrack读取 ...
- php解析xml数据格式,PHP解析xml格式数据工具类实例分享
本文主要介绍了PHP解析xml格式数据工具类,涉及php针对xml格式数据节点添加.获取.解析等相关操作技巧,需要的朋友可以参考下,希望能帮助到大家. 本文实例讲述了PHP解析xml格式数据工具类.分 ...
- 【转】PCM Audio,PCM格式音频文件 详解
PCM文件:模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志.Windows的Convert工具可以把PCM音频格式的文件转换成Microsoft的WAV ...
- ffmpeg提取音频文件命令并转化成pcm格式
本文转载自:https://blog.csdn.net/u014552102/article/details/82734278 一.PCM文件的定义 PCM文件:模拟音频信号经模数转换(A/D变 ...
- window API播放pcm格式音频文件,函数waveOutOpen等
之前在我的博客中有一篇关于编写录音器的代码,可保存为pcm和wav格式,说白了其实两者是一个东西,只不过wav比pcm多了一个文件头,这个文件头一共占了44个字节.此处这个不是重点,重点是如何编写程序 ...
- 解析XML格式数据实例
前言: 网络数据传输时,最常用的格式有两种:XML和JSON,下面我们就研究如何使用Pull解析和Sex解析来实现对XML格式文件数据的解析. 实例流程: 1.创建服务器:Apache服务器(用于模拟 ...
最新文章
- YOTO来了!你只需训练一次,谷歌大脑提出调参新trick
- 对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
- nc361t支持的服务器,Windows Server 2008 R2通过IP安全策略阻止某个IP
- 小波的秘密10_小波包的数学支撑
- 阿里云机器学习PAI构建AI集团军作战,联手Intel在AI软硬件领域发力
- 如何选择漏电保护器规格型号_三相四线漏电保护器型号要如何选
- java空心三角形_java经典算法_019打印三角形(空心,实心)
- 转载:必须掌握的八个【cmd 命令行】
- Spring Batch 使用指南
- JBOSS5+ActiveMQ5.7集成
- C#与Matlab混合编程中遇到的“MathWorks.MATLAB.NET.Arrays.MWNumericArray”的类型初始值设定项引发异常。
- 60多年来计算机是根据什么的发展,计算机复习题98197.doc
- 基于jQuery8款超赞的评分插件
- 网站生成EXE文件运行——PHP网站打包工具PHPWAMP
- 手写数字识别:CNN-AlexNet
- 李某人的第一篇blog
- tex 表格内容换行_{Latex}{Tabular}文本超出表格自动换行
- 七牛云 Java Web上传图片
- visual 创建c语言程序吗,visual studio怎么创建c语言
- jq 数字转中文数字_阿拉伯数字 转换 中文大写