Appearance
滤波器设计基础
概念
上一章把 H(z) 变成了"循环里的一行"。但工程上从来不是先写代码、再看它滤掉什么,而是反过来:先给定指标(哪些频率要保住、哪些频率要压掉、压到多少 dB),再求出系数。 这个反求过程就是滤波器设计。
滤波器就四类,别的都是它们的组合:
| 类型 | 放行 | 阻挡 |
|---|---|---|
| 低通(LP) | 直流到 ωp | ωs 以上 |
| 高通(HP) | ωp 以上 | 直流到 ωs |
| 带通(BP) | ω1 到 ω2 | 两侧 |
| 带阻(BS) | 两侧 | ω1 到 ω2 |
设计这件事有三条路,本章把三条都走一遍:
① 指标 ──(选原型、算阶数)──▶ 模拟 H(s) ──(双线性变换)──▶ 数字 H(z) ← IIR 路线
② 指标 ──(理想低通 + 加窗)──────────────────────────▶ 数字 h[n] ← FIR 路线
③ 数字指标 ──(频率变换)──▶ 低通原型 ──▶ 任意类型 ← 复用路线关键认识:三条路的共同点是"先把问题变成设计一个归一化低通原型,再变换到目标类型"。所以本章的逻辑是——一个原型(巴特沃斯)+ 一套变换 + 两种数字化方法。
原理
一、指标语言:把"要什么"写成五个数
| 符号 | 含义 | 典型说法 |
|---|---|---|
ωp(或 fp) | 通带边缘 | 最后一次允许幅度波动的地方 |
ωs(或 fs_stop) | 阻带起始 | 从这里开始必须压下去 |
αp | 通带最大衰减 | "通带波纹不超过 1 dB" |
αs | 阻带最小衰减 | "阻带至少衰减 40 dB" |
Δω = ωs − ωp | 过渡带宽度 | 两个要求之间的"缓冲地带" |
过渡带是全部难度的来源:Δω 越窄,需要的阶数越高、算力越大。滤波器的"贵"就贵在这条窄带上。
二、巴特沃斯:最平坦的幅度
巴特沃斯(Butterworth)低通的幅度平方函数只有一句话:
|H(jΩ)|² = 1 / (1 + (Ω/Ωc)^(2n))它的性格由这三个性质决定:
- 直流处最平坦:前
2n−1阶导数在Ω = 0处全为零; - 单调下降,通带没有波纹(切比雪夫 I 有,换来更窄的过渡带);
Ω = Ωc处恒为−3 dB,与阶数无关。
阶数反解公式(把 αp、αs 代进去):
n ≥ log10[ (10^(αs/10) − 1) / (10^(αp/10) − 1) ] / ( 2·log10(ωs/ωp) )取整后必须回代校核——因为 n 只能取整数,实际衰减一定比要求好一点:
阻带要求(αp = 1 dB @ ωp = 1、ωs = 2) | 阶数计算值 | 取整 n | 校核用 Ωc | ωs 处实际衰减 |
|---|---|---|---|---|
| 20 dB | 4.2894 | 5 | 1.14468 | 24.25 dB |
| 40 dB | 7.6185 | 8 | 1.08812 | 42.30 dB |
| 60 dB | 10.9405 | 11 | 1.06334 | 60.36 dB |
极点的位置也有规律:n 个极点均匀分布在一个半径为 Ωc 的左半圆上,角度为 π(2k+n+1)/(2n)。n = 8 时就是 8 个等角度的点,k = 0 那对极角 101.25°、k = 7 那对 258.75°。
这条规律的工程含义:把共轭极点两两配对,每一对做成一个二阶节(biquad),8 阶就是 4 个 biquad 级联。阶数越高,极点越靠近虚轴(Q 越大),对系数量化越敏感——所以实际实现一律级联多个二阶节,而不是直接算 8 阶差分方程。
| 原型 | 通带 | 过渡带 | 特点 |
|---|---|---|---|
| 巴特沃斯 | 最平坦、单调 | 最宽 | 相位特性最好,阶数代价最大 |
| 切比雪夫 I | 等波纹 | 较窄 | 同阶数比巴特沃斯陡,通带有波纹 |
| 切比雪夫 II | 平坦 | 较窄 | 波纹放到阻带 |
| 椭圆 | 等波纹 | 最窄 | 阻带还有零点,相位最差 |
三、频率变换:一个低通原型变出四种滤波器
设计好归一化低通原型 H_LP(s) 之后,用换元就能得到其余三种(B = ω2 − ω1,ω0 = sqrt(ω1·ω2)):
| 目标 | 换元 |
|---|---|
| 低通 → 高通 | s → ωp·ωc / s |
| 低通 → 带通 | s → (s² + ω0²) / (B·s) |
| 低通 → 带阻 | s → B·s / (s² + ω0²) |
这一步是纯粹的代数替换,不改阶数也不改幅度形状,所以"设计一个低通原型"能通吃四种滤波器——这是模拟滤波器理论的中心思想。
四、两条数字化路线
路线 A:双线性变换(IIR)
s = (2/T) · (1 − z⁻¹) / (1 + z⁻¹)它把整个 s 左半平面一一映射到单位圆内,所以稳定的模拟原型一定得到稳定的数字滤波器,而且把无穷大的频率轴压进了 [0, π]。
代价是频率被非线性压缩(频率弯曲),于是要预畸变:
Ω = (2/T)·tan(ω/2) ω 是想要的数字角频率,Ω 是原型要用的模拟频率不预畸变会差多少? 以 fs = 8000 Hz 为例:
| 想要的数字截止 | 数字角频率 ω | 预畸变后 Ω | 不预畸变的实际截止 | 偏差 |
|---|---|---|---|---|
| 500 Hz | 0.3927 rad | 3182.60 Hz | 493.72 Hz | 1.26% |
| 1000 Hz | 0.7854 rad | 6627.42 Hz | 952.88 Hz | 4.71% |
| 2000 Hz | 1.5708 rad | 16000.00 Hz | 1695.38 Hz | 15.23% |
| 3000 Hz | 2.3562 rad | 38627.42 Hz | 2207.76 Hz | 26.41% |
低频段可以偷懒、高频段绝对不行:3000 Hz 处不预畸变会把截止点做到 2207.76 Hz——差了近三分之一。这是 IIR 数字滤波器设计里最常见的错误。
路线 B:窗函数法(FIR)
FIR 的理想低通冲激响应是一个 sinc:
h_d[n] = 2·fc' · sinc(2·fc'·(n − M)) M = (N−1)/2,fc' 是归一化截止(除以 fs)sinc 无限长,直接截断会产生吉布斯过冲([傅里叶变换](/elec/02-fourier.md) 见过),所以改成"理想响应 × 窗函数":
h[n] = h_d[n] · w[n]"窗型定衰减、长度定过渡带"是窗函数法的全部内容:
| 窗函数 | 过渡带 Δω | 最小阻带衰减 | 旁瓣峰值 |
|---|---|---|---|
| 矩形 | 1.8π/N | −21 dB | −13 dB |
| 汉宁 | 6.2π/N | −44 dB | −31 dB |
| 汉明 | 6.6π/N | −53 dB | −41 dB |
| 布莱克曼 | 11.1π/N | −74 dB | −57 dB |
设计步骤只有四步:
- 由
αs选窗型(比如要 50 dB → 汉明或布莱克曼); - 由
Δω估长度:N ≈ 6.6π/Δω(汉明),取奇数做成 Type I 线性相位; - 算
h_d[n]并乘窗; - 归一化:
Σh[n] = 1,保证直流增益精确为 1。
五、线性相位与群延迟
群延迟定义为相位的负导数 −dφ/dω,物理含义是"这一小段频率被整体延迟了多少时间"。
| 线性相位 FIR | 一般 IIR | |
|---|---|---|
| 条件 | h[n] = ±h[N−1−n] | 无简单条件 |
| 群延迟 | 恒为 (N−1)/2 拍 | 随频率变化 |
| 波形 | 不失真(各频率同延迟) | 会失真 |
(N−1)/2 = 53 拍在 8 kHz 下就是 6.625 ms——这就是线性相位要付的"纯延迟"代价。通信里这个延迟必须算进时序,音频里它能保证鼓点的瞬态不被抹开。
六、实现结构:为什么用二阶节而不是高阶直连
| 结构 | 形式 | 什么时候用 |
|---|---|---|
| Direct Form I | 先全零点再接全极点 | 直观、系数敏感 |
| Direct Form II | 共用延迟线,省一半存储 | 常用 |
| 级联二阶节 | 多个 biquad 相乘 | 高阶首选 |
| 并联 | 部分分式展开后相加 | 需要并行计算 |
级联二阶节的理由:高阶直接型的极点极靠近虚轴,系数量化误差会把极点推出单位圆,滤波器直接发散。拆成多个低 Q 的 biquad,量化误差被分散,稳定性有保证。定点 DSP 上从来不会去实现"8 阶差分方程",只会实现 4 个二阶节。
示例
例 1:设计一个 107 抽头的汉明窗 FIR 低通并实测(C)
目标:fs = 8000 Hz,fc = 1000 Hz,阻带衰减要求 50 dB。选汉明窗,用上面的公式估出抽头数,然后用三个频率的信号实测它的增益——通带 500 Hz、截止 1000 Hz、阻带 1500 Hz。
/* 汉明窗 FIR 低通:107 抽头,实测通带/截止/阻带三个频率的增益与群延迟 */
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
#define NTAP 107
int main(void)
{
double fs = 8000.0, fc = 1000.0;
double h[NTAP];
double total = 0.0;
int m = (NTAP - 1) / 2;
static const double freqs[3] = {500.0, 1000.0, 1500.0};
static const char *bands[3] = {"passband", "cutoff", "stopband"};
for (int i = 0; i < NTAP; i++) {
int k = i - m;
double s = (k == 0) ? (2.0 * fc / fs) : (sin(2.0 * PI * fc / fs * k) / (PI * k));
double w = 0.54 - 0.46 * cos(2.0 * PI * i / (NTAP - 1));
h[i] = s * w;
total += s * w;
}
for (int i = 0; i < NTAP; i++) {
h[i] /= total; /* 归一化:直流增益精确为 1 */
}
printf("%-10s %-14s %-14s %-10s\n", "freq(Hz)", "abs(H)", "gain(dB)", "band");
for (int j = 0; j < 3; j++) {
double wr = 2.0 * PI * freqs[j] / fs;
double sr = 0.0, si = 0.0;
for (int i = 0; i < NTAP; i++) {
sr += h[i] * cos(wr * i);
si -= h[i] * sin(wr * i);
}
double g = sqrt(sr * sr + si * si);
printf("%-10.0f %-14.6f %-14.4f %-10s\n", freqs[j], g, 20.0 * log10(g), bands[j]);
}
printf("group delay = %d samples = %.4f ms\n", m, m / fs * 1000.0);
return 0;
}
c 本站为静态站,不提供在线运行;可复制到本地用 gcc / python 执行
预期输出:
freq(Hz) abs(H) gain(dB) band
500 0.999701 -0.0026 passband
1000 0.500000 -6.0206 cutoff
1500 0.000531 -65.4961 stopband
group delay = 53 samples = 6.6250 ms读数:
- 500 Hz 处增益 −0.0026 dB,通带几乎是平的;
- 1000 Hz 处正好 −6.0206 dB——这个数字是"截止频率"的定义(幅度降为一半)。它能精确落在 −6 dB,说明系数归一化(直流增益 = 1)和对称性都对;
- 1500 Hz 处 −65.50 dB,已经比窗函数表的 −53 dB 还要深,余量充足;
- 群延迟 53 拍 = 6.625 ms 就是线性相位的代价。
例 2:从指标到系数,四件事一次验完(Python)
C 段只做了 FIR 的实现与实测。这一段补上设计方法本身:巴特沃斯阶数反解、双线性变换的预畸变误差、FIR 窗函数法的完整设计与实测、以及巴特沃斯极点的 Q 分布。
import math
def pad(s, w):
dw = sum(2 if ord(c) > 0x2000 else 1 for c in str(s))
return str(s) + " " * max(0, w - dw)
def table(head, rows, gap=2):
data = [[str(c) for c in r] for r in rows]
w = [max([sum(2 if ord(c) > 0x2000 else 1 for c in str(head[i]))]
+ [sum(2 if ord(c) > 0x2000 else 1 for c in r[i]) for r in data]) + gap
for i in range(len(head))]
print(" " + "".join(pad(head[i], w[i]) for i in range(len(head))))
for r in data:
print(" " + "".join(pad(r[i], w[i]) for i in range(len(head))))
def fft(x):
n = len(x)
re = [float(v) for v in x]
im = [0.0] * n
j = 0
for i in range(n):
if i < j:
re[i], re[j] = re[j], re[i]
m = n >> 1
while m >= 1 and j >= m:
j -= m
m >>= 1
j += m
length = 2
while length <= n:
half = length >> 1
for s in range(0, n, length):
for t in range(half):
th = -2.0 * math.pi * t / length
wr, wi = math.cos(th), math.sin(th)
br, bi = re[s + half + t], im[s + half + t]
tr = wr * br - wi * bi
ti = wr * bi + wi * br
re[s + half + t] = re[s + t] - tr
im[s + half + t] = im[s + t] - ti
re[s + t] += tr
im[s + t] += ti
length <<= 1
return re, im
print("=== 1. 巴特沃斯低通:从指标反解阶数(最多平坦幅度)===")
ap = 1.0
wp = 1.0
def butt_n(ap_db, ws, as_db):
return math.log10((10 ** (as_db / 10.0) - 1) / (10 ** (ap_db / 10.0) - 1)) / (2 * math.log10(ws))
rows = []
for as_db in (20.0, 40.0, 60.0):
nc = butt_n(ap, 2.0, as_db)
n = math.ceil(nc)
wc = wp / (10 ** (ap / 10.0) - 1) ** (1.0 / (2 * n))
real = 10 * math.log10(1 + (2.0 / wc) ** (2 * n))
rows.append(["%.0f dB" % as_db, "%.4f" % nc, "%d" % n, "%.5f" % wc, "%.2f dB" % real])
table(["阻带要求(ωs = 2)", "阶数计算值", "取整 n", "校核用 ωc", "ωs 处实际衰减"], rows)
print(" 通带指标固定 αp = 1 dB @ ωp = 1,阻带从 ωs = 2 起。")
print(" 阶数取整后必须回代校核:n = 8 时实际衰减 42.30 dB,比要求的 40 dB 多出 2.30 dB 余量。")
print()
print("=== 2. 双线性变换:不预畸变会偏多少 ===")
fs = 8000.0
T = 1.0 / fs
rows = []
for f in (500.0, 1000.0, 2000.0, 3000.0):
om = 2 * math.pi * f / fs
warp = (2.0 / T) * math.tan(om / 2.0)
naive_real = (fs / math.pi) * math.atan(math.pi * f / fs)
rows.append(["%.0f Hz" % f, "%.4f rad" % om, "%.2f Hz" % warp,
"%.2f Hz" % naive_real, "%.2f%%" % ((f - naive_real) / f * 100)])
table(["想要的数字截止", "数字角频率 ω", "预畸变模拟频率 Ω", "不预畸变实际截止", "偏差"], rows)
print(" 预畸变公式:Ω = (2/T)·tan(ω/2)。低频段 tan(x) ≈ x,偏不偏看不出来;")
print(" 到 3000 Hz(0.75 倍奈奎斯特)不预畸变已经把 3000 Hz 做成了 2207.76 Hz,偏掉 26.41%。")
print()
print("=== 3. FIR 窗函数法:窗型定衰减,长度定过渡带 ===")
rows = [["窗函数", "过渡带 Δω", "最小阻带衰减", "旁瓣峰值"],
["矩形", "1.8π/N", "−21 dB", "−13 dB"],
["汉宁", "6.2π/N", "−44 dB", "−31 dB"],
["汉明", "6.6π/N", "−53 dB", "−41 dB"],
["布莱克曼", "11.1π/N", "−74 dB", "−57 dB"]]
table(rows[0], rows[1:])
as_need = 50.0
df_edge = 250.0
dw = 2 * math.pi * df_edge / fs
n_est = 6.6 * math.pi / dw
n_tap = int(math.ceil(n_est))
if n_tap % 2 == 0:
n_tap += 1
fc = 1000.0 / fs
m = (n_tap - 1) // 2
h = []
for i in range(n_tap):
k = i - m
if k == 0:
s = 2 * fc
else:
s = math.sin(2 * math.pi * fc * k) / (math.pi * k)
w = 0.54 - 0.46 * math.cos(2 * math.pi * i / (n_tap - 1))
h.append(s * w)
gsum = sum(h)
h = [v / gsum for v in h]
big = 8192
hb = h + [0.0] * (big - n_tap)
re2, im2 = fft(hb)
mag = [abs(complex(re2[k], im2[k])) for k in range(big // 2 + 1)]
kpass = int(800.0 / fs * big)
kstop = int(1500.0 / fs * big)
rip = max(abs(mag[k]) for k in range(kpass + 1))
stop = max(mag[k] for k in range(kstop, big // 2 + 1))
print(" 目标:阻带衰减 ≥ 50 dB → 选汉明窗;过渡带 250 Hz(fs = 8000)→ Δω = %.4f rad" % dw)
print(" 抽头数估算 N = 6.6π/Δω = %.2f → 取奇数 N = %d 抽头(Type I,可做严格线性相位)" % (n_est, n_tap))
rows = [
["通带 0~800 Hz 最大偏差", "%.6f(%.4f dB)" % (rip, 20 * math.log10(rip))],
["阻带 1500~4000 Hz 最小衰减", "%.2f dB" % (20 * math.log10(stop))],
["群延迟 (N−1)/2", "%d 拍 = %.4f ms" % (m, m / fs * 1000)],
["系数总和(直流增益)", "%.6f" % gsum],
]
table(["实测指标", "数值"], rows)
print(" 实测阻带 %.2f dB,比窗函数表的 −53 dB 还深一点;通带几乎平的(%.4f dB)。"
% (20 * math.log10(stop), 20 * math.log10(rip)))
print(" 两条规律:窗型决定能达到的衰减下限,抽头数决定过渡带的宽窄。")
print()
print("=== 4. 巴特沃斯极点与 Q 值:n 阶就是 n 个二阶节 ===")
n = 8
rows = []
for k in range(n):
th = math.pi * (2 * k + n + 1) / (2 * n)
rows.append(["k = %d" % k, "%.4f" % math.cos(th), "%.4f" % math.sin(th), "%.4f°" % math.degrees(th), "%.4f" % (1.0/(2*abs(math.cos(th))))])
table(["极点序号", "实部", "虚部", "极角", "Q = 1/(2σ)"], rows)
print(" n = 8 的 8 个极点均匀分布在同一段半圆上(巴特沃斯的特点:幅度最平坦),")
print(" 每一对共轭极点做成一个二阶节(biquad),8 阶就是 4 个 biquad 级联 —— 这就是实际滤波器的结构。")
print(" 阶数越高极点越靠近虚轴(Q 越大),对系数量化越敏感 —— 数字实现时宁可级联多个二阶节。")
python 本站为静态站,不提供在线运行;可复制到本地用 gcc / python 执行
预期输出:
=== 1. 巴特沃斯低通:从指标反解阶数(最多平坦幅度)===
阻带要求(ωs = 2) 阶数计算值 取整 n 校核用 ωc ωs 处实际衰减
20 dB 4.2894 5 1.14468 24.25 dB
40 dB 7.6185 8 1.08812 42.30 dB
60 dB 10.9405 11 1.06334 60.36 dB
通带指标固定 αp = 1 dB @ ωp = 1,阻带从 ωs = 2 起。
阶数取整后必须回代校核:n = 8 时实际衰减 42.30 dB,比要求的 40 dB 多出 2.30 dB 余量。
=== 2. 双线性变换:不预畸变会偏多少 ===
想要的数字截止 数字角频率 ω 预畸变模拟频率 Ω 不预畸变实际截止 偏差
500 Hz 0.3927 rad 3182.60 Hz 493.72 Hz 1.26%
1000 Hz 0.7854 rad 6627.42 Hz 952.88 Hz 4.71%
2000 Hz 1.5708 rad 16000.00 Hz 1695.38 Hz 15.23%
3000 Hz 2.3562 rad 38627.42 Hz 2207.76 Hz 26.41%
预畸变公式:Ω = (2/T)·tan(ω/2)。低频段 tan(x) ≈ x,偏不偏看不出来;
到 3000 Hz(0.75 倍奈奎斯特)不预畸变已经把 3000 Hz 做成了 2207.76 Hz,偏掉 26.41%。
=== 3. FIR 窗函数法:窗型定衰减,长度定过渡带 ===
窗函数 过渡带 Δω 最小阻带衰减 旁瓣峰值
矩形 1.8π/N −21 dB −13 dB
汉宁 6.2π/N −44 dB −31 dB
汉明 6.6π/N −53 dB −41 dB
布莱克曼 11.1π/N −74 dB −57 dB
目标:阻带衰减 ≥ 50 dB → 选汉明窗;过渡带 250 Hz(fs = 8000)→ Δω = 0.1963 rad
抽头数估算 N = 6.6π/Δω = 105.60 → 取奇数 N = 107 抽头(Type I,可做严格线性相位)
实测指标 数值
通带 0~800 Hz 最大偏差 1.000524(0.0046 dB)
阻带 1500~4000 Hz 最小衰减 -58.13 dB
群延迟 (N−1)/2 53 拍 = 6.6250 ms
系数总和(直流增益) 1.000471
实测阻带 -58.13 dB,比窗函数表的 −53 dB 还深一点;通带几乎平的(0.0046 dB)。
两条规律:窗型决定能达到的衰减下限,抽头数决定过渡带的宽窄。
=== 4. 巴特沃斯极点与 Q 值:n 阶就是 n 个二阶节 ===
极点序号 实部 虚部 极角 Q = 1/(2σ)
k = 0 -0.1951 0.9808 101.2500° 2.5629
k = 1 -0.5556 0.8315 123.7500° 0.9000
k = 2 -0.8315 0.5556 146.2500° 0.6013
k = 3 -0.9808 0.1951 168.7500° 0.5098
k = 4 -0.9808 -0.1951 191.2500° 0.5098
k = 5 -0.8315 -0.5556 213.7500° 0.6013
k = 6 -0.5556 -0.8315 236.2500° 0.9000
k = 7 -0.1951 -0.9808 258.7500° 2.5629
n = 8 的 8 个极点均匀分布在同一段半圆上(巴特沃斯的特点:幅度最平坦),
每一对共轭极点做成一个二阶节(biquad),8 阶就是 4 个 biquad 级联 —— 这就是实际滤波器的结构。
阶数越高极点越靠近虚轴(Q 越大),对系数量化越敏感 —— 数字实现时宁可级联多个二阶节。四条结论:
- 巴特沃斯阶数要取整后回代校核:40 dB 的要求算出
n = 7.6185,取整到 8 阶;用Ωc = 1.08812回代,实际衰减 42.30 dB——多出 2.30 dB 余量。直接报"n = 7.6"或不校核都是错的。 - 预畸变在高频段绝不能省:1000 Hz 处不预畸变偏 4.71%,3000 Hz 处偏 26.41%(把 3000 Hz 做成了 2207.76 Hz)。
- FIR 设计公式够用:要求 50 dB 衰减 → 选汉明窗;过渡带 250 Hz(
Δω = 0.1963 rad)→N ≈ 105.60,取 107 抽头,实测阻带 −58.13 dB、通带偏差 0.0046 dB,都达标。 - 极点分布决定实现方式:
n = 8的极点极角从 101.25° 到 258.75° 均匀铺开,Q从 0.5098 到 2.5629(差 5 倍)——高 Q 的那几对就是量化最敏感的地方,也是必须拆成 biquad 的原因。
考点
考点
1. 指标五要素
ωp / ωs / αp / αs / Δω = ωs − ωp。过渡带宽度直接决定阶数,是所有设计题的起点。
2. 巴特沃斯(高频考点)
|H(jΩ)|² = 1/(1 + (Ω/Ωc)^(2n));Ω = Ωc处恒为 −3 dB,与n无关。- 阶数:
n ≥ lg[(10^(αs/10)−1)/(10^(αp/10)−1)] / (2·lg(ωs/ωp)),取整后回代校核。 - 极点:半径
Ωc的左半圆上等角度分布,角度π(2k+n+1)/(2n)。 - 通带最平坦、无波纹,但过渡带最宽(同阶数下比切比雪夫差)。
3. 频率变换
低通原型换元即得高通 s → ωpωc/s、带通 s → (s²+ω0²)/(B s)、带阻 s → B s/(s²+ω0²),其中 B = ω2 − ω1、ω0 = sqrt(ω1ω2)。阶数不变、幅度形状不变。
4. 双线性变换与预畸变(最易错)
s = (2/T)(1−z⁻¹)/(1+z⁻¹);把左半平面映射到单位圆内,稳定性自动保持。- 预畸变公式
Ω = (2/T)tan(ω/2),绝不能省:8 kHz 下 3000 Hz 不预畸变会偏 26.41%。 - 记住
tan(x) ≈ x只在低频成立——"低频看着没问题"不代表公式对。
5. FIR 窗函数法
- "窗型定衰减、长度定过渡带"。
- 过渡带:矩形
1.8π/N、汉宁6.2π/N、汉明6.6π/N、布莱克曼11.1π/N。 - 抽头必须归一化(
Σh[n] = 1)才有精确的直流增益 1。 - 取奇数长度才能做成 Type I 严格线性相位。
6. 线性相位与群延迟
- 条件
h[n] = ±h[N−1−n];群延迟恒为(N−1)/2拍(本页 107 抽头 → 53 拍 → 6.625 ms)。 - 线性相位换的是"波形不失真",代价是固定延迟与更多阶数。
7. 易错点清单
- 忘了"取整后回代校核",直接拿计算出的非整数当阶数。
- 不预畸变就用双线性变换(高频段误差可达 26% 以上)。
- 把"截止频率"当成 −3 dB:模拟原型是 −3 dB(
Ωc),而 FIR 窗函数法的fc习惯定义在 −6 dB——本页例 1 实测 1000 Hz 处正好 −6.0206 dB,这就是定义差异。 - FIR 抽头数取偶数还想做 Type I 线性相位。
- 不归一化就报通带增益:直流增益会是
Σh[n]而不是 1。 - 高阶滤波器直接写成一个 8 阶差分方程:量化的极点会跑出单位圆,必须拆 biquad。
小结
- 滤波器设计 = 从指标反求系数,指标五要素里过渡带
Δω决定一切代价。 - 巴特沃斯最平坦但过渡带最宽:
n由公式反解、取整、回代校核;极点均匀铺在左半圆上,越高阶 Q 越大。 - 频率变换让一个低通原型通吃四种滤波器,只做代数换元,不改阶数。
- IIR 走双线性变换,必须预畸变:低频能偷懒,高频差 26%(3000 Hz 变成 2207.76 Hz)。
- FIR 走窗函数法,"窗型定衰减、长度定过渡带":本页 107 抽头汉明窗实测阻带 −58.13 dB、通带偏差 0.0046 dB、群延迟 53 拍。
- 实现上一律级联二阶节:高 Q 极点对量化最敏感,这正是"为什么实际芯片上都是 biquad 串联"的答案。
回到分支:上一章把 H(z) 变成循环里的一行,这一章解决了"那一行的系数从哪来"。到这里,Z 变换 → 数字信号处理(DSP) → 滤波器设计这条线就走完了:看频谱(变换)、定系统(设计)、跑算法(实现)。
往下,滤波器在系统里的位置由通信决定——每一级接收机前端都靠它选出想要的频段、滤掉邻道干扰,这条线索接到 通信原理:调制、编码、信道;而 采样定理 会交代所有这些数字处理的入口约束。前置数学仍是 复变函数与积分变换。
这一章回答的是"给定指标怎么把滤波器造出来";下一章问的是"信号怎么被搬上载波、又在有噪声的信道上活下来"。
下一篇:通信原理:调制、编码、信道
评论(0)
当前浏览器不允许本地存储,评论无法保存。
还没有评论,来说两句。