2011-04-08 143 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