目录

  • 举例
  • 音量控制
    • 数据溢出
    • 对数描述

举例

要注意的是,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格式实例(音量调控)相关推荐

  1. 【FFmpeg杂记】音频解码输出PCM格式数据分析

      FFmpeg音频解码后输出的为PCM数据,PCM中的声音数据没有被压缩.   FFmpeg中音视频数据基本上都有Packed和Planar两种存储方式,对于双声道音频来说,Packed方式为两个声 ...

  2. 音视频学习(十一、PCM格式介绍)

    我们原始的音频数据就是PCM格式,通过咪头采样会来的数据也是PCM格式,所以有必要多普及一下音频的基础知识.我基础也不好,这是转载了一篇写的比较不错的博客,大家一起学习. 这是一篇转载的文章,转载的链 ...

  3. Android 音视频开发(一):PCM 格式音频的播放与采集

    什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...

  4. 【Android RTMP】音频数据采集编码 ( FAAC 头文件与静态库拷贝到 AS | CMakeList.txt 配置 FAAC | AudioRecord 音频采样 PCM 格式 )

    文章目录 安卓直播推流专栏博客总结 一. FAAC 头文件与静态库拷贝到 Android Studio 二. CMakeList.txt 构建脚本配置 三. Java 层 AudioRecord 音频 ...

  5. Android音频处理 PCM格式

    Android音频处理--通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能 Android音频开发(2):使用AudioRecord录制pcm格式音频 AudioTrack读取 ...

  6. php解析xml数据格式,PHP解析xml格式数据工具类实例分享

    本文主要介绍了PHP解析xml格式数据工具类,涉及php针对xml格式数据节点添加.获取.解析等相关操作技巧,需要的朋友可以参考下,希望能帮助到大家. 本文实例讲述了PHP解析xml格式数据工具类.分 ...

  7. 【转】PCM Audio,PCM格式音频文件 详解

    PCM文件:模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志.Windows的Convert工具可以把PCM音频格式的文件转换成Microsoft的WAV ...

  8. ffmpeg提取音频文件命令并转化成pcm格式

    本文转载自:https://blog.csdn.net/u014552102/article/details/82734278 一.PCM文件的定义    PCM文件:模拟音频信号经模数转换(A/D变 ...

  9. window API播放pcm格式音频文件,函数waveOutOpen等

    之前在我的博客中有一篇关于编写录音器的代码,可保存为pcm和wav格式,说白了其实两者是一个东西,只不过wav比pcm多了一个文件头,这个文件头一共占了44个字节.此处这个不是重点,重点是如何编写程序 ...

  10. 解析XML格式数据实例

    前言: 网络数据传输时,最常用的格式有两种:XML和JSON,下面我们就研究如何使用Pull解析和Sex解析来实现对XML格式文件数据的解析. 实例流程: 1.创建服务器:Apache服务器(用于模拟 ...

最新文章

  1. YOTO来了!你只需训练一次,谷歌大脑提出调参新trick
  2. 对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
  3. nc361t支持的服务器,Windows Server 2008 R2通过IP安全策略阻止某个IP
  4. 小波的秘密10_小波包的数学支撑
  5. 阿里云机器学习PAI构建AI集团军作战,联手Intel在AI软硬件领域发力
  6. 如何选择漏电保护器规格型号_三相四线漏电保护器型号要如何选
  7. java空心三角形_java经典算法_019打印三角形(空心,实心)
  8. 转载:必须掌握的八个【cmd 命令行】
  9. Spring Batch 使用指南
  10. JBOSS5+ActiveMQ5.7集成
  11. C#与Matlab混合编程中遇到的“MathWorks.MATLAB.NET.Arrays.MWNumericArray”的类型初始值设定项引发异常。
  12. 60多年来计算机是根据什么的发展,计算机复习题98197.doc
  13. 基于jQuery8款超赞的评分插件
  14. 网站生成EXE文件运行——PHP网站打包工具PHPWAMP
  15. 手写数字识别:CNN-AlexNet
  16. 李某人的第一篇blog
  17. tex 表格内容换行_{Latex}{Tabular}文本超出表格自动换行
  18. 七牛云 Java Web上传图片
  19. visual 创建c语言程序吗,visual studio怎么创建c语言
  20. jq 数字转中文数字_阿拉伯数字 转换 中文大写

热门文章

  1. python写dnf脚本怎么过检测_DNF脚本会被检测到吗?
  2. 入侵无盘系统服务器,比有盘还快!梅捷带你体验锐起无盘系统
  3. php日历表代码,PHP实现的简单日历代码_php
  4. 二、安装Robot framework-selenium2library
  5. 易语言64位进程注入DLL
  6. 统赢编程软件_统赢PressCAD线割慢走丝编程软件的线割上下异形编程设定
  7. ID2021安装教程【科技猿说】
  8. Access数据库语句大全
  9. keil5点击调试提示SarmCM3.dll文件缺少问题
  10. JUnit 4 vs JUnit 5