数字信号处理的误差分析
前面的章节(差分方程、Z 变换、DFT、滤波器设计)全部建立在无限精度的数学模型之上。我们假设系数可以取任意实数、加法不会溢出、乘法结果可以无限精确。然而,任何实际的 DSP 系统——无论是专用芯片还是通用处理器——都必须在有限字长的约束下运行。
本章回答一个核心问题:无限精度的理论设计,在有限字长的物理实现中会发生什么?从 A/D 采样量化、滤波器系数量化,到每一步乘法运算后的舍入/截尾,误差会像多米诺骨牌一样逐级传递。理解这些误差的来源、统计特性和工程边界,是把"纸上的滤波器"变成"芯片上的滤波器"的必经之路。
本章也是数字信号处理课程前半部分(连续信号→离散化→频域分析→滤波器设计)与后半部分(硬件实现、自适应滤波、谱估计)之间的关键桥梁。
前置知识回顾
本节默认你已掌握以下内容。若有遗忘,建议先回看对应章节:
- Z 变换与系统函数:差分方程 → $H(z)$ 的推导,极零点概念。去哪里补:第二、三讲。
- FIR 与 IIR 结构:直接型、级联型、并联型的实现结构。去哪里补:第五、六讲。
- 概率论基础:期望、方差、均匀分布的概率密度。去哪里补:概率论课程。
- 二进制与补码运算:有符号整数的表示。去哪里补:数字逻辑 / 计算机组成原理。
核心 takeaway:无限精度设计 ≠ 有限字长实现
一个在 MATLAB 里表现完美的 12 阶椭圆滤波器,用 16 位定点 DSP 实现时,可能因系数量化而极点移出单位圆,导致系统不稳定。这不是设计错误,而是实现误差——它根源于有限字长,必须用本章的方法去分析和控制。
在深入量化误差的统计分析之前,我们必须先回答三个基本问题:误差从哪来?数字在机器里怎么表示?截尾和舍入的数学本质是什么?这一组从工程直觉出发,建立整个误差分析体系的符号与工具基础。
数字信号处理系统中,有限字长引入的误差可以归纳为三大类,它们发生在信号流的不同阶段:
误差来源分类
1. 输入信号 A/D 量化误差:模拟信号经采样后,采样值必须用有限位数的二进制表示。$x(n)$ 的真实值与量化值之间的差异称为 A/D 量化误差。
2. 系数量化误差:滤波器系数 $a_k$、$b_k$ 在无限精度设计中可能是无理数(如 $rac{1}{\sqrt{2}}$),存入有限字长寄存器时被迫截断,导致实际系统函数偏离设计值。
3. 运算过程误差:定点乘法产生双倍字长的结果,必须舍入或截尾回单倍字长;定点加法可能溢出;浮点运算则引入相对误差。
这三种误差在系统中的传播路径可以用一个简单模型描述:A/D 量化发生在输入端,相当于给理想信号叠加了一个噪声;系数量化改变了系统函数 $H(z)$ 的极零点位置;运算舍入则在每个乘法和加法节点注入新的噪声源。三者叠加,最终决定了输出信号的信噪比(SNR)。
误差的大小首先取决于"数字在硬件中怎么存"。二进制表示有两种基本形式:定点制和浮点制。它们对误差特性的影响截然不同。
定点制(Fixed-Point)
小数点位置固定不变。通常采用 $b$ 位小数位(含符号位)的格式,数值范围为 $[-1, 1-2^{-b}]$。
其中 $B_0$ 为符号位,$B_i \in \{0,1\}$ 为小数位。定点制的绝对量化精度固定为 $q = 2^{-b}$,与信号大小无关。
浮点制(Floating-Point)
小数点位置随阶码浮动,格式为 $(-1)^s \times M \times 2^c$,其中 $M$ 为尾数(mantissa),$c$ 为阶码(exponent)。
浮点制的相对精度固定,但绝对精度随信号幅度变化:大信号的绝对误差大,小信号的绝对误差小。
为什么这个区别如此关键?想象一个动态范围很大的音频信号:定点制为了覆盖大信号,必须牺牲小数位精度,导致小信号被严重量化;浮点制则能同时兼顾大信号的动态范围和小信号的精细分辨。代价是浮点运算单元更复杂、功耗更高、延迟更大。
| 特性 | 定点制 | 浮点制 |
|---|---|---|
| 表示格式 | $(-1)^s \times$ 固定小数位 | $(-1)^s \times M \times 2^c$ |
| 绝对精度 | 固定($q = 2^{-b}$) | 随幅度变化 |
| 相对精度 | 小信号差、大信号好 | 固定(约 $2^{-b}$) |
| 动态范围 | 窄 | 宽 |
| 溢出处理 | 需饱和/缩放 | 阶码自动处理 |
| 硬件成本 | 低(面积小、功耗低) | 高(面积大约 3-5 倍) |
| 典型应用 | 嵌入式 DSP、音频 CODEC | 高精度科学计算、GPU |
在讨论量化误差之前,必须明确负数在机器里的二进制编码方式。三种编码对截尾误差的符号有直接影响。
三种编码定义(设真值为 $x$,$b$ 位小数位)
原码(Sign-Magnitude):最高位为符号位,其余表示绝对值。
反码(One's Complement):正数同原码;负数对原码逐位取反。
补码(Two's Complement):正数同原码;负数对原码逐位取反再加 $2^{-b}$(或等价地,对 $2$ 取模)。
补码是现代 DSP 芯片的事实标准,原因有二:第一,补码加减法只需同一套加法器,无需额外处理符号位;第二,补码溢出时自动执行模 2 运算,"绕圈"特性在某些场景下反而有益。但补码的截尾误差特性与原码不同——这是下一节的核心内容。
当 $b+1$ 位(1 位符号 + $b$ 位小数)的寄存器只能容纳 $b$ 位小数时,必须丢弃最低位。丢弃方式有两种:截尾(Truncation)和舍入(Rounding)。
量化步长与两种误差
定义量化步长(quantization step):
截尾误差 $E_T$:直接丢弃多余位。对正数,结果变小;对负数,补码和反码的结果反而变大(向零靠近)。
舍入误差 $E_R$:按最接近的量化级取整, ties 时向偶数取。误差范围对称:
截尾误差的关键在于:它不是总为负,而是依赖于编码方式。下表总结了不同编码、不同符号下的截尾误差范围——这是分析系数量化效应和运算误差的基础。
| 编码方式 | 正数 ($x>0$) | 负数 ($x<0$) |
|---|---|---|
| 原码 | $-q \le E_T < 0$ | $0 < E_T \le q$ |
| 反码 | $-q \le E_T < 0$ | $0 < E_T \le q$ |
| 补码 | $-q \le E_T < 0$ | $-q \le E_T < 0$ |
有了误差来源和表示方法的基础,现在进入核心分析:把量化误差建模为随机噪声,推导它通过线性系统后的统计特性,并建立字长与信噪比之间的定量关系。这一组的结论直接指导工程中的字长选择。
单个量化误差的取值看似确定(由被量化值决定),但当输入信号足够复杂(如语音、噪声、多频信号)时,误差在量化台阶上近似均匀分布。这使得我们可以用概率统计工具来分析其长期平均效应。
舍入误差的统计特性
假设舍入误差 $e_R$ 在 $(-q/2, q/2]$ 上均匀分布,则:
均值:$\mu_{e_R} = E[e_R] = 0$
方差:$\sigma_{e_R}^2 = E[e_R^2] = \frac{q^2}{12} = \frac{2^{-2b}}{12}$
截尾误差的方差与舍入相同(同为 $q^2/12$),但均值不为零:补码截尾有偏($\mu = -q/2$),原码/反码截尾均值则依赖于信号分布。因此,工程上优先使用舍入——它不仅误差范围对称,而且均值零偏,不会引入直流分量。
A/D 量化误差和运算舍入误差都可以看作在系统输入端或内部节点注入的加性白噪声。问题是:这些噪声经过滤波器后,输出端噪声的功率是多少?
FIR 系统输出噪声方差
若量化噪声 $e(n)$ 方差为 $\sigma_e^2$,通过冲激响应为 $h(n)$ 的 FIR 系统,输出噪声方差为:
其中 $N$ 为 FIR 阶数。由于 FIR 无反馈,输出噪声只是输入噪声与冲激响应能量的乘积。
IIR 系统输出噪声方差
对于 IIR 系统,噪声通过反馈回路被反复加权,输出方差需在频域积分:
其中 $C$ 为单位圆。对有理系统函数,可用留数定理计算;对高阶系统,数值积分更实用。
这意味着 IIR 系统的输出噪声对极点位置极其敏感:当极点靠近单位圆时,$|H(z)|^2$ 在某些频率上产生尖峰,频域积分会显著放大噪声。这是 IIR 实现中必须小心选择结构(级联/并联优于直接型)的根本原因。
直接型 IIR 的噪声放大陷阱
直接型结构把所有反馈系数集中在一两个加法节点上,导致量化噪声被高阶递归反复放大。级联型和并联型把高阶系统拆成多个低阶节(通常是二阶节),每节的极点远离单位圆,噪声放大效应被局限在局部。
系数量化不是简单的"加点噪声",而是直接改变系统函数 $H(z)$ 的极零点位置。高阶直接型滤波器的极点对系数变化极其敏感——微小的量化误差可能把稳定极点推出单位圆。
系数量化灵敏度排序
对同一组设计指标,三种实现结构的系数量化鲁棒性排序为:
其中 ">" 表示"更敏感"(更差)。即:并联型最鲁棒,直接型最脆弱。
直观理解:直接型的系数直接决定高阶多项式的根,而多项式求根是著名的病态问题(Wilkinson 多项式就是典型案例)。级联型把 $H(z)$ 拆成多个二阶节的乘积,每个二阶节的极点独立调整;并联型则拆成部分分式之和,各极点更加解耦。因此同样的系数量化误差,在级联/并联结构中产生的极点偏移远小于直接型。
量化信噪比经验公式(A/D 转换)
其中 $\sigma_x^2$ 为输入信号功率。该公式是音频和通信系统中字长选择的核心依据。
前两组分析了量化噪声的统计模型和系数量化对极点的长期影响。本组聚焦两个更微妙的现象:定点加法溢出、极限环振荡和死区效应——它们都是非线性效应,无法用线性噪声模型描述,却在实际 DSP 中频繁出现。
定点加法是本章最容易被忽视的问题。两个 $b$ 位有符号数相加,结果可能需要 $b+1$ 位才能正确表示。如果直接截断最高位,会发生什么?
补码溢出的"绕圈"特性
补码加法本质上是模 $2$ 运算。当两个正数相加超过 $1-2^{-b}$ 时,结果会从正数区间"绕"到负数区间(溢出);两个负数相加低于 $-1$ 时,则"绕"到正数区间。
例如:$0.75 + 0.5 = 1.25$,但 3 位补码的最大正数为 $0.111_2 = 0.875$,结果溢出后为 $1.001_2$(若取低 3 位则为 $0.001_2 = 0.125$),严重失真。
补码溢出的奇妙之处在于:如果中间结果多次溢出,但最终结果在表示范围内,模 2 运算的"绕圈"特性会使最终结果正确。然而,在 IIR 滤波器中,中间节点的溢出通常意味着永久性失真,不能依赖这种"运气"。
浮点乘法引入的是相对误差而非绝对误差。设尾数字长为 $b$ 位,则单次乘法的相对误差约为 $2^{-b}$。与定点制相比:
| 场景 | 定点制 | 浮点制 |
|---|---|---|
| 大信号 | 绝对误差固定,相对误差小 | 相对误差固定,绝对误差大 |
| 小信号 | 绝对误差固定,相对误差大(SNR 差) | 相对误差固定,SNR 恒定 |
| 溢出 | 严重,需显式处理 | 阶码自动处理(除非上/下溢) |
| 实现复杂度 | 低 | 高(需归一化、对阶) |
浮点制的核心优势是小信号信噪比恒定。在音频处理中,这意味着弱信号不会被量化噪声淹没;在科学计算中,这意味着动态范围不受限。代价是芯片面积、功耗和运算延迟——这也是为什么手机基带 DSP 通常用定点,而桌面音频工作站用浮点。
极限环是有限字长 IIR 滤波器最诡异的非线性现象之一:当输入已经降为零,输出却不衰减到零,而是陷入一个周期性的小幅振荡。这不是设计错误,而是舍入非线性把稳定的极点悄悄推到了单位圆上。
极限环的物理机制
考虑一阶 IIR:$y(n) = a \cdot y(n-1)$,其中 $|a| < 1$(稳定)。无限精度下,$y(n) = a^n y(0) \to 0$。
有限精度下,每次乘法 $a \cdot y(n-1)$ 后必须舍入到 $b$ 位。当 $y(n-1)$ 变得很小时,$a \cdot y(n-1)$ 的舍入结果可能恰好等于 $y(n-1)$(或 $-y(n-1)$),使得输出不再衰减,而是维持一个恒定值(周期 1)或交替符号(周期 2)。
极限环幅度上界
对于一阶 IIR 系统 $y(n) = Q[\,a \cdot y(n-1)\,]$($Q$ 表示舍入量化),极限环输出满足:
其中 $q = 2^{-b}$。极点越靠近单位圆($|a| \to 1$),极限环上界越大。
直观上,$\frac{q/2}{1-|a|}$ 是量化精度与系统"记忆长度"(由 $1-|a|$ 倒数决定)的乘积。当极点接近单位圆时,系统对过去输出的记忆很长,每次舍入的微小偏差被反复累积,最终形成可观测的振荡。
死区是极限环的"近亲":当输入信号的幅度小于某个阈值时,滤波器输出被完全截断到零——仿佛信号掉进了一个"死区",再也无法被系统响应。这与极限环的共同根源是反馈路径上的量化非线性。
一阶 IIR 死区阈值
对系统 $y(n) = Q[\,a \cdot y(n-1) + x(n)\,]$,若输入满足:
则输出最终将被截断到零,系统进入死区。该阈值与极限环上界完全相同,反映了量化精度与反馈强度的基本制约关系。
例题:一阶 IIR 的死区效应分析
题目:设一阶 IIR 系统 $y(n) = Q[\,a \cdot y(n-1)\,] + x(n)$,系数 $a = 0.100_2 = 0.5$(二进制 1 位整数 + 2 位小数,总字长 $b=3$),输入 $x(n) = \frac{7}{8}\delta(n)$。比较无限精度与有限精度下的输出序列。
目标:观察死区效应导致的输出提前归零现象。
- 无限精度计算:$y(0)=7/8$,$y(1)=a \cdot y(0)=0.5 \times 0.875 = 0.4375 = 7/16$,$y(2)=7/32$,依此类推。输出按指数规律衰减,$y(n) = (7/8) \cdot (1/2)^n$,永不真正为零。
- 有限精度计算($b=3$,$q=2^{-3}=1/8$):
- $y(0) = 7/8 = 0.111_2$(精确表示)
- $y(1) = Q[0.5 \times 0.875] = Q[0.4375] = Q[3.5/8]$。按舍入规则,$3.5/8$ 取整到 $4/8 = 0.5 = 0.100_2$
- $y(2) = Q[0.5 \times 0.5] = Q[0.25] = Q[2/8]$。精确值为 $0.25 = 2/8$,可精确表示为 $0.010_2$
- $y(3) = Q[0.5 \times 0.25] = Q[0.125] = 1/8 = 0.001_2$
- $y(4) = Q[0.5 \times 0.125] = Q[0.0625] = Q[0.5/8]$。舍入到 $0$(因小于 $q/2=1/16$)
- 结果对比:无限精度下 $y(4)=7/128 \approx 0.055$,有限精度下 $y(4)=0$。输出在 $n=4$ 时提前归零——这就是死区效应。
验证死区阈值:$\frac{q/2}{1-|a|} = \frac{1/16}{0.5} = \frac{1}{8} = 0.125$。当输出衰减到 $1/8$ 以下时,下一步舍入结果为零,系统进入死区。
系数量化效应告诉我们:同样的设计指标,用不同的实现结构,量化后的表现天壤之别。下图示意三种结构的极点偏移程度。
课件给出了一个完整的工程案例:设计一个五阶椭圆低通滤波器,分别用直接型、级联型和并联型实现,观察相同字长系数量化后的幅频响应变化。
例题:五阶椭圆滤波器系数量化
题目:用双线性变换法设计一个五阶椭圆低通数字滤波器,通带截止频率 $0.2\pi$,阻带截止频率 $0.3\pi$,通带波纹 1 dB,阻带衰减 40 dB。将系数分别量化为 8 位、10 位、12 位,比较直接型、级联型、并联型的幅频响应。
核心结论:
- 直接型:8 位量化时极点移出单位圆,系统不稳定;10 位时勉强稳定但通带严重畸变;12 位时接近理想。
- 级联型:每节二阶,极点独立。8 位量化时仍稳定,仅阻带波纹略有增加。
- 并联型:部分分式展开,各极点解耦程度最高。8 位量化下通带和阻带均保持良好。
本章的误差分析是 DSP 从"理论设计"走向"工程实现"的关键节点。后续内容中,以下场景会反复用到本章的结论:
- 自适应滤波(LMS/RLS):梯度估计的量化误差会改变收敛轨迹,甚至导致发散。步长选择和字长设计需联合优化。
- 多速率信号处理:抽取和内插滤波器的级联实现中,每一级的字长可以不同——前面的粗略、后面的精细,整体节省硬件资源。
- 音频/语音编解码:感知编码器利用人耳掩蔽效应分配比特,本质上是在给定的总字长预算下最小化感知量化误差。
- 神经网络量化(INT8/INT4):深度学习的模型量化是本章原理在 2020 年代的直接延伸——只不过"系统"变成了神经网络,"系数"变成了权重矩阵。
理解有限字长效应的物理本质,不仅能帮你写出更好的 DSP 代码,还能让你在面对神经网络量化、低比特训练等前沿问题时,拥有比别人更扎实的直觉根基。
复习速查
- 三大误差来源:A/D 量化(输入端)、系数量化(改变 $H(z)$)、运算舍入/溢出(每个运算节点)。
- 量化步长:$q = 2^{-b}$,舍入误差范围 $(-q/2, q/2]$,方差 $\sigma_e^2 = q^2/12$。
- SNR 经验公式:$\text{SNR} \approx 6.02b + 10\lg(\sigma_x^2) + 10.79$ dB。每增 1 bit,SNR 提升约 6 dB。
- 结构灵敏度:直接型 > 级联型 > 并联型。高阶 IIR 避免直接型。
- 极限环上界:$|y(n)| \le \frac{q/2}{1-|a|}$。极点越靠近单位圆,极限环越严重。
- 死区阈值:$|x(n)| < \frac{q/2}{1-|a|}$ 时输出归零。公式同极限环上界,场景不同。
- 补码溢出:模 2 运算自动"绕圈",但工程上通常用饱和限幅避免伪影。
参考来源
-
西安交通大学. (2026). 数字信号处理第八讲:数字信号处理的误差分析. 课程讲义.
第八讲1.pdf -
Oppenheim, A. V. & Schafer, R. W. (2009). Discrete-Time Signal Processing (3rd ed.). Pearson. 第 6 章(有限字长效应).
出版社链接 -
Proakis, J. G. & Manolakis, D. G. (2007). Digital Signal Processing (4th ed.). Pearson. 第 7 章(数字滤波器实现).
出版社链接 -
Mitra, S. K. (2011). Digital Signal Processing: A Computer-Based Approach (4th ed.). McGraw-Hill. 第 12 章(有限字长分析).
出版社链接