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

article/2025/9/30 19:25:52

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

这是一篇转载的文章,转载的链接:PCM数据格式介绍

11.1 音频基础

声音是由物体的振动产生的,这种振动引起了周围空气压强的震荡,我们称这种震荡的函数表现形式为波形。
在这里插入图片描述
声音的频率就是周期的倒数,表示声音在1秒钟内的周期数,单位是hz,48Khz,就是表示1秒钟震荡了18k次。

现实生活中我们听到的声音是连续的,但是在计算机中只能处理数字信号,不能处理模拟信号,所以我们只能通过采样的方式,把模拟信号转化成数字信号,
在这里插入图片描述
假设 44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声),采集4分钟的数据:44100162460=338688000bit=40M,这个数据就是没经过压缩的音频数据,我们叫做PCM数据。

11.2 PCM介绍

PCM全称Pulse-Code Modulation,翻译一下是脉冲调制编码。

其实大可以不用关心英文释义,之所以这么命名是因为一些历史原因。

在音视频中,PCM是一种用数字表示采样模拟信号的方法。

要将一段音频模拟信号转换为数字表示,包含如下三个步骤:

  1. Sampling(采样)
  2. Quantization(量化)
  3. Coding(编码)

通常,我们可以通过一条曲线在坐标中显示连续的模拟信号,如下图所示:
在这里插入图片描述
为了更容易理解PCM,取其中一段来说明。
在这里插入图片描述

假设这表示一段一秒的音频模拟信号。
在这里插入图片描述

11.2.1 Sampling(采样)

Sampling(采样)处理,实际上就是让采样数据能够完全表示原始信号,且采样数据能够通过重构还原成原始信号的过程,如上图。

