音频开发之PCM

日常的多媒体开发工作中,音频是我们经常需要处理的数据,而PCM格式多的令人发指,本文通过介绍PCM的历史和规格,让你对PCM有更深一步的了解。

概念

PCM, Pluse Code Modulation, 脉冲编码调制,它是将模拟信号转化为数字信号的方法。

当我们在多媒体应用领域里,PCM则代表这一类音频的编码方式的总称,它的子类型包括有LPCM,DPCM,ADPCM等。

起源

1837年,美国发明家Samuel Morse发明了电报通信技术,结合他发明的摩斯电码,可以成功的将文字信息通过电缆发送给对端,解决了困扰人类很长时间的远距离通信的问题,令人正奋。

但是,铺设成本很高的电缆如果智能只能完成一路的电报信号传送是极大的浪费,如何提高电缆通信容量是运营商必须解决的问题。“分时多路复用(Time-Division Multiplexing, 简称TDM)”概念于是就诞生了。

美国发明家Moses G.Farmar在1853年提出了TDM,信号采样的方法也是为了这个实现这个目标而创造的。

1903年,电气工程师W.M.Miner使用电力驱动机械交换器实现了TDM,并尝试将它应用在电话通信系统,但由于当时采样率太低(只有3.5-4.3Khz),无法满足语音通讯要求,最终没有能够实际商用。

1937年,英国工程师Alec Reeves在为法国的”国际电话电话”项目的开发工作中,设计了PCM通信系统,并描述了该系统的实现理论和使用优点,虽然没有在项目中使用,却给后来的工程师提供了理论支撑。贝尔实验室二战时,参考Reeves当年的设计理论来实现了SIGSALY系统,用于同盟军的高级通信。

至于PCM发明者是谁一直存在争议,美国的NIHF组织把它授予了Bernard M.Oliver和Claude Shannon。

实现

调制(采样和量化)

采样,就是将信号从连续时间域上的模拟信号转换到离散时间域上的离散信号的过程,是通过采样器来实现的。

量化,通常是伴随采样过程一起发生的,每个采样点的振幅幅度经过模数转换器进行数值化。这样就可以得到一个在时域和数值上离散的数字信号。

通过下面的示图,我们可以了解一个正弦模拟信号是如何被采样和量化的。

采样&量化

上图展示了采样和量化中的几个关键参数:

1、采样率

采样率是用于描述相邻两次采样之间的时间间隔。

“为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍” –奈奎斯特-香农采样定律。

人类正常说话的声音频率最高为3.4Khz,所以早期的电话通信系统使用8KHz采样率,64Kbps的码率的DS0通信标准就可以满足要求;而我们人类耳朵能听到的最高声音频率为20KHz,所以CD碟中的音乐编码的采样率是44.1KHz(不觉得这个数字奇怪么?点我)。

采样率并不是越高越好,一方面是需要更高级的采样器,另外一方面通过采样率提高带了声音提升不明显也不必要。

2 、采样位宽

位宽表示用一个多大范围的数值集来表示采样点的振幅值。

比如图中只需要一个4bit的二进制就可以描述[0,15]这十六个等级的振幅值,我们常用的是8bit和16bit。

因为量化过程中一定会存在就近取值的操作,而这个操作就会引入偏差,我们称之为量化噪声。为了减小量化噪声,通过增加量化等级也就是位宽是可以达到的,但是就像采样率一样,也并非越高越好,位宽也高,编码后的数据也越大,同时对于声音质量提升也逐渐不明显。

3、字节序

当量化值使用超过1个字节来表示的时候,就需要明确字节序(大小端)。

4、符号

如果采样是8bit,是否有符号,决定了范围和中心值,比如对于有符号的8bit来说,范围是[-128,127],中心值是0;而对于无符号的8bit来说,范围是[0,255],中心值是128。

5、整型还是浮点

使用整型值来进行量化是常用做法,但是也有特殊算法为了提高精确度,使用浮点型。

编码

