news 2026/7/30 0:35:55

【数字信号处理含matlab代码】第三篇:线性相位 FIR 滤波器(二)——Type-3 与 Type-4 及自动识别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【数字信号处理含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(中心点应为零,但代码并未显式检查)。
  • 输出Hrwc(正弦展开系数)、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原版代码计算一个幅度响应,发现其数值比理论预期小了一半,你能快速定位原因并修改吗?欢迎在评论区讨论。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/30 0:27:13

3个痛点告诉你为什么需要专业的用户脚本管理平台

3个痛点告诉你为什么需要专业的用户脚本管理平台 【免费下载链接】greasyfork An online repository of user scripts. 项目地址: https://gitcode.com/gh_mirrors/gr/greasyfork 你是否经常遇到网页功能不足、广告干扰严重、重复操作繁琐的问题&#xff1f;传统的浏览器…

作者头像 李华
网站建设 2026/7/29 23:59:41

【题解-信息学奥赛一本通】1368:对称二叉树(tree_c)

题目&#xff1a;1368&#xff1a;对称二叉树(tree_c) 题目描述 如果二叉树的左右子树的结构是对称的&#xff0c;即两棵子树皆为空&#xff0c;或者皆不空&#xff0c;则称该二叉树是对称的。编程判断给定的二叉树是否对称. 例&#xff1a;如下图中的二叉树T1是对称的&…

作者头像 李华
网站建设 2026/7/29 23:56:26

射频硬件最常见的10大设计问题

整理了一份量产级高频射频问题可直接落地的改善方案&#xff0c;覆盖TX发射、RX接收、PCB布局、电源干扰、WiFi/BLE共存五大场景&#xff0c;适合研发自查、试产复盘、故障定位。一、发射功率偏低、功率跳动不稳定现象传导测试功率不足、满载发包功率抖动大&#xff0c;速率越高…

作者头像 李华
网站建设 2026/7/29 23:51:59

Notchi钩子系统探秘:无缝连接Claude Code与Codex的技术原理

Notchi钩子系统探秘&#xff1a;无缝连接Claude Code与Codex的技术原理 【免费下载链接】notchi notch app for claude code & codex 项目地址: https://gitcode.com/gh_mirrors/no/notchi Notchi钩子系统是实现Claude Code与Codex无缝集成的核心技术&#xff0c;它…

作者头像 李华
网站建设 2026/7/29 23:51:57

终极文件清理神器:dupeGuru如何快速帮你找回宝贵磁盘空间

终极文件清理神器&#xff1a;dupeGuru如何快速帮你找回宝贵磁盘空间 【免费下载链接】dupeguru Find duplicate files 项目地址: https://gitcode.com/gh_mirrors/du/dupeguru dupeGuru是一款功能强大的跨平台重复文件查找工具&#xff0c;采用Python 3开发&#xff0c…

作者头像 李华