第 6 章 滤波器结构 / Filter Structures

6.1 为什么关心实现结构?

理论上,一个传递函数 $H(z)$ 无论用哪种结构实现,在无限精度下输出完全相同。但实际硬件或嵌入式平台使用**有限字长(Finite Wordlength)**运算,不同结构在以下方面表现截然不同:

维度影响
数值精度舍入噪声(Round-off Noise)累积程度不同
稳定性极点对系数量化的敏感度不同
计算量乘法器/加法器/延迟单元数量不同
并行性是否易于流水线化或并行化
模块性是否便于系数调谐与参数复用

工程铁律:同样的 $H(z)$,选错结构可能导致滤波器在定点 DSP 上震荡、溢出或信噪比严重劣化。

flowchart TD
    A[传递函数 H(z)] --> B{选择实现结构}
    B -->|FIR| C[直接型 / 级联型 / 多相 / 频域采样]
    B -->|IIR| D[直接I/II型 / 级联SOS / 并联型]
    B -->|特殊需求| E[格型 Lattice]
    C --> F[评估: 精度 · 稳定性 · 计算量]
    D --> F
    E --> F
    F --> G[目标平台实现]
    style B fill:#2d3748,stroke:#e2e8f0,color:#fff
    style F fill:#2d3748,stroke:#e2e8f0,color:#fff

6.2 FIR 滤波器结构

FIR(Finite Impulse Response)的传递函数:

$$H(z) = \sum_{n=0}^{N-1} h[n] , z^{-n}$$

只有零点、没有极点(除原点),因此绝对稳定

6.2.1 直接型(Direct Form)

也称横截型(Transversal Structure),是 FIR 最自然的实现:

$$y[n] = \sum_{k=0}^{N-1} h[k] , x[n-k]$$

1
2
3
4
5
// FIR 直接型伪代码
y = 0
for k = 0 to N-1:
    y += h[k] * x_delayed[k]   // N 次乘法 + N-1 次加法
shift_delay_line(x_delayed, x)
  • 需要 $N$ 个乘法器、$N-1$ 个加法器、$N-1$ 个延迟单元
  • 结构简单,适合系数对称时利用线性相位特性减半乘法量

6.2.2 级联型(Cascade Form)

将 $H(z)$ 分解为二阶节的乘积:

$$H(z) = \prod_{k=1}^{M} (b_{k0} + b_{k1}z^{-1} + b_{k2}z^{-2})$$

每个二阶节(Second-Order Section)独立实现,适合需要分别调谐零点位置的场合。FIR 级联型在工程中不如 IIR 级联型常用,因为 FIR 的直接型本身已经足够稳定。

6.2.3 多相分解(Polyphase Decomposition)

将滤波器系数按 $M$ 组抽取:

$$H(z) = \sum_{m=0}^{M-1} z^{-m} E_m(z^M)$$

其中 $E_m(z) = \sum_k h[kM+m] , z^{-k}$ 为多相分量(Polyphase Component)

多相结构的威力在于:先滤波再抽取,避免计算被丢弃的样点。在采样率转换(Sample Rate Conversion)中,计算量可降为原来的 $1/M$。

1
2
3
4
// 多相分解伪代码 (M:1 抽取)
for m = 0 to M-1:
    y_poly[m] = filter(E_m, x[m::M])   // 第 m 相滤波
y = interleave(y_poly)                   // 交织输出

6.2.4 频域采样结构(Frequency Sampling Structure)

利用 DFT 系数表示 FIR:

$$H(z) = \frac{1-z^{-N}}{N} \sum_{k=0}^{N-1} \frac{H[k]}{1 - W_N^{-k} z^{-1}}$$

结构为梳状滤波器(Comb Filter) $\frac{1-z^{-N}}{N}$ 与 $N$ 个一阶谐振器的并联组合。适合窄带滤波器——大部分 $H[k]=0$,可省去对应支路,大幅减少计算量。


6.3 IIR 滤波器结构

IIR(Infinite Impulse Response)含极点,传递函数:

$$H(z) = \frac{\sum_{k=0}^{M} b_k z^{-k}}{1 - \sum_{k=1}^{N} a_k z^{-k}}$$

6.3.1 直接 I 型(Direct Form I)

分子分母分别用独立的延迟线实现:

$$y[n] = \sum_{k=0}^{M} b_k x[n-k] + \sum_{k=1}^{N} a_k y[n-k]$$

需要 $M+N$ 个延迟单元(两组延迟线),硬件效率低,且高阶时对系数量化极其敏感。

6.3.2 直接 II 型 / 标准型(Direct Form II / Canonical Form)

利用线性系统交换律,将两条延迟线合并为一条:

$$w[n] = x[n] + \sum_{k=1}^{N} a_k w[n-k]$$ $$y[n] = \sum_{k=0}^{M} b_k w[n-k]$$

