2011-04-08 207 views
25

有谁知道如何在MATLAB中使用滤波器? 我不是一个爱好者,所以我不关心滚降特性等 - 我有一个100 kHz采样的1维信号矢量x,我想对它执行高通滤波(比如,拒绝下面的任何东西10Hz)来消除基线漂移。MATLAB中的高通滤波

在帮助中描述了Butterworth,Elliptical和Chebychev过滤器,但没有简单的解释如何实现。

回答

48

有几种可以使用的过滤器,过滤器的实际选择取决于你想要达到的目标。既然你提到巴特沃斯,切比雪夫和椭圆滤波器,我假设你一般都在寻找IIR滤波器。

维基百科是一个开始阅读不同过滤器和他们所做的工作的好地方。例如,Butterworth在通带中最大平坦,并且响应在阻带中滚降。在Chebyschev中,无论是通带(类型2)还是阻带(类型1)都有平滑的响应,而另一端则有较大的不规则波纹,最后,在Elliptical滤波器中,两个波段都有波纹。以下图片is taken from wikipedia

enter image description here

因此,在这三种情况下,你必须牺牲一些别的东西。在巴特沃斯,你没有涟漪,但频率响应下降较慢。在上图中,需要从0.4到约0.55达到一半的功率。在Chebyschev,你会越来越陡峭,但你必须允许其中一个乐队出现不规则和更大的涟漪,而在Elliptical中,你几乎可以瞬间截断,但是你的两个乐队都会有涟漪。

过滤器的选择将完全取决于您的应用程序。你是否试图获得一个干净的信号,几乎没有损失?然后你需要一些能让你在通带中平滑的反应(Butterworth/Cheby2)。你是否想要消除阻带中的频率,并且你不介意通带中的响应损失很小?那么你需要在阻带(Cheby1)中平滑的东西。你是否需要非常锐利的截止角,即超出通带的任何东西都不利于你的分析?如果是这样,你应该使用椭圆滤波器。

有关IIR滤波器的事情要记住的是,它们有两极。与FIR滤波器不同,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)躺在单位圆,这使得这种方法不稳定之外。

enter image description here

,这是从这样的事实明显看出,频率响应是所有失控。使用freqz(b,a)得到以下

enter image description here

要想得到一个较为稳定的过滤器,您的具体设计要求,你需要使用z-p-k方法而不是b-a,在MATLAB使用二阶滤波器。下面是为与上述相同的过滤器:

[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. 

现在,如果你看看这个滤波器的特性,你会看到,所有的极点位于单位圆(因此稳定)内,符合设计要求

enter image description here

enter image description here

的方法是用于butterellip相似,具有等效buttordellipord。 MATLAB文档在设计滤波器时也有很好的例子。你可以建立在这些例子和我的设计根据你想要的过滤器。

要根据您最终使用的过滤器,对数据使用过滤器,您可以执行filter(b,a,data)filter(Hd,data)。如果您想要零相位失真,请使用filtfilt。但是,这不接受dfilt对象。因此,为了与Hd零相位滤波器,在使用MathWorks的文件交换网站

编辑

filtfilthd文件可这是为了响应@ DarenW的评论。平滑和滤波是两种不同的操作,尽管它们在某些方面类似(移动平均值是低通滤波器),但除非可以确定它不是关注具体应用。

例如,在从一个0-25kHz线性啁啾信号,在100kHz采样执行达人的建议,用高斯滤波器的平滑

enter image description here

当然,漂移靠近到10Hz此之后,频谱几乎为零。但是,该操作完全改变了原始信号中频率分量的性质。这种差异的产生是因为他们完全忽视了平滑操作的滚降(见红线),并假设它将是平坦的零点。如果那是真的,那么减法就会奏效。但唉,情况并非如此,这就是为什么整个设计过滤器领域都存在的原因。

+3

你让我更好的人与你的答案 – Diego 2012-05-30 01:35:24

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函数。

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,你可能希望在大平滑器之前使用短中值滤波器。

这很容易推广到二维图像,三维体积数据,无论如何。

+1

平滑和减法不是一个解决方案,因为它改变了原始信号的特点(见编辑我的答案)。这在图像处理中很常见,并且起作用是因为与低频率的主要图像特征相比,斑点噪声通常频率远远超出频率。但这不是时间序列数据的好方法。 – abcd 2011-04-09 16:07:34