在讨论 Σ-Δ ADC 或数字滤波器时,“衰减包络(attenuation envelope)” 是一个描述滤波器整体抑制趋势的术语,特别是对高频(噪声)成分的整体衰减能力。
衰减包络描述的是滤波器频率响应中,随频率增加,信号幅度下降的“包络曲线”,通常以 dB/decade 为单位。
我们以 Sinc 滤波器 为例(SincN = (sin(πf)/(πf))ⁿ):
这就是频域中的衰减包络:它不是每个点的精确响应,而是频率-幅度整体衰减趋势的斜率上界。
虽然 FIR 的频率响应是通过窗函数窗化理想频响构建的(非解析函数),但它的 主瓣-旁瓣结构 也能定义一个类似“包络”的趋势:
找个图
项目 | 描述 |
---|---|
主瓣 | 接近直通,影响通带带宽 |
旁瓣包络 | 控制阻带衰减趋势 |
阶数越高 | 主瓣越窄,旁瓣越多,但整体包络更陡峭 |
SincN 滤波器的频率响应:
在阻带内近似为:
衰减包络斜率
做一个对比
展示了在对数频率轴下,FIR 滤波器与 Sinc³ 滤波器的频响衰减趋势和理论包络线对比:
蓝线:FIR 滤波器响应
在截止频率后迅速衰减;后续为一系列旁瓣,但整体下降不如 Sinc³ 规则
橙线:Sinc³ 滤波器响应
呈现非常规律的下降趋势;峰谷周期性出现,零点衰减非常快
黑虚线:理论衰减包络(-60 dB/dec)
对应 Sinc³ 的理论斜率;可见 Sinc³ 响应严格受控于该包络,具有典型整形特征。
FIR 滤波器的阻带衰减依赖窗函数和阶数,不一定严格遵循某个斜率
Sinc³ 滤波器具有非常规则的频域行为,且其衰减趋势完全符合理论 -60 dB/dec
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqz, firwin
# 设置参数
numtaps = 101 # FIR 滤波器阶数
cutoff = 0.1 # 归一化截止频率
fs = 1.0 # 归一化频率(Nyquist = 0.5)
# 构造 FIR 和 Sinc3 滤波器
fir_filter = firwin(numtaps, cutoff)
w_fir, h_fir = freqz(fir_filter, worN=2048, fs=fs)
# 构造 Sinc3 响应(用 sinc(f)^3 表示,f 为归一化频率)
f_sinc = np.logspace(-2.5, 0, 1000, base=10) # 10^-2.5 到 1
sinc3_response = (np.sinc(f_sinc))**3
# 计算包络线理论斜率(Sinc3 理论为 -60 dB/dec)
sinc3_envelope = -60 * np.log10(f_sinc / f_sinc[0]) # 起点为0 dB
# 绘图
plt.figure(figsize=(10, 6))
# FIR 频响(对数频率轴)
plt.semilogx(w_fir, 20 * np.log10(np.abs(h_fir) + 1e-12), label="FIR Filter", linewidth=2)
# Sinc3 响应
plt.semilogx(f_sinc, 20 * np.log10(sinc3_response + 1e-12), label="Sinc3", linewidth=2)
# Sinc3 衰减包络线(理论)
plt.semilogx(f_sinc, sinc3_envelope, '--', label="Sinc3 Envelope (-60 dB/dec)", color='black')
# 图形设置
plt.title("Attenuation Envelope: FIR vs Sinc3 (Log Frequency Scale)")
plt.xlabel("Normalized Frequency (log scale)")
plt.ylabel("Magnitude (dB)")
plt.ylim([-120, 5])
plt.grid(True, which='both')
plt.legend()
plt.tight_layout()
plt.show()