PCM

PCM(Pulse Code Modulation,脉冲编码调制)是一种用于数字音频信号处理的技术(可以理解为是一种音频数据格式),广泛应用于语音通信、音频存储和信号传输等领域。它的基本原理是将连续的模拟信号(如声音)转换为离散的数字信号,以便进行存储、传输和处理。

PCM的基本工作原理

PCM 的工作原理与 PWM 非常相似,主要包括三个关键步骤:

采样(Sampling)

  • 采样是指按照一定的时间间隔对连续的模拟信号进行测量,以获取其瞬时值。
  • 采样率决定了信号的时间分辨率,通常以 Hz(每秒采样次数)表示。
  • 例如,CD 音频的标准采样率是 44.1 kHz,即每秒钟采样 44100 次。

量化(Quantization)

  • 量化是将采样得到的模拟值映射到离散的数值范围。
  • 量化精度由位深度(Bit Depth)决定,例如 16-bit 量化表示信号可以分成 $2^{16} = 65536$ 个离散级别。
  • 量化误差是指实际信号值与量化后信号值之间的误差,较高的位深度可以减少误差,提高音频质量。

编码(Encoding)

  • 编码是将量化后的数值转换为二进制数据,以便存储或传输。
  • 例如,16-bit PCM 每个采样点用 16 位二进制数表示。

PCM类型

PCM 有不同的变种,主要包括:

线性 PCM(Linear PCM, LPCM)

  • 最常见的 PCM 形式,量化间隔是等间隔的,因此信号的失真较小。
  • CD 音频、WAV 文件等使用的是线性 PCM。

对数 PCM(Logarithmic PCM)

  • 使用非线性量化,以减少数据量,常用于语音编码。
  • 典型编码方式包括 μ-law(美式标准)A-law(欧洲标准),用于电话通信。

差分 PCM(DPCM, Differential PCM)

  • 记录相邻采样值之间的差值,而不是绝对值,从而降低数据存储需求。
  • 适用于低比特率的应用,如语音编码。

自适应差分 PCM(ADPCM, Adaptive Differential PCM)

  • 在 DPCM 的基础上,动态调整量化步长,以适应信号的变化,提高效率。
  • 广泛用于音视频压缩,如 G.726 语音编码标准。

PCM优缺点

优点

高保真:PCM 是无损编码方式,不会丢失音频质量。
简单易实现:相比其他复杂的音频压缩算法(如 MP3、AAC),PCM 编解码计算量较低,适用于实时音频处理。
兼容性强:几乎所有音频设备(CD 播放器、计算机、手机等)都支持 PCM。

缺点

数据量大:PCM 不进行压缩,存储和传输成本高。例如,一分钟的 16-bit 44.1 kHz 立体声音频数据大约需要 10 MB。
对带宽要求高:在网络传输中,未经压缩的 PCM 需要较高带宽,不适合低带宽环境。

PCM与PWM区别

PCM(脉冲编码调制)和 PWM(脉冲宽度调制)在名字上确实有些相似,但它们的原理和应用是完全不同的。可以简单理解为:

PCM 是一种数字信号编码方式,主要用于音频、语音等信号的数字化存储与传输。
PWM 是一种模拟信号调制方式,用于控制电机、LED 亮度、音频信号合成等。

PCM 格式的数据是二进制的(0 和 1),PWM 输出的是高低电平(0 和 1),二者看似是一样的,但其实对于信息表达方式是完全不同的

PCM 直接表示信号的数值(用二进制编码一个具体的幅值)。
PWM 通过时间来编码信号的幅值(用脉冲的占空比表示模拟信号的强度)。

二者的核心区别

PCM - 直接量化幅度

PCM 通过二进制编码直接表示信号的瞬时幅度。
例如,16-bit PCM 编码可能会用 0110110100101110 这样的二进制数来表示某一时刻的信号幅值。
这意味着每个 PCM 采样点的数值与输入信号的幅度一一对应

PWM - 用时间表示幅度

PWM 不直接存储幅度值,而是通过调整“高电平持续的时间”来表达信号的强弱。
例如,占空比 50% 代表 50% 的幅度,占空比 75% 代表 75% 的幅度,占空比 25% 代表 25% 的幅度。
PWM 输出的是一连串固定频率的脉冲,而不是直接的二进制数值。

PCM如何转为PWM信号

PCM(脉冲编码调制)转换为 PWM(脉冲宽度调制)通常用于数字音频信号驱动功率放大器(如 D 类放大器),在这个转换过程中,PCM 主要提供信号的幅度信息,而 PWM 需要根据 PCM 信号计算出占空比,而频率通常是固定的

转换步骤

设定 PWM 频率

PWM 频率通常远高于 PCM 采样率,以确保信号能够被低通滤波器平滑还原,并避免高频噪声进入可听范围(20 Hz - 20 kHz)。
例如,对于 44.1 kHz 的 PCM 采样率(CD 音频),PWM 频率通常设定在 100 kHz 至 500 kHz 之间,其中 D 类音频放大器常使用 200 kHz 以上,以保证噪声超出人耳感知范围。

PWM 频率至少应为采样率的 4-10 倍(Nyquist 定理的扩展考虑),以保证波形保真度。对于 44.1 kHz 采样率,100 kHz 是一个合理的最小值,而 200-500 kHz 是 D 类放大器的常见范围。

PCM 本身是裸数据格式,通常没有文件头,所以你不能直接从 PCM 文件内部获取采样率,而需要从外部信息(比如文件命名、存储格式说明)或者使用正确的播放参数来解析(与同事那边商量好都使用一直的频率,比如都使用 44.1kHz)。

当然我们也可以使用公式大概计算出 PCM 文件的采样率

cyljs

计算占空比

PCM 信号的数值范围通常是有符号整数,例如:

  • 8-bit PCM: -128 ~ +127
  • 16-bit PCM: -32768 ~ +32767

PWM 占空比计算方式:

wfhzkbjs

对于有符号 PCM 数据:

yfhzkbjs

其中 VPCM 是当前 PCM 采样值。
Vmax 是 PCM 信号的最大值(比如 32767 对于 16-bit PCM)。
Vmin 是 PCM 信号的最小值(比如 -32768)。

示例:假设 PCM 采样值是 16-bit,范围是 -32768 到 32767

  • 当 PCM = 0 时,PWM 占空比 = 50%(表示中间电平)
  • 当 PCM = 32767 时,PWM 占空比 = 100%
  • 当 PCM = -32768 时,PWM 占空比 = 0%
  • 当 PCM = 16384(一半)时,PWM 占空比 = 75%
  • 当 PCM = -16384(负一半)时,PWM 占空比 = 25%

✅ 这样,PCM 的幅度信息就映射到了 PWM 的占空比。

具体的数值范围可以询问数据的来源,或则通过 PCM_Bit.py 工具码进行检测

PCM_Bit.py 工具下载链接

业务逻辑

服务端要么直接发送过来 PCM 编码,要么发送 MP3 编码,然后我本地解析为 PCM。