【数字信号处理含matlab代码】第三篇:线性相位 FIR 滤波器(二)——Type-3 与 Type-4 及自动识别
第三篇:线性相位 FIR 滤波器(二)——Type-3 与 Type-4 及自动识别
在上一篇中,我们领略了偶对称(Type‑1/2)的优美余弦展开。然而,工程中还存在另一类重要的线性相位滤波器——奇对称(Type‑3/4),它们天生适用于希尔伯特变换和微分器。这些滤波器的幅度响应必须用正弦级数表示,且在低频(乃至高频)存在固有零点。更妙的是,我们的
ampl_ress.m仅凭对称性检查,就能自动判断当前h属于哪一类型,免去人工分类的烦恼。本篇将为你彻底揭开这些秘密。
下载链接
1. 奇对称家族的数学面貌
奇对称的条件为 ( h(n) = -h(M-1-n) )。这意味着滤波器具有反对称的冲激响应,中心点(若存在)必为零。其频率响应同样可分解为:
[
H(e^{j\omega}) = H_r(\omega) \cdot e^{-j\omega \alpha} \cdot e^{j\beta}
]
与偶对称相比,奇对称的相位中多了一个固定的 ( \pm \pi/2 ) 的相移(正是实现 90° 移相的关键)。我们关注的核心仍是实幅度响应 ( H_r(\omega) ),但它现在由正弦函数组合而成。
1.1 Type-3(( M ) 为奇数,奇对称)
设 ( M = 2L + 1 )。由于反对称,中心点 ( h(L) = 0 )。将冲激响应按中心配对:
[
H(e^{j\omega}) = \sum_{n=1}^{L} h(L-n) \left( e^{j\omega n} - e^{-j\omega n} \right) e^{-j\omega L}
]
利用欧拉公式 ( e^{j\omega n} - e^{-j\omega n} = 2j\sin(\omega n) ),并提取公因子 ( e^{-j\omega L} ),得到:
[
H(e^{j\omega}) = e^{-j\omega L} \cdot j \sum_{n=1}^{L} 2h(L-n) \sin(\omega n)
]
将复数幅度中的 ( j ) 吸收到相位里,定义幅度响应为实函数:
[
\boxed{H_r(\omega) = \sum_{n=1}^{L} c(n) \sin(\omega n)}
]
其中系数 ( c(n) = 2h(L-n) ),( n = 1,2,\dots,L )。
关键特征:当 ( \omega = 0 ) 或 ( \omega = \pi ) 时,所有 ( \sin(\omega n) = 0 ),因此Type-3 在 0 和 π 处幅度必为零。它仅适用于带通、希尔伯特变换或微分器(且不能通过低通/高通)。
1.2 Type-4(( M ) 为偶数,奇对称)
设 ( M = 2L )。反对称中心位于半整数点:
[
H(e^{j\omega}) = \sum_{n=1}^{L} h(L-n) \left( e^{j\omega (n-0.5)} - e^{-j\omega (n-0.5)} \right) e^{-j\omega (L-0.5)}
]
利用差分得 ( 2j\sin(\omega(n-0.5)) ),因此:
[
\boxed{H_r(\omega) = \sum_{n=1}^{L} d(n) \sin\left(\omega (n-0.5)\right)}
]
其中 ( d(n) = 2h(L-n) ),( n = 1,2,\dots,L )。
关键特征:当 ( \omega = 0 ) 时,所有 ( \sin(0) = 0 ),所以Type-4 在直流处必为零;但它在 ( \omega = \pi ) 处不一定为零,因此可以设计高通滤波器(但不是标准高通,通常用于微分器或希尔伯特器)。
2. 代码剖析:hr_type3.m
function[Hr,w,c,L]=hr_type3(h);%Computes Amplitude response of Type-3 LP FIR filter % 注释中的 LP 不准确,应为通用- 输入:长度为奇数的奇对称序列
h(中心点应为零,但代码并未显式检查)。 - 输出:
Hr、w、c(正弦展开系数)、L。
核心代码:
M=length(h);L=(M-1)/2;c=[h(L+1:-1:1)];% 注意:这里取了包含中心点在内的所有左侧样本,但中心点 h(L+1) 理论上为 0n=[0:L];w=[0:500]'*pi/500;Hr=sin(w*n)*c';分析:
代码中c包含了h(L+1:-1:1),即从中心向左直到第一个样本。由于h(L+1)=0,所以c(1)=0,正弦级数从n=0开始,第一项为 0,不影响结果。这实际上等价于公式中的c(n)=2h(L-n)在索引上的微调(MATLAB 索引从 1 开始)。
例如M=5(L=2),h = [h0, h1, 0, -h1, -h0],c = [0, h1, h0],n=[0,1,2],则Hr = sin(0)*0 + sin(w)*h1 + sin(2w)*h0,但公式应为2*h1*sin(w) + 2*h0*sin(2w)。这里出现了因子 2 的缺失!实际上,hr_type3.m的写法有误,它没有乘以 2,也没有正确排除中心零值。对比hr_type1中明确的2*系数,hr_type3缺少了这个因子。这是一个潜在的 bug,后续在使用时需注意。合理的写法应为:
c=2*h(L:-1:1);% 排除中心点,取左半部分并乘 2n=[1:L];Hr=sin(w*n)*c';但现存的代码仍然可以工作,因为所有系数都被缩小了 2 倍,形状不变,只是幅度缩放。在ampl_ress中调用时,若类型识别正确,结果仍能保持相对关系。但为了严谨,我们应知悉这一点。
3. 代码剖析:hr_type4.m
function[Hr,w,d,L]=hr_type4(h);%Computes Amplitude response of Type-4 LP FIR filter核心代码:
M=length(h);L=M/2;d=2*[h(L:-1:1)];n=[1:L];n=n-0.5;w=[0:500]'*pi/500;Hr=sin(w*n)*d';这里d正确乘以了 2,且n取半整数,与公式完全吻合。所以hr_type4是正确的,而hr_type3缺少系数 2,但因其中心为零,若将中心剔除并乘 2,可得到一致结果。实际中我们可以容忍这种幅度缩放,因为很多应用中只关心相对形状。
4. 自动识别大师:ampl_ress.m
ampl_ress函数是整个幅度响应分析的门面,它接收一个冲激响应h,自动判断其类型并调用相应的hr_type*,输出幅度响应和多项式系数。我们逐段解析其智能逻辑。
function[Hr,w,P,L,type]=ampl_ress(h)M=length(h);4.1 奇数长度情况
ifrem(M,2)==1ifall(abs(h(1:(M-1)/2)-h(M:-1:(M+3)/2))<1e-8),[Hr,w,P,L]=hr_type1(h);type=1;elseifall(abs(h(1:(M-1)/2)+h(M:-1:(M+3)/2))<1e-8)&h((M+1)/2)==0,[Hr,w,P,L]=hr_type3(h);type=3;elsedisp('not a linear-phase filter, check h'),return,end- 首先判断是否为偶对称:比较左半部分
h(1:(M-1)/2)与右半部分的翻转h(M:-1:(M+3)/2),若差值全小于1e-8,则为 Type-1。 - 否则判断是否为奇对称:比较左半部分与右半部分翻转的负值(即相加接近 0),并且中心点
h((M+1)/2)必须为 0,满足则为 Type-3。 - 若都不满足,则报错退出。
4.2 偶数长度情况
elseifall(abs(h(1:M/2)-h(M:-1:M/2+1))<1e-8),[Hr,w,P,L]=hr_type2(h);type=2;elseifall(abs(h(1:M/2)+h(M:-1:M/2+1))<1e-8),[Hr,w,P,L]=hr_type4(h);type=4;elsedisp('not a linear-phase filter, check h'),return,endend- 偶数长度下,无需检查中心点,直接判断左半与右半翻转的差(偶对称 → Type-2)或和(奇对称 → Type-4)。
- 容差
1e-8很好地容忍了浮点计算误差。
亮点:
ampl_ress将四种类型的判断封装成一个接口,用户无需关心内部细节,只需传入h,即可获得正确的幅度响应,同时返回type供后续参考。
5. 使用示例与对比
我们构造一个典型的 Type-3 滤波器(奇数长,奇对称),例如一个希尔伯特变换器的冲激响应:
h=[0.1,-0.2,0,0.2,-0.1];% 奇对称,中心为零[Hr,w,P,L,type]=ampl_ress(h);fprintf('滤波器类型:%d\n',type);plot(w/pi,Hr);xlabel('\omega / \pi');ylabel('H_r(\omega)');你会看到type = 3,且Hr在 0 和 π 处均为零(数值上接近 0)。
同样,对于 Type-4(偶数长,奇对称),如h = [0.1, -0.2, 0.2, -0.1],ampl_ress将正确识别为类型 4,并调用hr_type4。
6. 奇对称家族的工程用途
| 类型 | 直流响应 | 高频响应 | 典型应用 |
|---|---|---|---|
| Type-3 | 必为零 | 必为零 | 窄带带通、希尔伯特变换(需配合频移)、微分器(中频段) |
| Type-4 | 必为零 | 可不为零 | 宽带希尔伯特变换、微分器(高频提升) |
设计时需注意,奇对称滤波器的群延迟仍为常数(M-1)/2,但其相频特性包含一个固定的 90° 偏移,这正是实现正交变换(如希尔伯特)的关键。
7. 资源下载与系列进度
本系列所有代码均已打包,可点击下方链接免费获取(包含全部.m文件及示例脚本):
📥下载链接:点击下载全套代码
截至目前,我们已经完成了线性相位 FIR 滤波器幅度响应的全部四种类型分析。下一篇,我们将跳出时域冲激响应,直接利用freqz_m计算更为全面的频率响应指标(dB 幅值、相位、群延迟),让滤波器的性能一目了然。
下篇预告:频率响应进阶——幅值、相位、群延迟一站式计算。我们将揭示
freqz_m如何包装 MATLAB 原生函数,并提供更加工程化的输出格式,同时探讨群延迟对信号失真的影响。
思考题:若你使用hr_type3.m原版代码计算一个幅度响应,发现其数值比理论预期小了一半,你能快速定位原因并修改吗?欢迎在评论区讨论。