仅需 $\max(M,N)$ 个延迟单元,是最节省存储器的直接实现。

1
2
3
4
5
6
7
// IIR 直接II型(转置)伪代码 — 工程首选直接形式
// Transposed Direct Form II — 更好的数值特性
w[0] = x
y   = b[0]*w[0] + state[0]
for k = 0 to N-2:
    state[k] = b[k+1]*w[0] + a[k+1]*y + state[k+1]
state[N-1] = b[N]*w[0] + a[N]*y

工程提示:转置直接 II 型(Transposed Direct Form II)在定点实现中,舍入噪声经过的路径更短,通常是单个二阶节的最佳选择。

6.3.3 级联型 — 二阶节 / Biquad / SOS

工程中最常用的 IIR 结构。 将高阶传递函数分解为若干二阶节(Second-Order Sections, SOS)的级联:

$$H(z) = G \prod_{k=1}^{K} \frac{b_{k0} + b_{k1}z^{-1} + b_{k2}z^{-2}}{1 - a_{k1}z^{-1} - a_{k2}z^{-2}}$$

每个 SOS 用转置直接 II 型实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// Biquad (二阶节) — 单节实现
def biquad(x, b, a, state):
    y = b[0]*x + state[0]
    state[0] = b[1]*x - a[1]*y + state[1]
    state[1] = b[2]*x - a[2]*y
    return y, state

// 级联 N 个 Biquad
state = zeros((N, 2))
for each sample x:
    for i = 0 to N-1:
        x, state[i] = biquad(x, b[i], a[i], state[i])
    output = x

为什么级联型更好? 见 §6.4。

6.3.4 并联型(Parallel Form)

将 $H(z)$ 部分分式展开为二阶节之和:

$$H(z) = C + \sum_{k=1}^{K} \frac{e_{k0} + e_{k1}z^{-1}}{1 - a_{k1}z^{-1} - a_{k2}z^{-2}}$$

各支路并行计算,天然适合多核/DSP 多 MAC 单元。此外,每个支路独立工作,量化误差不会在支路间传播。

flowchart LR
    X[x[n]] --> S1["SOS₁"]
    X --> S2["SOS₂"]
    X --> S3["SOS₃"]
    S1 --> Sigma["∑"]
    S2 --> Sigma
    S3 --> Sigma
    Sigma --> Y[y[n]]
    style X fill:#2d3748,stroke:#e2e8f0,color:#fff
    style Sigma fill:#2d3748,stroke:#e2e8f0,color:#fff
    style Y fill:#2d3748,stroke:#e2e8f0,color:#fff

6.4 有限字长效应 / Finite Wordlength Effects

定点 DSP(如 TI C2000、ARM Cortex-M)中,所有运算在有限位宽下进行,引入三类核心问题。

6.4.1 量化噪声(Quantization Noise)

模拟信号经 ADC 量化为 $B$ 位,引入量化误差 $e[n]$,建模为均匀白噪声:

$$\sigma_e^2 = \frac{\Delta^2}{12} = \frac{2^{-2B}}{12}$$

每增加 1 位,信噪比提升约 6 dB。

6.4.2 系数量化(Coefficient Quantization)

将理想浮点系数 ${a_k, b_k}$ 量化为 $B$ 位定点值,零极点位置偏移。高阶直接型中,极点密度高的区域(如窄带低通滤波器)偏移尤为严重——可能导致极点移出单位圆,系统失稳。

6.4.3 为什么级联型更鲁棒?

特性直接型(高阶)级联型(SOS)
极点敏感度全部极点耦合,量化误差相互叠加每节仅 2 个极点,独立控制
稳定性裕度高阶系数量化可能导致极点逸出每节极点可单独验证稳定性
舍入噪声增益噪声经全阶传递函数放大每节噪声仅经后续节放大
动态范围中间信号可能溢出可逐节做 Scaling

极点敏感度的数学直觉:$N$ 阶直接型中,每个系数变化 $\Delta a_k$ 影响所有 $N$ 个极点;级联型中每个系数仅影响本节的 2 个极点。敏感度正比于 $|H(z)|$ 在极点处的值,高阶直接型该值极大。

Scaling 策略:级联型可在每节之间插入缩放因子 $s_k$,使中间信号不超过动态范围,同时保持整体增益不变:

$$H(z) = G \prod_{k=1}^{K} \frac{1}{s_k} \cdot s_k \cdot H_k(z)$$

实际中常用 $L_1$ 范数或 $L_\infty$ 范数缩放:$s_k = |h_k[n]|_1$。


6.5 格型结构 / Lattice Structures

格型结构具有模块化、数值稳定、适合自适应滤波等独特优势,在语音编码(如 GSM 的 LPC)、线性预测和自适应滤波中广泛应用。

