MATLAB代码 有限冲激响应(FIR)滤波器和无限冲激响应(IIR)滤波器
MATLAB有限冲激响应(FIR)滤波器和无限冲激响应(IIR)滤波器设计
附MATLAB代码
摘要
文章设计了一个数字信号处理仿真实验,产生一个信号,其频率成分为f1和f2,并对其进行理想采样,采样频率为fs;对采样后的信号采用快速傅里叶变换进行频谱分析,以验证信号频率的正确性;并设计有限冲激响应(FIR)滤波器和无限冲激响应(IIR)滤波器将信号分离为仅有f1或f2的正弦信号。
1采样定理
在进行模拟/数字信号的转换过程中,当采样频率fs.max大于信号中最高频率fmax的2倍时,即fs.max>2fmax,采样之后的数字信号完整地保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的2.56到4倍;采样定理又称奈奎斯特定理。如果不能满足采样定理,采样后信号的频率就会重叠,即高于采样频率一半的频率成分将被重建成低于采样频率一半的信号。
2快速傅里叶变换
快速傅里叶变换(FFT),是离散傅里叶变换(DFT)的快速算法,它是根据DFT的奇、偶、虚、实等特性,对DFT的算法进行改进获得的。设x(n)为N项的复数序列,由DFT求出N项复数序列的X(n),即N点DFT大约就需要N^2次复乘,N(N-1)次复加。在FFT中,利用WN的周期性和对称性,把一个N项序列分为两个N/2项的子序列,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要Nlog2N次的运算。这就是FFT的优越性。
3IIR滤波器
IIR 数字滤波器的特征是,具有无限持续时间冲激响应,需要用递归模型来实现。IIR数字滤波器的间接设计法是常用的IIR滤波器设计方法。它的原理是根据所要设计滤波器的参数去确定一个模拟滤波器的传输函数。模拟巴特沃斯滤波器是最为有名的模拟滤波器,由于它设计简单,性能方面又没有明显的缺点,因而得到了广泛应用。其中,巴特沃斯滤波器的特点是通频带的频率响应曲线最平滑。滤波器的截止频率的变换是通过先求出待设计滤波器的截止频率与基准滤波器的截止频率的比值M,再用这个M去除滤波器中的所有元件值来实现的,其计算公式如下:M=待设计滤波器的截止频率/基准滤波器的截止频率巴特沃斯模拟滤波器是常用的滤波器形式。
根据模拟滤波器传输函数,通过双线性变换、或冲激响应不变法来进行数字滤波器的设计。冲激响应不变法使数字滤波器的单位脉冲响应模仿模拟滤波器的单位冲激响应。由于脉冲响应不变法存在缺点,从s平面直接映射到z平面时会产生混叠现象,而且脉冲响应不变法只适合频率响应在高频处单调递减的模拟原型滤波器,因此其应用范围受到限制。
双线性变换法的主要目的是从根本上解决上述脉冲响应不变法的问题,但是相位是非线性的。双线性变换法:将整个s平面压缩变换到一中介平面的一条横带里,再将此横带变换到整个z平面。
4FIR滤波器
由于理想滤波器在边界频率处不连续,故时域信号hd(n)一定是无限时宽的,也是非因果的,所以理想低通滤波器是无法实现的。如果实现一个具有理想线性相位特性的滤波器,其幅值特性只能采用逼近理想幅频特性的方法实现。如果对时域信号hd(n)进行截取,并保证截取过程中序列保持对称,而且截取长度为N,截取后序列为h(n),则h(n)可用以下式子表示:h(n)=hd(n)*w(n)。
w(n)为截取函数,又称为窗函数。如果窗函数为矩形序列,则称之为矩形窗。窗函数有多种形式,为保证加窗后系统的线性相位特性,必须保证加窗后序列关于α=1/2∗(N−1)点对称。常用的窗函数有矩形窗、汉宁窗、汉明窗、布莱克曼窗、凯塞窗。窗函数设计法的基本思想是用一个长度为N的序列h(n)代替hd(n)。
5实验
设计一个仿真实验:
1)产生一个信号st,该信号为两路正弦信号的叠加,正弦信号的频率成分分别为f1=250HZ和f2=500HZ,相位均为0度、幅度均为1V。
2)对st进行理想采样,采样频率fs=10000HZ。
3)通过快速傅里叶变换可对信号st进行频谱分析。
4)设计FIR低通高通滤波器,将信号分离为仅有f1或f2的正弦信号。本次实验选用阻带最小衰减As=53dB的汉明窗作为窗函数。对于频率为f1的信号,可以采用低通滤波器进行分离,其指标为:通带截止频率为fp=280HZ,阻带截止频率fs=450HZ。对于频率为f2的信号,可以采用高通滤波器进行分离,其指标为:通带截止频率为fp=450HZ,阻带截止频率fs=340HZ。
5)设计IIR低通高通滤波器,将信号分离为仅有f1或f2的正弦信号。选择模拟巴特沃斯滤波器,对模拟滤波器进行双线性变换为数字滤波器。对于频率为f1的信号,可以采用低通滤波器进行分离,其指标为:通带截止频率为fp=280HZ, 通带最大衰减Rp=1dB,阻带截止频率fs=450HZ, 阻带最小衰减As=30dB。对于频率为f2的信号,可以采用高通滤波器进行分离,其指标为:通带截止频率为fp=450HZ, 通带最大衰减Rp=1dB,阻带截止频率fs=340HZ, 阻带最小衰减As=30dB。
将实验的设计用MATLAB仿真加以实现,实验的结果如下,图5-1所示为产生的信号s(t)的波形以及采样结果。使用FFT对其进行频谱分析如图5-2,
结果
选用阻带最小衰减As=53dB的汉明窗作为窗函数,FIR低通和高通数字滤波器的幅频响应如图5-3,5-4所示。
采用FIR低通滤波器进行滤波,滤波后的信号为仅有频率为f1的正弦信号x1(t)。采用FIR高通滤波器进行滤波,滤波后的信号为仅有频率为f2的正弦信号x2(t),滤波之后的信号波形以及信号的频谱归一化后如图5-5,5-6所示。由图可知,通过滤波器成功地将混叠信号分离为两个独立的信号。
采用IIR低通高通滤波器进行滤波,选择模拟巴特沃斯滤波器,对模拟滤波器进行双线性变换为数字滤波器。滤波器的幅频响应如图5-7,5-8所示。IIR低通高通滤波器进行滤波后的结果如图5-9,5-10所示,由图可知,IIR的方法进行滤波同样可以达到同FIR方法一样的效果。MATLAB代码
。
// IIR滤波器
%%%%%%%%%%%%%%%%%%%%%%%IIR滤波器
N1=10000;%采样点数
Fs=10000;T=1/Fs;Tp=N1*T;%Tp采样总时间
t=0:T:(N1-1)*T;k=0:N1-1;f=k/Tp;
f1=250;
f2=500;
xt1=sin(2*pi*f1*t);
xt2=sin(2*pi*f2*t);
st=xt1+xt2;%两路正弦信号的叠加
fxt=fft(st,N1);%快速傅里叶变换
subplot(2,1,1)
plot(t,st);grid;
xlabel('t');
ylabel('s(t)');
axis([0,0.02,min(st),max(st)]);
title('s(t)波形')
subplot(2,1,2)
stem(t,st, '.');
%stem(f,abs(fxt)/max(abs(fxt)), '.');%归一化
grid;
xlabel('T/s');
ylabel('幅度');
%axis([0,1000,0,2]);
axis([0,0.02,-2,2]);
title('s(t)采样');
%低通滤波器
wp=2*pi*280;
ws=2*pi*450;
Rp=1;
As=30;
[N,wc]=buttord(wp,ws,Rp,As,'s');%计算滤波器的阶数和3dB截止频率
[B,A]=butter(N,wc,'s');%计算滤波器系统函数分子分母多项式
fk=0:1:10000;wk=2*pi*fk;%
Hk=freqs(B,A,wk);%幅频响应
figure(2)
plot(fk,20*log10(abs(Hk)));
grid on,xlabel('频率(Hz)'),ylabel('幅度(dB)')
title('巴特沃斯模拟滤波器');
axis([0,1000,-60,5]);
[bz,az]=bilinear(B,A,Fs);%对模拟滤波器进行双线性变换
[h1,w1]=freqz(bz,az);%数字滤波器的幅频响应
figure(3);
plot(w1/pi,20*log10(abs(h1)));
grid;
xlabel('ω/π');ylabel('幅度(dB)'); title('数字低通滤波器');
axis([0,0.5,-100,0]);
ylt1=filter(bz,az,st);
figure(4);
subplot(211);
plot(t,ylt1); %滤波后
grid;
xlabel('t/s');
ylabel('x1(t)');
title('IIR滤波后的x1(t)');
axis([0,0.05,-2,2]);
fxt1=fft(ylt1,N1);%快速傅里叶变换
subplot(212);
stem(f,abs(fxt1)/max(abs(fxt1)), '.');%归一化
grid;
xlabel('f/Hz');ylabel('幅度');
axis([0,500,0,2]);
title('x1(t)频谱');
IIR滤波器传递函数包括零点和极点两组可调因素,对极点的唯一限制是在单位圆内。因此可用较低的阶数获得高的选择性,所用的存储单元少,计算量小,效率高。但是这个高效率是以相位的非线性为代价的。FIR滤波器传递函数的极点固定在原点,是不能动的,它只能靠改变零点位置来改变它的性能。所以要达到高的选择性,必须用较高的阶数;对于同样的滤波器设计指标,FIR滤波器所要求的阶数比IIR滤波器高出非常多,结果,成本较高,信号延时也较大。
详细代码
上一篇: Spring AOP 的实现原理
下一篇: Angular组件封装