matlab实现低通、高通、带通、带阻滤波

MATLAB滤波常用函数

模拟滤波器阶数选择函数

buttord

功能:计算butterworth模拟滤波器的阶数
调用格式:

[n,Wn]=buttord(Wp,Ws,Rp,Rs,'s');
% 参数中的n是求出模拟滤波器最小的阶数,Wn是等效低通滤波器的截止频率;Wp和Ws分别是通带和阻带的频率(截止频率)。当Wp>Ws时,为高通滤波器,当Wp和Ws为二元矢量时,为带通或带阻滤波器,这时求出的Wn也是二元矢量。
%此处buttord可替换为 cheb1ord,cheb2ord,ellipord函数,相应为切比雪夫I型,切比雪夫II型,椭圆滤波器。

butter

功能:butterworth模拟滤波器的设计
调用格式:

[b,a]=butter(n,Wn,'s');
[b,a]=butter(n,Wn,'ftype','s')
%此处buttord可替换为 cheb1ord,cheb2ord,ellipord函数,相应为切比雪夫I型,切比雪夫II型,椭圆滤波器。

%当Wn=[W1 W2](W1

带通滤波

例1

对信号data实现20-350Hz的带通滤波,信号data的采样频率为Fs,代码如下:

fp1=[50,300];fs1=[20, 350];
Fs2=Fs/2;
Wp=fp1/Fs2; Ws=fs1/Fs2;
Rp=1; Rs=30;
[n,Wn]=cheb2ord(Wp,Ws,Rp,Rs);
[b1,a1]=cheby2(n,Rs,Wn);
y=filter(b1,a1,data);%经过filter滤波之后得到的数据y则是经过带通滤波后的信号数据

这里需要解释一个问题,为何需要将通带和阻带除以采样频率的一半Fs2呢?
我们都知道一句话,叫做时域采样,频域延拓。频域的延拓主要是以周期为 2 π 2\pi 2π进行延拓。也即意味着,经过离散时间傅里叶变换DTFT后,在频域是以 2 π 2\pi 2π为周期的。具体参考这篇文章时域采样与频域延拓。因此,我们的滤波器实际是这样的
matlab实现低通、高通、带通、带阻滤波_第1张图片
a,b,c,d分别表示低通滤波、高通滤波、带通滤波、带阻滤波。因此,我们所定义的通带和阻带频率需要进行归一化到 π \pi π。我们知道,采样周期 F s Fs Fs对应的频率周期为 2 π 2\pi 2π,因此要归一化到 π \pi π,则需要除以采样频率的一半。

带阻滤波

例2

对信号data实现50Hz带阻滤波

fp1=[10,250];fs1=[49, 51];
Fs2=Fs/2;
Wp=fp1/Fs2; Ws=fs1/Fs2;
Rp=1; Rs=30;
[n,Wn]=cheb2ord(Wp,Ws,Rp,Rs);
[b2,a2]=cheby2(n,Rs,'stop');
y=filter(b2,a2,data);%经过filter滤波之后得到的数据y则是经过带通滤波后的信号数据

低通

例3

对信号data实现20Hz的低通滤波

fp1=10;fs=30;
Fs2=Fs/2;
Wp=fp1/Fs2; Ws=fs1/Fs2;
Rp=1; Rs=30;
[n,Wn]=buttord(Wp,Ws,Rp,Rs);
[b2,a2]=butter(n,Wn,'s'');
y=filter(b2,a2,data);%经过filter滤波之后得到的数据y则是经过带通滤波后的信号数据

高通

例4

对信号data实现100Hz的高通滤波

fp1=90;fs1=110;
Fs2=Fs/2;
Wp=fp1/Fs2; Ws=fs1/Fs2;
Rp=1; Rs=30;
[n,Wn]=buttord(Wp,Ws,Rp,Rs);
[b2,a2]=butter(n,Wn,'high','s');
y=filter(b2,a2,data);%经过filter滤波之后得到的数据y则是经过带通滤波后的信号数据

参考资料

1、《学以致用 深入浅出数字信号处理》 江志宏

你可能感兴趣的:(信号处理,MATLAB,信号处理)