6.5.1 FIR 格型(全零点格型)

由反射系数(Reflection Coefficients)$k_m$ 定义,$m = 1, 2, \ldots, N-1$:

$$f_m[n] = f_{m-1}[n] + k_m , b_{m-1}[n-1]$$ $$b_m[n] = k_m , f_{m-1}[n] + b_{m-1}[n-1]$$

其中 $f_m$ 为前向预测误差,$b_m$ 为后向预测误差。$|k_m| < 1$ 保证稳定性。

flowchart LR
    subgraph "Stage m"
        FM1["f_(m-1)"] --> PLUS["+"]
        BM1["b_(m-1)[n-1]"] --> K1["× k_m"] --> PLUS
        FM1 --> K2["× k_m"] --> PLUS2["+"]
        BM1 --> PLUS2
        PLUS --> FM["f_m"]
        PLUS2 --> BM["b_m"]
    end
    style PLUS fill:#2d3748,stroke:#e2e8f0,color:#fff
    style PLUS2 fill:#2d3748,stroke:#e2e8f0,color:#fff

6.5.2 IIR 格型(零极点格型)

在 FIR 格型基础上增加梯形(Ladder)部分实现极点:

$$y[n] = f_0[n] = x[n] + \sum_{m=1}^{N} v_m , b_{m-1}[n-1]$$

反射系数 $k_m$ 控制极点,梯形系数 $v_m$ 控制零点。只要 $|k_m| < 1$,系统稳定——稳定性的检验退化为检查 $|k_m|$ 是否小于 1,这是格型结构的核心优势。

6.5.3 反射系数的获取

从直接型系数到反射系数的转换通过 Levinson-Durbin 递归完成:

1
2
3
4
5
6
7
8
// Levinson-Durbin 递归
a[0] = 1
for m = 1 to N-1:
    k[m] = -delta[m] / P[m-1]      // 反射系数
    for i = 1 to m-1:
        a_new[i] = a[i] + k[m]*a[m-i]
    a = a_new
    P[m] = P[m-1] * (1 - k[m]^2)   // 预测误差功率

反射系数又称为 PARCOR 系数(Partial Correlation),在线性预测编码(LPC)中用于语音的压缩与合成。


6.6 工程选择指南

flowchart TD
    Q1{FIR 还是 IIR?}
    Q1 -->|FIR| Q2{要求线性相位?}
    Q1 -->|IIR| Q4{阶数 > 4?}
    Q2 -->|是| A1[直接型 / 线性相位对称结构]
    Q2 -->|否 / 采样率转换| A2[多相分解]
    Q4 -->|是| A3[级联 Biquad SOS + 逐节 Scaling]
    Q4 -->|否| A4[转置直接II型 单节]
    Q5{自适应 / 语音编码?} -->|是| A5[格型 Lattice]
    Q5 -->|多核并行| A6[并联型 Parallel]
    style Q1 fill:#1a365d,stroke:#e2e8f0,color:#fff
    style Q4 fill:#1a365d,stroke:#e2e8f0,color:#fff

快速决策表

应用场景推荐结构理由
通用 FIR直接型(线性相位)简单,可利用对称性减半乘法
抽取/插值多相分解计算量降至 $1/M$
通用 IIR级联 Biquad量化鲁棒,逐节可调
多核 DSP并联型天然并行
自适应滤波格型反射系数实时更新,稳定可判
定点嵌入式 IIR级联 Biquad + Scaling防溢出、低敏感度

实践建议

  1. 永远不要用高阶直接型 IIR——即使浮点仿真通过,定点实现大概率出问题
  2. 级联型 Section 排序有讲究:将极点对量化敏感的节放在前面,减少噪声经后续节放大
  3. 零极点配对:每个 SOS 中将距离最近的零极点配对,最小化系数量化影响
  4. Scaling 不可省略:定点级联实现必须逐节缩放,$L_2$ 范数缩放是工程常用折中
  5. 验证方法:在目标位宽下仿真,检查:(a) 极点是否仍在单位圆内;(b) 空闲信道输出是否接近零;(c) 频率响应偏差是否可接受

本章小结

滤波器实现结构是将数学传递函数映射到工程硬件/软件的关键桥梁。同样的 $H(z)$,不同结构在有限字长下的表现差异巨大:

  • FIR 天然稳定,结构选择主要考虑计算效率(多相分解用于采样率转换)
  • IIR 结构选择直接影响数值稳定性——级联 Biquad 是工程默认选择
  • 格型结构在自适应和语音编码领域不可替代
  • 有限字长效应是理论设计与实际实现之间的鸿沟,级联型通过极点解耦逐节缩放提供了最好的鲁棒性

“The difference between theory and practice is that in theory there is no difference, but in practice there is.” — 在 DSP 实现中,这句话从未如此真实。