将采样后的图拿出来单独解释:
在这里插入图片描述

  1. 红色曲线:表示原始信号。
  2. 蓝色垂直线段:表示当前时间点对原始信号的一次采样。采样是一系列基于振幅(amplitude和相同时间间隔的样本。这也是为什么采样过程被称为PAM的原因。
  3. PAM:(Pulse Amplitude Modulation)是一系列离散样本之的结果。

11.2.2 采样率(Sample rate)

每秒钟的样本数也被称之为采样率(Sample rate)。在Sampling图示案例中,采样率为每秒34次。意味着在一秒的时间内,原始信号被采样了34次(也就是蓝色垂直线段的数量)。

通常,采样率的单位用Hz表示,例如1Hz表示每秒钟对原始信号采样一次,1KHz表示每秒钟采样1000次。1MHz表示每秒钟采样1百万次。

根据场景的不同,采样率也有所不同,采样率越高,声音的还原程度越高,质量就越好,同时占用空间会变大。

例如:通话时的采样率为8KHz,常用的媒体采样率有44KHz,对于一些蓝光影片采样率高达1MHz。
在这里插入图片描述

11.2.3 Quantization(量化)

原始信号采样后,需要通过量化来描述采样数据的大小。如图:
在这里插入图片描述
量化处理过程,就是将时间连续的信号,处理成时间离散的信号,并用实数表示。这些实数将被转换为二进制数用于模拟信号的存储和传输。

在图例中,如果说采样是画垂直线段的话,那么量化就是画水平线,用于衡量每次采样的数字指标。如图:
在这里插入图片描述
图中,每条横线表示一个等级(level)。

为了更好的描述量化过程,先来介绍一下bit-depth(位深):用来描述存储数字信号值的bit数。较常用的模拟信号位深有:

8-bit:2^8 = 256 levels,有256个等级可以用于衡量真实的模拟信号。
16-bit:2^16 = 65,536 levels,有65,536个等级可以用于衡量真实的模拟信号。
24-bit:2^24 = 16,666,216 levels,有16,666,216个等级可以用于衡量真实的模拟信号。
显而易见,位深越大,对模拟信号的描述将越真实,对声音的描述更加准确。

在当前例子中,如果用为8-bit位深来描述的话,就如下图所示:
在这里插入图片描述
量化的过程就是将一个平顶样本四舍五入到一个可用最近level描述的过程。如图中黑色加粗梯形折线。量化过程中,我们将尽量让每个采样和一个level匹配,因为每个level都是表示一个bit值。

图中,第9次采样的平顶样本对应的level用十进制表示为255,也就是二进制的1111 1111。

11.2.4 Encoding(编码)

在这里插入图片描述
在编码这一步,我们会将时间线上的每个sample数据转化为对应的二进制数据。

采样数据经过编码后产生的二进制数据,就是PCM数据。PCM数据可以直接存储在介质上,也可以在经过编解码处理后进行存储或传输。

11.2.5 PCM数据常用量化指标

采样率(Sample rate):每秒钟采样多少次,以Hz为单位。详见:**采样率(Sample rate)**一节。

位深度(Bit-depth):表示用多少个二进制位来描述采样数据,一般为16bit。详见:**Quantization(量化)**一节。

字节序:表示音频PCM数据存储的字节序是大端存储(big-endian)还是小端存储(little-endian),为了数据处理效率的高效,通常为小端存储。

声道数(channel number):当前PCM文件中包含的声道数,是单声道(mono)、双声道(stereo)?此外还有5.1声道等。

声道布局:立体声,低音炮(2.1声道),5.1环绕立体声

采样数据是否有符号(Sign):要表达的就是字面上的意思,需要注意的是,使用有符号的采样数据不能用无符号的方式播放。

以FFmpeg中常见的PCM数据格式s16le为例:它描述的是有符号16位小端PCM数据。

s表示有符号,16表示位深,le表示小端存储。

比特率:没有压缩的音频数据的比特率 = 采样频率 * 采样精度 * 通道数。

码率:压缩后的音频数据的比特率,常见的码率有:
在这里插入图片描述
:音频的帧的概念没有视频帧那么清晰,几乎所有视频编码格式都可以简单的认为一帧就是编码后的一张图像。
帧长:
(1)可以指每帧采样数播放的时间,mp3 48K,1152个采样点,每帧则为24ms;aac则是每帧是1024个采样点。攒够一帧的数据才送去做编码。
(2)也可以指压缩后每帧的数据长度,所以需要注意。

每帧持续时间(秒)=每帧采样点数/采样频率(hz)

11.2.6 PCM数据流

如果是单声道的音频文件,采样数据按时间的先后顺序依次存入(有的时候也会采用LRLRLR方式存储,只是另一个声道的数据为0),如果是双声道的话就按照LRLRLR的方式存储,存储的时候还和机器的大小端有关。大端模式如下图所示:
在这里插入图片描述

如果我们有一个PCM文件,在代码中,我们可以通过以下方式来读取这样的PCM数据流(Stream)。

FILE *file
int8_t *buffer;
file = fopen("PCM file path");
buffer = malloc(fileSize);
fread(buffer, sizeof(int8_t), fileSize / sizeof(int8_t), file);

伪代码仅仅表示一种加载方式。但在代码中,一开始就将整个文件加载到了内存中,这是不对的。因为我们的音频数据量往往会比较大,一次性全部加载增加了内存负担,而且并不必要。

通常我们会为buffer分配一个固定的长度,例如2048字节,通过循环的方式一边从文件中加载PCM数据,一边播放。

加载好PCM数据后,需要送到音频设备驱动程序中播放,这时我们应该能听到声音。与PCM数数据一同到达驱动程序的通常还有采样率(sample rate),用来告诉驱动每秒钟应该播放多少个采样数据。如果传递给驱动程序的采样率大于PCM实际采样率,那么声音的播放速度将比实际速度快,反之亦然。

存储方式可能还有交错和非交错的方式:
在这里插入图片描述

不同的驱动程序对于多声道数据的排列方式可能稍有区别,下面是常用的声道排列地图:

2:  FL FR                       (stereo)
3:  FL FR LFE                   (2.1 surround)
4:  FL FR BL BR                 (quad)
5:  FL FR FC BL BR              (quad + center)
6:  FL FR FC LFE SL SR          (5.1 surround - last two can also be BL BR)
7:  FL FR FC LFE BC SL SR       (6.1 surround)
8:  FL FR FC LFE BL BR SL SR    (7.1 surround)

11.2.7 音量控制

音量的表示实际上就是量化过程中每个采样数据的level值,只要适当的增大或者缩小采样的level就可以达到更改音量的目的。

但需要说明的是,并是不将level值*2就能得到两倍于原声音的音量。

因为如下两个原因:

  1. 数据溢出:
    我们都知道每个采样数据的取值范围是有限制的,例如一个signed 8-bit样本,取值范围为-128~128,值为125时,放大两倍后的值为250,超过了可描述的范围,此时发生了数据溢出。这个时候就需要我们做策略性的裁剪处理,使放大后的值符合当前格式的取值区间。

如下伪代码描述了signed 8-bit格式的声音放大两倍的裁剪处理:

int16_t pcm[1024] = read in some pcm data;
int32_t pcmval;
for (ctr = 0; ctr < 1024; ctr++) {pcmval = pcm[ctr] * 2;if (pcmval < 128 && pcmval > -128) {pcm[ctr] = pcmval} else if (pcmval > 128) {pcm[ctr] = 128;} else if (pcmval < -128) {pcm[ctr] = -128;}
}
  1. 对数描述:
    平时表示声音强度我们都是用分贝(db)作单位的,声学领域中,分贝的定义是声源功率与基准声功率比值的对数乘以10的数值。根据人耳的心理声学模型,人耳对声音感知程度是对数关系,而不是线性关系。人类的听觉反应是基于声音的相对变化而非绝对的变化。对数标度正好能模仿人类耳朵对声音的反应。所以用分贝作单位描述声音强度更符合人类对声音强度的感知。前面我们直接将声音乘以某个值,也就是线性调节,调节音量时会感觉到刚开始音量变化很快,后面调的话好像都没啥变化,使用对数关系调节音量的话声音听起来就会均匀增大。

如下图所示,横轴表示音量调节滑块,纵坐标表示人耳感知到的音量,图中取了两块横轴变化相同的区域,音量滑块滑动变化一样,但是人耳感觉到的音量变化是不一样的,在左侧也就是较安静的地方,感觉到音量变化大,在右侧声音较大区域人耳感觉到的音量变化较小。
在这里插入图片描述

这就需要对音量值的乘数系数合理取值。具体如何取值,请参考非常专业的一篇文章:PCM音量控制

11.2.8 采样率调整

采样率的定义为:每秒钟采样次数。而降低增加采样率只需要以固定的频率复制或者丢弃采样数据即可。

如10Hz表示每秒钟采样10次,我们只需要将2*n(n为从0开始的值)处的采样数据舍弃,就可以得到10/2 = 5Hz的采样数据。


http://chatgpt.dhexx.cn/article/BjyBpVd7.shtml

相关文章

python 实现录音pcm格式功能

一、目的 在实现键盘控制程序开始之后,实现自动录音生成pcm格式function。 要考虑的问题:实时录音,录音结束的条件(阈值)。主要工具: speech_recognition包,代码简单、效果好。 二、电脑录音 (包括使用树莓派时的问题) 主要参考: github https://github.com/Uberi/…

使用Audition将PCM格式转Wav格式

背景&#xff1a;电脑中有若干PCM文件&#xff0c;想要转成Wav格式保存&#xff0c;一般播放器或者格式工厂都可以转存&#xff0c;这里用到的是Adobe Audition&#xff0c;PC是Mac端&#xff0c;仅供参考。 音频格式即音乐格式。音频格式是指要在计算机内播放或是处理音频文件…

matlab输出pcm格式文件

用cooledit打开的话&#xff0c;要用matlab输出为PCM格式。 在matlab中输出pcm格式要怎么做呢&#xff1f; 用法&#xff1a; fwrite&#xff08;fileid&#xff0c;参数&#xff0c;格式&#xff09;&#xff1b; 为了用cooledit正确地打开&#xff0c;我们应该要用二进制输出…

PCM格式

算是上课吧,感谢原作者~ 1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声); 22050HZ 8bit mono: 每秒钟有 22050 次采样, 采样数据用 8 位(1…

wav pcm格式文件解析

首先取一个wav文件&#xff0c;其次找一个wav文件格式简单符合pcm编码的&#xff0c;也就是文件的第14字节位置要为1 确认此wav文件此处为01 00 然后进行解析 然后我们还要知道他的位宽&#xff08;8位还是16位&#xff09;、几声道&#xff08;单声道还是双声道&#xff09;…

VS语音信号处理(4) C语言WAV格式语音存为PCM格式语音工程实例

VS语音信号处理&#xff08;4&#xff09; C语言WAV格式语音存为PCM格式语音工程实例 前言一. 工程实现二. 生成编译三. 小结 前言 语音识别相关算法一般在MATLAB上进行仿真验证与实验&#xff0c;在工程上一般还是在VS中进行实现落地&#xff0c;本系列将介绍语音信号处理在C…

PCM格式详解

PCM格式详解 简介&#xff1a; PCM(Pulse Code Modulation)&#xff0c;脉冲编码调制。人耳听到的是模拟信号&#xff0c;PCM是把声音从模拟信号转化为数字信号的技术。原理是用一个固定的频率对模拟信号进行采样&#xff0c;采样后的信号在波形上看就像一串连续的幅值不一的…

PCM数据格式

1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2字节)记录, 双声道(立体声); 22050HZ 8bit mono: 每秒钟有 22050 次采样, 采样数据用 8 位(1字节)记录, 单声道; 当然…

