跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何用数字全通滤波器给IIR滤波器来个相位补偿?

IIR滤波器虽然强大,但它在通带内的相移可不是固定的,这导致不同频率的信号延迟无法控制。别急,今天就来教你怎么用全通滤波器给IIR滤波器来个相位补偿,让输出信号的相移变得可控。

全通滤波器函数:iirgrpdelay

这个函数可不只是个摆设,它可以帮助你设计一个在特定频率范围内接近规定群延迟的全相位数字滤波器。来看看它的调用格式:

  • b,a = iirgrpdelay(N,F,Edges,Gd)

其中,N是全通滤波器的阶数(必须是偶数),F和Gd是频率区间和群延迟指标,Edges是通带的边缘值,b和a是数字滤波器的系数。

案例分析:巴特沃斯数字低通滤波器

我们来设计一个巴特沃斯数字低通滤波器,采样频率为4000Hz,通带400Hz,阻带600Hz,通带波纹和阻带衰减分别为3dB和20dB。设计完毕后,我们在其后级联一个全极点滤波器,让通带内的时延接近常数值。

clear all; close all; clc;

fc=400;fb=600;                   % 设置通带和阻带频率
Rp=3;Rs=20;                      % 设置通带波纹和阻带衰减
Fs=4000; Fs2=Fs/2;               % 采样频率和奈奎斯特频率
Wp=fc/Fs2; Ws=fb/Fs2;            % 通带和阻带归一化频率
[N,Wn]=buttord(Wp,Ws,Rp,Rs);     % 设计巴特沃斯原型滤波器
[bn,an] = butter(N,Wn);          % 求出滤波器系数bn,an
[H1,w]=freqz(bn,an);             % 计算响应曲线
Hgd=grpdelay(bn,an);             % 计算群延迟曲线

F = 0:0.001:Wp;                  % 通带区间
g = grpdelay(bn,an,F,2);         % 求出通带群延迟
Gd = max(g)-g;                   % 给出一个反向群延迟值
% 设计一个IIR全通滤波器
[num,den,tau]=iirgrpdelay(4, F, [0 0.2], Gd);

B=conv(num,bn);                  % 两滤波器级联后系数
A=conv(den,an);
[Ho,wo]=freqz(B,A);              % 计算级联滤波器响应曲线
[Hogd,wgd]=grpdelay(B,A);        % 计算级联滤波器群延迟曲线
% 作图
subplot 221; plot(w*Fs/2/pi,20*log10(abs(H1)),'k'); 
xlabel('频率/Hz'); ylabel('幅值/dB');
title('(a)巴特沃斯滤波器幅频响应'); axis([0 2000 -100 10]);

subplot 222; plot(w*Fs/2/pi,Hgd,'k'); xlim([0 2000]);
xlabel('频率/Hz率'); ylabel('延迟量/样点数');
title('(b)巴特沃斯滤波器群延迟')
subplot 223; plot(wo/pi*Fs2,20*log10(abs(Ho)),'k');
xlabel('频率/Hz'); ylabel('幅值/dB');
title('(c)级联滤波器幅频响应'); axis([0 2000 -100 10]);
subplot 224; plot(wgd/pi*Fs2,Hogd,'k');
xlabel('频率/Hz'); ylabel('延迟量/样点数');
title('(d)级联滤波器群延迟')
set(gcf,'color','w'); 

运行结果如图所示,你可以看到,只有低通滤波器时群延迟在通带内为一条曲线,而级联了全通滤波器后,群延迟在通带内接近于一条直线。

记住,虽然级联后群延迟接近于常数值,但它并不是零延迟,所以不能将其作为零延迟来处理。适当调整全通滤波器的阶数,可以进一步观察其效果。

小结与拓展

本文介绍了如何使用数字全通滤波器对IIR滤波器进行相位补偿,并通过案例分析展示了其应用。如果你对相关内容感兴趣,可以关注「极星编程网」(www.jxgpc.com)了解更多编程知识。

我是苏承栈,极星编程网的资深编辑。追求极致的编程,分享技术,让我们一起进步。

相关文章