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 文件的采样率
计算占空比
PCM 信号的数值范围通常是有符号整数,例如:
- 8-bit PCM: -128 ~ +127
- 16-bit PCM: -32768 ~ +32767
PWM 占空比计算方式:
对于有符号 PCM 数据:
其中 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 编码,要么发送 MP3 编码,然后我本地解析为 PCM。