你得到系数a,b后,你信号也知道吧,假设是x,然后你就用y=filter(b,a,x);
我当时学时也很困惑怎么用,后来我做的尝试,我给你一个例子看看吧,是我学习时自己写的
设计一个高通滤波器,并检验它的性能
采样率为10kHZ
阻带边缘为1.5Khz,衰减为40bB
通带边缘为2kHz,波纹为3Db
>>Fs=1e4;
>>fs=1.5e3;
>>fp=2e3;
>>As=40;
>>Rp=3;
>>wp=2*fp/Fs;
>>ws=2*fs/Fs;
>>[N,wn]=cheb2ord(wp,ws,Rp,As);
>>[b,a]=cheby2(N,As,wn,'high');
>>[db,mag,pha,grd,w]=freqz_m(b,a);
>> subplot(2,2,1);plot(w/pi,mag);
>> axis([0,1,0,1]);
>> setX([0 0.3 0.4 1]);
>>setY([0.01 0.7279 1])
>> title('Magnitude Response');
>> subplot(2,2,2);plot(w/pi,db);
>> axis([0 1 -70 0])
>> setX([0 0.3 0.4 1])
>> setY([-40 -2.7589])
>> title('Magnitude Response in dB');
然后给你一个信号x=cos(0.2*pi*n);
>>n=0:200;
>>x=cos(0.6*pi*n);
>>y=filter(b,a,x);
>>subplot(2,2,3);plot(n,x);
>>subplot(2,2,4);plot(n,y);
>>x1=fft(x,201);
>>x11=abs(x1);
>>subplot(2,2,1);stem(n,x11);
>>y1=fft(y,201);
>>y11=abs(y1);
>>subplot(2,2,2);stem(n,y11);
>>setX([0 60 140 201])
>>title('FFT of y');
>>subplot(2,2,1);stem(n,x11);
>>setX([0 60 140 201])
>>title('FFT of x');
>>g=x11-y11;
>>subplot(2,2,3);stem(n,g);
你运行一下,就可以看到结果,刚好把此信号滤掉
给你一个设计思路,你改变截止频率和阻带衰减就可以了
>> %假设截止频率为W,我随便定义一下
>> %比如wp=0.3*pi;ws=0.4*pi
>> wp=0.3*pi;ws=0.4*pi;
>> %阻带衰减为50分贝
>> %通带波纹为0.2分贝
>> As=50;Rp=0.2;
>> %那么可以用两个函数得到系数a,b
>> [N,wn]=buttord(wp/pi,ws/pi,Rp,As);
>> [b,a]=butter(N,wn);
>> %该滤波器就是从截止频率到无穷远都不响应
希采纳
其实滤波本身很简单:
x=filter(b, a ,yy);
yy是你要滤的信号,注意它是个矢量,即数组。b和a是上面式子里的B,A。
滤波器的关键是在设计,即如何求B,A。你上面的那几句是远远不够的。详细的我一下说不清楚。建议你在网上找几个具体的例子体会一下就能掌握。
simulink里的滤波器是简单和直观,但是没有办法把它转换到脚本或函数里,而很多时候我们依然是要写程序的。
虽然matlab提供了很多产生低通滤波器的函数,而且也提供了将低通转换为高通、带通等滤波器的方法函数,以及数字化的函数。但是为了简化设计及设计者方便考虑,matlab还提供了更为简便的产生各种滤波器的方法。
1 besself
功能:贝塞尔(Bessel)模拟滤波器设计。
格式:[b,a] = besself(n,Wn)
[b,a] = besself(n,Wn,'ftype')
[z,p,k] = besself(...)
[A,B,C,D] = besself(...)
说明:besself函数可以设计模拟低通、高通、带通和带阻贝塞尔(Bessel)滤波器。
[b,a] = besself(n,Wn)返回截止频率为Wn(单位为弧度/秒)的n阶贝塞尔模拟
低通滤波器,b、a分别为滤波器传递函数的分子和分母系数向量(降幂排列)。
当Wn为二元向量,即Wn=[W1 W2] (W1
[b,a] = besself(n,Wn,'ftype')用于设计高通和带阻滤波器,即
·ftype=high时,返回截止频率为Wn的高通滤波器;
·ftype=stop时,Wn=[W1 W2] (W1
[z,p,k] = besself(...)得到滤波器的零-极点增益模型,z、p、k分别为零点向量、
极点向量和增益系数。
[A,B,C,D] = besself(...)得到滤波器的状态空间模型。
2 butter
功能:巴特沃思(Butterworth)模拟/数字滤波器设计。
格式:[b,a] = butter(n,Wn)
[b,a] = butter(n,Wn,'ftype')
[b,a] = butter(n,Wn,'s')
[b,a] = butter(n,Wn,'ftype','s')
[z,p,k] = butter(...)
[A,B,C,D] = butter(...)
说明:butter函数可以设计模拟或数字的低通、高通、带通和带阻Butterworth滤波
器。Butterworth滤波器可以使通带内的幅频响应最大程度地平坦,但这也使
得它的通带到阻带的过渡过程较慢。在这方面Chebyshev滤波器和椭圆滤波
器性能较好。
在设计数字滤波器时,butter函数中的参数Wn与besself函数有很大的区别,
它是一个相对量,其定义区间为Wn∈[0,1],其中1对应于0.5fs,fs为采样
频率(单位Hz);在设计模拟滤波器时,Wn采用真实频率,单位为Hz。
[b,a] = butter(n,Wn)返回截止频率为Wn(单位为弧度/秒)的n阶Butterworth
数字低通滤波器,b、a分别为滤波器传递函数的分子和分母系数向量(降幂
排列)。
当Wn为二元向量,即Wn = [W1 W2] (W1
[b,a] = butter(n,Wn,'ftype')用于设计数字高通和数字带阻滤波器,即
·ftype = high时,返回截止频率为Wn的数字高通滤波器;
·ftype =stop时, Wn = [W1 W2] (W1
[b,a] = butter(n,Wn,'s')和[b,a] = butter(n,Wn,'ftype','s')中加入了选项‘s’,用于
设计各种模拟Butterworth滤波器。
[z,p,k] = butter(...)得到滤波器的零-极点增益模型,z、p、k分别为零点向量、
极点向量和增益系数。
[A,B,C,D] = butter(...)得到滤波器的状态空间模型
3 cheby1
功能:切比雪夫(Chebyshev)I型模拟/数字滤波器设计。
格式:[b,a] = cheby1(n,Rp,Wn)
[b,a] = cheby1(n,Rp,Wn,'ftype')
[b,a] = cheby1(n,Rp,Wn,'s')
[b,a] = cheby1(n,Rp,Wn,'ftype','s')
[z,p,k] = cheby1(...)
[A,B,C,D] = cheby1(...)
说明:cheby1函数可以设计模拟或数字的低通、高通、带通和带阻ChebyshevI型滤
波器。ChebyshevI型滤波器通带内为等波纹,阻带内单调,通带到阻带的过
渡过程较快,代价是通带内波纹较大。
在设计数字滤波器时,cheby1函数中的参数Wn是一个相对量,其定义区间
为Wn∈[0,1],其中1对应于0.5fs,fs为采样频率(单位Hz);在设计模拟
滤波器时,Wn采用真实频率,单位为Hz。
[b,a] = cheby1(n,Rp,Wn)返回截止频率为Wn(单位为弧度/秒)的n阶
ChebyshevI型数字低通滤波器,通带内波纹为Rp。b、a分别为滤波器传递函
数的分子和分母系数向量(降幂排列)。当Wn为二元向量,即Wn=[W1 W2]
(W1
[b,a] = cheby1(n,Rp,Wn,'ftype')用于设计数字高通和数字带阻滤波器,即
·ftype = high时,返回截止频率为Wn的数字高通滤波器;
·ftype = stop时, Wn = [W1 W2] (W1
[b,a] = cheby1(n,Rp,Wn,'s')和[b,a] = cheby1(n,Rp,Wn,'ftype','s')中加入了选项
‘s’,用于设计各种模拟ChebyshevI型滤波器。
[z,p,k] = cheby1(...)得到滤波器的零-极点增益模型,z、p、k分别为零点向量、
极点向量和增益系数。
[A,B,C,D] = cheby1(...)得到滤波器的状态空间模型。
4 cheby2
功能:切比雪夫(Chebyshev)II型模拟/数字滤波器设计。
格式:[b,a] = cheby2(n,Rs,Wn)
[b,a] = cheby2(n,Rs,Wn,'ftype')
[b,a] = cheby2(n,Rs,Wn,'s')
[b,a] = cheby2(n,Rs,Wn,'ftype','s')
[z,p,k] = cheby2(...)
[A,B,C,D] = cheby2(...)
说明:cheby2函数可以设计模拟或数字的低通、高通、带通和带阻ChebyshevII型
滤波器。与ChebyshevI型滤波器不同,ChebyshevII型滤波器通带内为单调,
阻带内等波纹。它的通带到阻带的过渡过程比较快,代价是通带内波纹较大。
在设计数字滤波器时,cheby2函数中的参数Wn是一个相对量,其定义区间为
Wn∈[0,1],其中1对应于0.5fs,fs为采样频率(单位Hz);在设计模拟滤波器
时,Wn采用真实频率,单位为Hz。
[b,a] = cheby2(n,Rs,Wn)返回截止频率为Wn(单位为弧度/秒)的n阶
ChebyshevII型数字低通滤波器,阻带内波纹为Rs。b、a分别为滤波器传递
函数的分子和分母系数向量(降幂排列)。当Wn为二元向量,即Wn=[W1 W2]
(W1
[b,a] = cheby2(n,Rs,Wn,'ftype')用于设计数字高通和数字带阻滤波器,即
·ftype = high时,返回截止频率为Wn的数字高通滤波器;
·ftype = stop时, Wn = [W1 W2] (W1
[b,a] = cheby2(n,Rs,Wn,'s')和[b,a] = cheby2(n,Rs,Wn,'ftype','s')中加入选项‘s’,
用于设计各种模拟ChebyshevII型滤波器。
[z,p,k] = cheby2(...)得到滤波器的零-极点增益模型,z、p、k分别为零点向量、
极点向量和增益系数。
[A,B,C,D] = cheby2(...)得到滤波器的状态空间模型。
5 ellip
功能:椭圆模拟/数字滤波器设计。
格式:[b,a] = ellip(n,Rp,Rs,Wn)
[b,a] = ellip(n,Rp,Rs,Wn,'ftype')
[b,a] = ellip(n,Rp,Rs,Wn,'s')
[b,a] = ellip(n,Rp,Rs,Wn,'ftype','s')
[z,p,k] = ellip(...)
[A,B,C,D] = ellip(...)
说明:ellip函数可以设计模拟或数字的低通、高通、带通和带阻椭圆滤波器。椭圆
滤波器的通带和阻带内均为等波纹,通带到阻带的过渡过程很快。在给定的
性能指标下,椭圆滤波器能以最低的阶实现。
在设计数字滤波器时,ellip函数中的参数Wn是一个相对量,其定义区间为
Wn∈[0,1],其中1对应于0.5fs,fs为采样频率(单位Hz);在设计模拟滤波
器时,Wn采用真实频率,单位为Hz。
[b,a] = ellip(n,Rp,Rs,Wn)返回截止频率为Wn的n阶椭圆数字低通滤波器,Rp、
Rs分别为通带和阻带内的波纹,b、a分别为滤波器传递函数的分子和分母系
数向量(降幂排列)。当Wn为二元向量,即Wn = [W1 W2] (W1
W2。
[b,a] = ellip(n,Rp,Rs,Wn,'ftype')用于设计数字高通和数字带阻滤波器,即
·ftype = high时,返回截止频率为Wn的数字高通滤波器;
·ftype = stop时, , Wn = [W1 W2] (W1
[b,a] = ellip(n,Rp,Rs,Wn,'s')和[b,a] = butter(n,Rp,Rs,Wn,'ftype','s')中加入了选项
‘s’,用于设计各种模拟椭圆滤波器。
[z,p,k] = ellip(...)得到滤波器的零-极点增益模型,z、p、k分别为零点向量、
极点向量和增益系数。
[A,B,C,D] = ellip(...)得到滤波器的状态空间模型。
6 yulewalk
功能:递归数字滤波器设计。
格式:[b,a] = yulewalk(n,f,m)
说明:yulewalk函数采用对指定的频率响应进行最小二乘拟合的方法设计递归的IIR
数字滤波器。
[b,a] = yulewalk(n,f,m)返回n阶IIR滤波器的传递函数,b、a分别为分子和分
母多项式系数向量,按降幂排列。
向量f、m指定了所希望的幅频响应形状。其中,f为频率点向量,采用相对
频率,即f∈[0,1],f = 1时对应0.5fs,fs为采样频率。m为对应的幅频响应
值向量,f、m的长度必须相同。用plot(f,m)可以画出滤波器的幅频响应曲线。
在指定幅频响应特性时,在通带和阻带之间要存在一定的过渡过程。
在主界面敲入fdatool,在出来的界面上输入你的设置值,这样做比编程方便.
你得到系数a,b后,你信号也知道吧,假设是x,然后你就用y=filter(b,a,x);
我当时学时也很困惑怎么用,后来我做的尝试,我给你一个例子看看吧,是我学习时自己写的
设计一个高通滤波器,并检验它的性能
采样率为10kHZ
阻带边缘为1.5Khz,衰减为40bB
通带边缘为2kHz,波纹为3Db
>>Fs=1e4;
>>fs=1.5e3;
>>fp=2e3;
>>As=40;
>>Rp=3;
>>wp=2*fp/Fs;
>>ws=2*fs/Fs;
>>[N,wn]=cheb2ord(wp,ws,Rp,As);
>>[b,a]=cheby2(N,As,wn,'high');
>>[db,mag,pha,grd,w]=freqz_m(b,a);
>> subplot(2,2,1);plot(w/pi,mag);
>> axis([0,1,0,1]);
>> setX([0 0.3 0.4 1]);
>>setY([0.01 0.7279 1])
>> title('Magnitude Response');
>> subplot(2,2,2);plot(w/pi,db);
>> axis([0 1 -70 0])
>> setX([0 0.3 0.4 1])
>> setY([-40 -2.7589])
>> title('Magnitude Response in dB');
然后给你一个信号x=cos(0.2*pi*n);
>>n=0:200;
>>x=cos(0.6*pi*n);
>>y=filter(b,a,x);
>>subplot(2,2,3);plot(n,x);
>>subplot(2,2,4);plot(n,y);
>>x1=fft(x,201);
>>x11=abs(x1);
>>subplot(2,2,1);stem(n,x11);
>>y1=fft(y,201);
>>y11=abs(y1);
>>subplot(2,2,2);stem(n,y11);
>>setX([0 60 140 201])
>>title('FFT of y');
>>subplot(2,2,1);stem(n,x11);
>>setX([0 60 140 201])
>>title('FFT of x');
>>g=x11-y11;
>>subplot(2,2,3);stem(n,g);
你运行一下,就可以看到结果,刚好把此信号滤掉
给你一个设计思路,你改变截止频率和阻带衰减就可以了
>> %假设截止频率为W,我随便定义一下
>> %比如wp=0.3*pi;ws=0.4*pi
>> wp=0.3*pi;ws=0.4*pi;
>> %阻带衰减为50分贝
>> %通带波纹为0.2分贝
>> As=50;Rp=0.2;
>> %那么可以用两个函数得到系数a,b
>> [N,wn]=buttord(wp/pi,ws/pi,Rp,As);
>> [b,a]=butter(N,wn);
>> %该滤波器就是从截止频率到无穷远都不响应