PCM编码格式

目录 一、PCM音频编码格式 1. 相关英文单词 2. PCM数据结构 2.1 单声道数据 2.2 多声道数据 2.3 小结 二、WAV音频文件格式 一、PCM音频编码格式 1. 相关英文单词 Amplitude&#xff1a;幅度 PAM&#xff1a;Pulse Amplitude Modulation 脉冲幅度调制(数字信号过程采样…

音频处理——详解PCM数据格式

目录 知识储备什么是PCM采样采样率重采样 量化编码PCM常用指标 PCM数据流 知识储备 音频处理——音频编码原理简介 音频处理——音频处理的基本概念 什么是PCM PCM全称Pulse-Code Modulation&#xff0c;翻译一下是脉冲调制编码。 在音视频中&#xff0c;PCM是一种用数字表…

PCM格式介绍

转自&#xff1a;http://www.cnblogs.com/cheney23reg/archive/2010/08/08/1795067.html http://wiki.multimedia.cx/index.php?titlePCM PCM数据格式 PCM(Pulse Code Modulation)也被称为 脉码编码调制。PCM中的声音数据没有被压缩&#xff0c;如果是单声道的文件&#xff…

PCM文件格式简介(比较专业)

PCM文件&#xff1a;模拟音频信号经模数转换&#xff08;A/D变换&#xff09;直接形成的二进制序列&#xff0c;该文件没有附加的文件头和文件结束标志。Windows的Convert工具可以把PCM音频格式的文件转换成Microsoft的WAV格式的文件。 脉冲编码调制PCM文件格式简介 将音频数…