数值量化有很多数学表达方式,也就有了很多编码方式,下面介绍几种常见的编码方式

  • LPCM, Linear Pulse Code Modulation, 线性脉冲编码调制
    • 无损非压缩算法
    • 广泛使用的音频编码格式,CD和磁带中常用
    • WAVE音频格式文件默认编码方式
    • 单声道编码,使用交织方式可以支持双声道或者立体声编码
    • 经常使用PCM来代替LPCM
    • FFMPEG支持的格式有(主要是浮点和整型,有符号和无符号)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
        D.A..S pcm_f16le            PCM 16.8 floating point little-endian
        D.A..S pcm_f24le            PCM 24.0 floating point little-endian
        DEA..S pcm_f32be            PCM 32-bit floating point big-endian
        DEA..S pcm_f32le            PCM 32-bit floating point little-endian
        DEA..S pcm_f64be            PCM 64-bit floating point big-endian
        DEA..S pcm_f64le            PCM 64-bit floating point little-endian
        D.A..S pcm_lxf              PCM signed 20-bit little-endian planar
        DEA.L. pcm_mulaw            PCM mu-law / G.711 mu-law (decoders: pcm_mulaw pcm_mulaw_at ) (encoders: pcm_mulaw pcm_mulaw_at )
        DEA..S pcm_s16be            PCM signed 16-bit big-endian
        DEA..S pcm_s16be_planar     PCM signed 16-bit big-endian planar
        DEA..S pcm_s16le            PCM signed 16-bit little-endian
        DEA..S pcm_s16le_planar     PCM signed 16-bit little-endian planar
        DEA..S pcm_s24be            PCM signed 24-bit big-endian
        DEA..S pcm_s24daud          PCM D-Cinema audio signed 24-bit
        DEA..S pcm_s24le            PCM signed 24-bit little-endian
        DEA..S pcm_s24le_planar     PCM signed 24-bit little-endian planar
        DEA..S pcm_s32be            PCM signed 32-bit big-endian
        DEA..S pcm_s32le            PCM signed 32-bit little-endian
        DEA..S pcm_s32le_planar     PCM signed 32-bit little-endian planar
        DEA..S pcm_s64be            PCM signed 64-bit big-endian
        DEA..S pcm_s64le            PCM signed 64-bit little-endian
        DEA..S pcm_s8               PCM signed 8-bit
        DEA..S pcm_s8_planar        PCM signed 8-bit planar
        DEA..S pcm_u16be            PCM unsigned 16-bit big-endian
        DEA..S pcm_u16le            PCM unsigned 16-bit little-endian
        DEA..S pcm_u24be            PCM unsigned 24-bit big-endian
        DEA..S pcm_u24le            PCM unsigned 24-bit little-endian
        DEA..S pcm_u32be            PCM unsigned 32-bit big-endian
        DEA..S pcm_u32le            PCM unsigned 32-bit little-endian
        DEA..S pcm_u8               PCM unsigned 8-bit
      
  • DPCM, Differential Pulse Code Modulation, 脉冲差量编码调制
    • 基于PCM,只编码当前和下一个采样之间的差值
    • 压缩算饭,可以相对LPCM节省25%的编码大小
  • ADPCM,Adaptive Differential Pulse Code Modulation, 自适应差分脉冲编码调制
    • 基于DPCM
    • 有损压缩算法
    • 通常声音信号有连续性,相邻的采样点有较高的相关性,使用先前的采样点去估算当前采样点,可以减少冗余信息,降低编码带宽。
    • ADPCM-IMA
      • Interactive Multimedia Association, IMA,该算法是由该组织针对多媒体应用领域开发的
      • 通过查表定点预测替换掉复杂的浮点数学运算,极大地降低了算法的复杂度
      • 优点在于它的简单性,适用于各种音频信号,支持任意的音频采样率,较高的压缩率(4:1),并且具有良好的音频质量
      • FFMPEG支持很多ADPCM-IMA的封包格式

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
           D.A.L. adpcm_ima_amv        ADPCM IMA AMV
           D.A.L. adpcm_ima_apc        ADPCM IMA CRYO APC
           D.A.L. adpcm_ima_dat4       ADPCM IMA Eurocom DAT4
           D.A.L. adpcm_ima_dk3        ADPCM IMA Duck DK3
           D.A.L. adpcm_ima_dk4        ADPCM IMA Duck DK4
           D.A.L. adpcm_ima_ea_eacs    ADPCM IMA Electronic Arts EACS
           D.A.L. adpcm_ima_ea_sead    ADPCM IMA Electronic Arts SEAD
           D.A.L. adpcm_ima_iss        ADPCM IMA Funcom ISS
           D.A.L. adpcm_ima_oki        ADPCM IMA Dialogic OKI
           DEA.L. adpcm_ima_qt         ADPCM IMA QuickTime (decoders: adpcm_ima_qt adpcm_ima_qt_at )
           D.A.L. adpcm_ima_rad        ADPCM IMA Radical
           D.A.L. adpcm_ima_smjpeg     ADPCM IMA Loki SDL MJPEG
           DEA.L. adpcm_ima_wav        ADPCM IMA WAV
           D.A.L. adpcm_ima_ws         ADPCM IMA Westwood
        
  • Logarithmic PCM
    • 非线性进行量化,而是使用对数形式
    • 最早实现方式主要有两种,一种是ulaw(mulaw),主要是在北美和日本地区流行使用,另外一种是alaw(A-law),则主要在欧洲和其他地区流行,
    • ITU-T标准组织把ulaw和alaw做了规范,并发布为G711.A和G711.u, 他们的采样率都是8KHz,码率是64kbps,压缩率为2
    • G726编码算法实现是把8bit的alaw或者ulaw映射到4bit的ADPCM采样,这样可以进一步压缩编码,但是是有损的,可能会影响声音质量

44.1KHz是怎么来的?

早期数码音频是通过PCM编码器和录像机来录制完成的。

PCM编码器将音频信号转换为电视信号,拆分为不连续的数据块,以电视信号扫描线为基础的数据流,这样可以在不改造录像机的情况下,完成音频的录制。

磁迹是录像机用来记录电视信号的,每条磁迹对应电视信号中的一条扫描线,PAL是当时流行的电视信号制式,50Hz的场频,625的行扫描线,采用隔行扫描。

对于PAL制式的录像机来说,每秒钟可以记录的磁迹就是“场频x行扫描数”,因为是隔行扫描(除以2),而且还有上下端的丢弃,所以PAL的实际行扫描线是294,因为信息容量限制,所以规定每条磁迹最多只能存放三个离散的数据块,所以总共可以记录的数据块是50x294x3,也就是44100,这个数据块如果存放的音频采样数据,44100就是采样率。