采用matlab的iirgrpdelay函数设计全通滤波器校正系统群延时

函数目标:根据描述的群延时设计全通滤波器对指定区间的群延迟进行校正。
iirgrpdelay函数共有以下7种用法:
1、[num,den] = iirgrpdelay(n,f,edges,a)
2、[num,den] = iirgrpdelay(n,f,edges,a,w)
3、[num,den] = iirgrpdelay(n,f,edges,a,w,radius)
4、[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p)
5、[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p,dens)
6、[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p,dens,initden)
7、[num,den] = iirgrpdelay(n,f,edges,a,w,radius,p,dens,initden,tau)
拿第2个[num,den] = iirgrpdelay(n,f,edges,a) 来说:
输出:num是IIR滤波器分子,den是IIR滤波器分母
输入:
n是滤波器阶数,f是角频率范围矢量如0.3:0.001:0.6
edges是通带范围如[0.3,0.6],a是描述的群延迟差如max(g)-g
下面是例子:

clc;clear all;close all;
[n,d] = ellip(4,1,35,0.6);    %椭圆滤波器(n,d为椭圆滤波器系数)   阶数:4   通带衰减(波纹)1dB   阻带衰减35dB   低通边界频率0.3
[GdH,w] = grpdelay(n,d); %求出群时延(GdH为群时延,w为角频率)
F = 0.3:0.001:0.6;            %0.3~0.6的角频率点
g = grpdelay(n,d,F,2);   % Equalize the passband(g给0~0.3的群时延)
Gd = max(g)-g;          %Gd为需要补偿的群时延量
% 采用iirgrpdelay函数全通滤波器
[num,den] = iirgrpdelay(20, F,[0.3 0.6], Gd);      %返回20阶全通滤波器,num和den是系数。
[GdA,w] = grpdelay(num,den);                    %计算全通滤波器的群时延
% 画图
He1=dfilt.df2(num,den);  %根据系数得到滤波器系统函数
He=dfilt.df2(n,d);  %根据系数得到滤波器系统函数
He_all=dfilt.cascade(He,He1); %将两个滤波器级联得到新的滤波器
grpdelay(He) %显示未校正系统的群延迟
grpdelay(He1) %显示设计的IIR滤波器群延迟
grpdelay(He_all)  %经过校正后的群延迟

结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看见设计的IIR滤波器能够对系统的指定区间的群延迟进行校正,校正后的群延迟效果非常好;
继续我们继续看一下iirgrpdelay函数是如何根据给定群延时设计IIR滤波器的,可以直接在命令窗口输入open iirgrpdelay命令,打开后我们可看见以下iirgrpdelaymex函数,但是这个函数是将c语言或fortanyuyan封装好成为mexw文件,我们是看不见内部的程序,这点比较可惜了。

[as,tau]=iirgrpdelaymex(s.denOrd,s.edges,s.f,s.des,s.wt,...
    s.maxRadius,s.P,s.density,s.Ho,s.AS); %s.Ho is actually group delay estimate in this case

猜你喜欢

转载自blog.csdn.net/qq_45362665/article/details/130235963