音频基础--PCM音频

1、PCM定义

  PCM 全称 Pulse-Code Modulation,就是脉冲调制编码,是用于将波形表示的模拟音频信号转换为数字1和0表示的数字音频信号,而不压缩也不丢失信息的处理技术。简单来说就是一种用数字表示采样模拟信号的方法

  如下是使用Audacity音频处理软件截取1~2s的时间段内音频波形图:
在这里插入图片描述
  我们再对这个区间的波形图进行放大:

在这里插入图片描述

  上面一个像火柴棒的是什么?它其实就是一个样本,接下来介绍PCM 几个重要问题:采样(Sampling) 、量化(Quantization) 、编码(Coding)、声道存储

2、采样

  通常自然界的声音可以通过一条曲线在坐标中显示连续的模拟信号表示:
在这里插入图片描述  为了更加容易理解 PCM,选取其中的一个波形,假设这一个波形表示一秒的音频模拟信号。则采样可以如下图所示:
在这里插入图片描述
  其中红色的曲线表示原始信号;蓝色垂直线段表示是当前时间点对原始信号的一次采样。

  采样率:sampel rate,每秒钟采集的样本数,采样频率一般越大,转换失真越小,声音的还原度就越高,质量越好,同时占用的空间也会越大。。常见的采用率有:44100HZ,48000HZ和91KHZ。

3、量化

  原始信号采样后,需要通过量化来描述采样数据的大小。
在这里插入图片描述
  量化处理过程,就是将时间连续的信号,处理成时间离散的信号,并用实数表示。这些实数将被转换为二进制数用于模拟信号的存储和传输。在图例中,如果说采样是画垂直线段的话,那么量化就是画水平线,用于衡量每次采样的数字指标:
在这里插入图片描述
  每条横线表示一个等级(level),为了更好的描述量化过程.引入位深(bit-depth) 概念:用来描述存储数字信号值的 bit 数。
常用的模拟信号位深有:

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

  量化的过程就是将一个平顶(同一个高度)样本四舍五入到一个可用最近 level 描述的过程。如图中黑色加粗梯形折线。量化过程中,我们将尽量让每个采样和一个 level 匹配,因为每个 level 都是表示一个 bit 值。

4、编码

在这里插入图片描述
  编码就是将每个 sample 数据转换成二进制数据,该数据就是 PCM 数据。PCM 数据可以直接存储在介质上,也可以在经过编解码处理后进行存储或传输。PCM 数据常用量化指标: 采样率、位深、声道数、采样数据是否有符号(有符号的采样数据不能使用无符号的方式播放)、字节序(表示 PCM 数据是用大端存储还是小端存储,通常是小端存储)。 例如: ffmpeg 常见的 PCM 数据格式 s16le,它表示有符号的 16 位小端pcm 数据.

5、声道

  声道:channel,表示音频采集源的个数,比如:单声道,采集源只有一个;双声道(立体声),采集源有两个,分别为左和右;多声道(环绕声),采集源有多个。声道越多,播放的音频效果越立体,但是存储的数据越大。
 
  对于多声道(大于一个声道)的PCM音频,在实际编码中,我们也按照单声道处理,统称为一个采样,如上面的单声道,双声道和三声道的一个采样大小分别为:8bits,18bits和24bits;可以将多声道分离为一个个单声道。

  通过上面的介绍,我们可以得出如下关系:

  • sample_bits = depth_bits
  • channels_sample_bits = sample_bits* channel
  • samples_bits_per_second = sample_rate * depth_bits * channel = sampe_rate * sample_bits * channel;

6、存储

  例如一段有符号的 8-bit 的 pcm 数据:

+---------+-----------+-----------+----
 binary  | 0010 0000 | 1010 0000 | ...
 decimal | 32        | -96       | ...
+---------+-----------+-----------+----

  其表示的采样范围是 -128 ~ 127. 当含有多通道时候 PCM 数据就会交叉排列(通常)以双声道为例:

+---------+-----------+-----------+-----------+-----------+----
     FL  |     FR    |     FL    |     FR    |     FL    |
+---------+-----------+-----------+-----------+-----------+----

  对于 8-bit 有符号的 PCM 数据而言,上图表示第一个字节存放第一个左声道数据(FL),第二个字节放第一个右声道数据(FR),第三个字节放第二个左声道数据(FL)…不同的驱动程序对于多声道数据的排列方式可能稍有区别,下面是常用的声道排列地图:

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)

  下图展示的是8bit和16bit,单声道和多声道的存储方式示意图:
在这里插入图片描述
  下图展示的左右声道的PCM数据:
在这里插入图片描述
  从以上可以看出,刚开始的4个字节是同一个采样点,其中0x04e8是左声道,0x01c9是右声道,发现是不一样的。通过cool edit pro查看波形:

在这里插入图片描述

  从上图,可以发现左右声道的数据虽然形状类似,但是值得大小不同:

参考资料:
《https://zhuanlan.zhihu.com/p/396273481》
《https://www.cnblogs.com/smartNeo/p/14788021.html》

猜你喜欢

转载自blog.csdn.net/jisuanji111111/article/details/127490926