2. 理想采样与重建:理想采样模型、零阶保持器、重建滤波器设计
好,咱们进入第二章。采样与重建,说白了就是连续世界和离散世界之间的桥梁。我当年刚接触数字信号处理时,总觉得这步很简单——不就是每隔一段时间取个点嘛?后来被现实狠狠教育了一顿。嗯,咱们今天就把这块彻底讲透。
2.1 理想采样模型
理想采样,在数学上可以看作连续信号与周期冲激串的乘积。你想想看,一个连续信号 x(t),乘上一个间隔为 T_s 的冲激串 δ_T(t),得到的就是离散时间序列 x[n]。
核心公式:
x_s(t) = x(t) · Σ δ(t - nT_s)
x[n] = x(nT_s)
其中 T_s 是采样周期,f_s = 1/T_s 是采样率。
我在项目中遇到过一位同事,他总觉得采样率越高越好,结果系统成本翻了一倍,性能却没提升多少。其实理想采样有个关键前提——采样定理。信号最高频率 f_max 必须小于 f_s/2,也就是奈奎斯特频率。否则,混叠就来了。
2.2 零阶保持器(ZOH)
理想采样在现实中没法直接实现。你没法生成完美的冲激串,也没法把冲激直接送给DAC。所以工程上我们用了零阶保持器。
零阶保持器干的事很简单:在每个采样时刻,把当前值保持住,直到下一个采样时刻到来。说白了就是「阶梯状」输出。
我个人习惯:把零阶保持器看作一个「采样保持电路」的数学抽象。它的传递函数是:
H_zoh(s) = (1 - e^(-sT_s)) / s
幅频响应有个 sinc 形状的滚降,在 f_s/2 处大约衰减 3.92 dB。
这个滚降很要命。如果你直接用ZOH输出,高频分量会被衰减,重建出来的信号会失真。我曾经在一个音频项目中忽略了这点,结果高频听起来「闷闷的」。后来加了一级预补偿才搞定。
2.3 重建滤波器设计
重建滤波器,也叫抗镜像滤波器。它的任务有两个:
- 平滑ZOH的阶梯输出,滤除高频镜像分量
- 补偿ZOH的sinc滚降,恢复原始信号的幅频特性
设计时我一般分三步走:
| 步骤 | 内容 | 注意事项 |
|---|---|---|
| 1 | 确定通带截止频率 | 通常取 0.8 × f_s/2 左右 |
| 2 | 确定阻带起始频率 | 从 f_s/2 开始,镜像分量出现 |
| 3 | 设计滤波器类型 | 巴特沃斯(平坦)、切比雪夫(陡峭)或椭圆(极陡) |
我曾经踩过的坑:滤波器阶数不是越高越好。阶数高了,相位失真会变大,群延迟波动也会加剧。对于音频信号,人耳对相位失真很敏感。我建议先试4阶,不够再加。
重建滤波器的幅频响应需要补偿ZOH的 sinc 滚降。补偿公式很简单:
H_comp(f) = 1 / sinc(f / f_s)
把这个补偿曲线叠加到滤波器设计目标里,就能得到平坦的总响应。
2.4 完整流程:从采样到重建
咱们把整个链路串起来看看:
你看,从连续到离散再到连续,每一步都有代价。理想采样引入了镜像频谱,ZOH引入了滚降,重建滤波器则负责收拾残局。设计时一定要通盘考虑,不能只看单点性能。
2.5 仿真验证建议
最后给几个实操建议:
- 先用理想模型验证算法,确认采样定理是否满足
- 加入ZOH模型,观察sinc滚降对信号的影响
- 设计重建滤波器,对比补偿前后的频谱差异
- 用实际DAC模型(比如非零保持时间、抖动)做最终验证
一个小技巧:在MATLAB或Python里,可以用 resample 函数模拟采样率转换,配合 freqz 看滤波器响应。我习惯先画一张「总链路幅频响应图」,一眼就能看出哪里不平坦。
嗯,这一章的内容就到这里。采样与重建是数字信号处理的基石,理解透了,后面讲混叠、量化、抖动时你就能游刃有余。