2013-10-21 219 views
1

我正在嘗試在0.1 Hz至50 Hz範圍內創建一個帶通濾波器。我使用從MATLAB的filterbuilder工具,因此它輸出的代碼如下所示:極低頻濾波器MATLAB

function y = filter050(x) 

persistent Hd; 

if isempty(Hd) 

    Fstop1 = 0.1; % First Stopband Frequency 
    Fpass1 = 0.15; % First Passband Frequency 
    Fpass2 = 45; % Second Passband Frequency 
    Fstop2 = 50; % Second Stopband Frequency 
    Astop1 = 60; % First Stopband Attenuation (dB) 
    Apass = 1; % Passband Ripple (dB) 
    Astop2 = 60; % Second Stopband Attenuation (dB) 
    Fs  = 500; % Sampling Frequency 

    h = fdesign.bandpass('fst1,fp1,fp2,fst2,ast1,ap,ast2', Fstop1, Fpass1, ... 
     Fpass2, Fstop2, Astop1, Apass, Astop2, Fs); 

    Hd = design(h, 'equiripple', ... 
     'MinOrder', 'any'); 


    set(Hd,'PersistentMemory',true); 

end 

y = filter(Hd,x); 

的問題是,這始終運行。我知道我的濾波器需要大量的點,因爲它的頻率很低,採樣率爲500赫茲,但我真的不想降低我的信號的採樣率......有沒有辦法解決它?

另外,我想下采樣,以檢查它是否會跑得更快,下采樣到100赫茲和仍然運行,直到永遠。

+0

「問題是,這會永遠運行。」但是在「永遠」之後的某個時間你會得到一個輸出嗎?還是真的永遠永遠「永遠」? – thewaywewalk

+0

也許你問得太多了,過濾器的尺寸變得非常長,或者會遇到數值問題。 –

+0

@thewaywewalk那麼,它跑了大約1天直,然後我就放棄了,因爲這不是我的問題很好的解決... 編輯:間苗版本在一兩分鐘的運行,我會說10左右,這是不是太糟糕了,但我真的想用整個數據... –

回答

1

聲明:我不是數字濾波器的專家,只是一個偶然的用戶。我也沒有任何經驗fdesign

我的猜測是,fdesign要麼試圖設計一個非常高階的過濾器,這將永遠需要優化,或者它正在運行到數值問題。設計濾波器必須有一些經驗法則(我不知道它們),但可能限制截止頻率和採樣頻率之間或者轉換範圍和採樣率之間的比率有多大。在你的情況下,Fstop1/Fs = 5000甚至(Fpass1 - Fstop1)/Fs = 10000,這可能太多了。有些事情你可以做:

  • 儘量放鬆您的過濾器要求儘可能:你真的需要這麼高的衰減?你能放大你從傳遞到阻帶的頻率範圍嗎? 0.5 Hz的簡單高通濾波器就足夠了嗎?你能容忍更多的波紋?等等,...

  • 下采樣數據。你抑制45赫茲以上的所有頻率,所以顯然你不關心它們。這意味着您可以安全地下采樣到大約100 Hz,這可能會使任何數字問題成爲不重要的因素。下采樣有什麼問題?這很容易與decimate左右:x_dec = decimate(x, 5)

  • 嘗試解決一個稍微不同的方式你的問題。如果您閱讀decimate手冊,您會發現它實際上會在Fc = 0.8*Fsample/ (2 * downsample_ratio)處以截止頻率進行一些低通濾波。這是避免混疊問題所必需的。 (請注意下采樣(它只是從n中選取1個採樣,然後進行抽取,它首先進行適當的抗混疊濾波)之間的區別)。因此,如果要用因子4減數,則會得到低通部分你的濾波器的Fc = 0.8 * 500 /(2 * 4)= 50赫茲免費!那麼剩下要做的就是做一些Fc = 0.2Hz左右的高通濾波。

0

我也曾遇到過這個問題。我有一些在5k Hz採樣的電生理學數據,我試圖用MATLAB的fdesign對其進行低通濾波。它運行得非常緩慢,我不得不下載數據以提高速度。

後來我找到了一個很好的解決方案。我從EEGLAB中提取數字濾波器的代碼(一個MATLAB工具箱來處理腦電信號)。它是一個窗口正弦濾波器,運行速度非常快(我可以在1分鐘內過濾以1000Hz採樣的10分鐘長的EEG數據),並且窗口 - 正弦濾波器非常適合將一個頻段與另一個頻段分開(非常快滾下)。現在我可以過濾我的電生理數據,而無需使用Downsam