PCM数据格式介绍

目录 什么是PCM Sampling&#xff08;采样&#xff09; 采样率(Sample rate) Quantization&#xff08;量化&#xff09; Encoding&#xff08;编码&#xff09; PCM数据常用量化指标 PCM数据流 音量控制 采样率调整 什么是PCM PCM全称Pulse-Code Modulation&#xff…

PCM音频数据格式介绍

1. What is PCM? PCM(Pulse-code-modulation)是模拟信号以固定的采样频率转换成数字信号后的表现形式。 Sample Rate : 采样频率单位为&#xff1a;Hz。采样频率越高&#xff0c;音频质量越好&#xff0c;占用空间也越大。 Sign : 音频数据是否是有符号的。通常情况下都是有…

单调栈图文详解(附Java模板)

啥是"单调栈"&#xff0c;它能解决什么样的问题&#xff1f; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 数据结构与算法专栏的文章图文并茂&#x1f995;生动形象&#…

算法之单调栈常见题目

什么时候需要使用单调栈&#xff1f; 通常是一维数组&#xff0c;要寻找任意一个右边或者左边第一个比自己大或小的元素的位置&#xff0c;此时我们就想到可以使用单调栈了。 单调栈的本质是空间换时间&#xff0c;因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高…

单调栈及单调栈的应用

什么是单调栈 单调递增栈&#xff1a;单调递增栈就是从栈底到栈顶数据是从大到小单调递减栈&#xff1a;单调递减栈就是从栈底到栈顶数据是从小到大 解决那类问题 要知道单调栈的适用于解决什么样的问题&#xff0c;我们首先需要知道单调栈的作用。单调栈分为单调递增栈和单调…

理解单调栈与单调队列

单调栈 单调栈&#xff1a;栈内的元素按照某种方式排序下单调递增或单调递减&#xff0c;如果新入栈的元素破坏的单调性&#xff0c;就弹出栈内元素&#xff0c;直到满足单调性。 单调栈分为单调递增栈和单调递减栈&#xff1a; 单调递增栈&#xff1a;栈中数据入栈或出栈的…

【栈 单调栈】浅谈单调栈与单调栈的理解

单调栈 定义&#xff1a; 单调栈&#xff0c;顾名思义&#xff0c;是栈内元素保持一定单调性&#xff08;单调递增或单调递减&#xff09;的栈。这里的单调递增或递减是指的从栈顶到栈底单调递增或递减。既然是栈&#xff0c;就满足后进先出的特点。与之相对应的是单调队列。 …

单调栈(一)

单调栈基本概念及实现 方案1&#xff1a;对于每一个数&#xff0c;遍历其左右位置&#xff0c;时间复杂度为O(N^2) 方案2&#xff1a;单调栈&#xff0c;每个元素入栈一次出栈一次&#xff0c;时间复杂度为O(N) &#xff08;一&#xff09;数组中没有重复值 示例&#xff1a;[…