有谁知道如何在MATLAB中使用过滤器? 我不是一个爱好者,所以我不关心滚降特性等 - 我有一个100维采样的1维信号矢量,我想对它进行高通滤波(比如拒绝任何低于10Hz的信号) )去除基线漂移。
帮助中描述了Butterworth,Elliptical和Chebychev过滤器,但没有关于如何实现的简单解释。
答案 0 :(得分:48)
可以使用多个过滤器,过滤器的实际选择取决于您要实现的目标。既然你提到了Butterworth,Chebyschev和Elliptical滤波器,我假设你一直在寻找IIR滤波器。
维基百科是一个开始阅读不同过滤器及其作用的好地方。例如,Butterworth在通带中最大平坦,并且响应在阻带中滚降。在Chebyschev中,你可以在通带(类型2)或阻带(类型1)中获得平滑的响应,而在另一个中有较大的不规则波纹,最后,在Elliptical滤波器中,有涟漪两个乐队。以下图片is taken from wikipedia。
因此,在所有这三种情况下,你必须换取其他东西。在巴特沃思,你没有涟漪,但频率响应滚降速度较慢。在上图中,从0.4
到大约0.55
需要达到一半的功率。在Chebyschev,你会得到更陡峭的滚动,但是你必须在其中一个乐队中允许不规则和更大的涟漪,而在Elliptical中,你几乎可以瞬间切断,但你在两个乐队都有涟漪。
过滤器的选择完全取决于您的应用。你想要获得一个几乎没有损失的干净信号吗?那么你需要能够在通带(Butterworth / Cheby2)中提供平滑响应的东西。您是否试图阻止阻带中的频率,并且您不会介意通带中的响应会有轻微损失吗?然后你需要在阻带(Cheby1)中平滑的东西。您是否需要极其尖锐的切角,即超出通带的任何东西都会对您的分析产生不利影响?如果是这样,您应该使用椭圆滤镜。
关于IIR滤波器需要记住的是它们有极点。与FIR滤波器不同,您可以增加滤波器的阶数,唯一的分支是滤波器延迟,增加IIR滤波器的阶数将使滤波器不稳定。由于不稳定,我的意思是你将有一些位于单位圆外的极点。要了解为何如此,您可以阅读IIR filters上的wiki文章,尤其是关于稳定性的部分。
为了进一步说明我的观点,请考虑以下带通滤波器。
fpass=[0.05 0.2];%# passband
fstop=[0.045 0.205]; %# frequency where it rolls off to half power
Rpass=1;%# max permissible ripples in stopband (dB)
Astop=40;%# min 40dB attenuation
n=cheb2ord(fpass,fstop,Rpass,Astop);%# calculate minimum filter order to achieve these design requirements
[b,a]=cheby2(n,Astop,fstop);
现在,如果你使用zplane(b,a)
查看零极点图,你会发现有几个极点(x
)位于单位圆外,这使得这种方法不稳定。
这一事实很明显,频率响应都是乱七八糟的。使用freqz(b,a)
获取以下内容
要根据您的确切设计要求获得更稳定的滤镜,您需要在MATLAB中使用z-p-k
方法而不是b-a
使用二阶滤镜。以下是与上述相同过滤器的方法:
[z,p,k]=cheby2(n,Astop,fstop);
[s,g]=zp2sos(z,p,k);%# create second order sections
Hd=dfilt.df2sos(s,g);%# create a dfilt object.
现在,如果你看看这个过滤器的特性,你会发现所有的极点都位于单位圆内(因此是稳定的)并符合设计要求
butter
和ellip
的方法类似,具有等效的buttord
和ellipord
。 MATLAB文档也有很好的设计滤波器的例子。您可以根据这些示例进行构建,然后根据您的需要设计过滤器。
要对数据使用过滤器,您可以执行filter(b,a,data)
或filter(Hd,data)
,具体取决于您最终使用的过滤器。如果您想要零相位失真,请使用filtfilt
。但是,这不接受dfilt
个对象。因此,要使用Hd
进行零相位过滤,请使用Mathworks文件交换站点上提供的filtfilthd
文件
修改强>
这是对@DarenW评论的回应。平滑和过滤是两种不同的操作,虽然它们在某些方面是相似的(移动平均值是低通滤波器),但你不能简单地用一个替换另一个,除非你可以确定它不是关注具体应用。
例如,实现Daren关于0-25kHz的线性啁啾信号的建议,以100kHz采样,这是用高斯滤波器平滑后的频谱
当然,接近10Hz的漂移几乎为零。但是,该操作完全改变了原始信号中频率分量的性质。出现这种差异是因为它们完全忽略了平滑操作的滚降(见红线),并假设它是零平面。如果这是真的,那么减法就行了。但唉,事实并非如此,这就是为什么设计过滤器的整个领域都存在的原因。
答案 1 :(得分:7)
创建过滤器 - 例如使用[B,A] = butter(N,Wn,'high')
,其中N是过滤器的顺序 - 如果您不确定这是什么,只需将其设置为10. Wn是在0和1之间归一化的截止频率, 1对应于信号采样率的一半。如果您的采样率是fs,并且您希望截止频率为10 Hz,则需要设置Wn = (10/(fs/2))
。
然后,您可以使用Y = filter(B,A,X)
来应用过滤器,其中X是您的信号。您还可以查看filtfilt
函数。
答案 2 :(得分:0)
进行这种过滤的廉价方法,不涉及设计,零点和极点以及所有这些的脑细胞紧张,是:
* Make a copy of the signal
* Smooth it. For a 100KHz signal and wanting to eliminate about 10Hz on down, you'll need to smooth over about 10,000 points. Use a Gaussian smoother, or a box smoother maybe 1/2 that width twice, or whatever is handy. (A simple box smoother of total width 10,000 used once may produce unwanted edge effects)
* Subtract the smoothed version from the original. Baseline drift will be gone.
如果原始信号是spikey,您可能需要在较大的平滑器之前使用短中值滤波器。
这可以很容易地推广到2D图像,3D体数据等等。