2012-11-08 108 views
2

我很難用'buttord'和'butter'函數來計算巴特沃思係數。我的目標是過濾掉我構建的時間序列中的噪音。時間序列具有紅色噪聲分量和頻率爲0.3Hz的正弦信號。 時間序列的採樣頻率爲10 Hz。MATLAB - 巴特沃思濾波器設計的輸入頻率

繼 'buttord' http://www.mathworks.com/help/signal/ref/buttord.html我計算[N,WN]爲規範(例如跟隨1的文檔)的文件:

Wp = 0.33/(sfreq/2); Ws = 0.37/(sfreq/2); 
passripp = 0.1; stopatten = 40; 
[n,Wn] = buttord(Wp,Ws,passripp,stopatten); 
[b,a] = butter(n,Wn); 
y_butter = filter(b,a,timeseries(:,2)); 

繪製y_butter隨着時間只是給了我零無處不在!

我試圖使用「freqz」檢驗濾波器的頻率響應(使用512個樣本):

freqz(b,a,512,sfreq) 

其曲線圖表明過渡頻帶是1個4 Hz之間的!

我的過濾器後面的理解是:在

  • 信號以0.3赫茲
  • 噪聲>> 0.3赫茲
  • 通過一切從0到0.33赫茲
  • 衰減一切從超出
  • 0.36赫茲

您的幫助將不勝感激!

數據可以在這裏下載:http://dl.dropbox.com/u/1918592/detrendedTS.mat的「TS」是時間可變的,第2欄是數據可變

我去趨勢的線性擬合(Matlab的消除趨勢')以除去一些步入式的1列遠離紅色噪音行爲。

回答

3

您發佈的代碼會生成第57個(!!!!)順序過濾器,以執行您想要執行的操作。 freqz命令的確顯示這個過濾器是有效的,但是試圖直接實現這樣一個高階過濾器而沒有首先使用tf2sos將其轉換爲二階部分將毫無疑問地導致嚴重的數字錯誤。這可能就是爲什麼你只看到零。如果將濾波器係數轉換爲二階部分,然後級聯濾波器,則實際上應該使用freqz命令獲得濾波器輸出。

您首先得到如此高的過濾順序的原因是因爲您已經非常密切地放置了起始和停止帶。對於簡單的低通巴特沃斯濾波器,使用buttord函數是完全不必要的。只需使用...

[b,a] = butter(n,cut/(sfreq/2)); 

...隨便挑n給你你想要的滾降(6,12,18分貝等)。在使用雙精度數據表示法時,只有當n變爲大約10時,纔會遇到問題,但您可能會發現相對較小的過濾器順序可以完成您想要的工作。

+0

謝謝您的回覆。 你簡單的低通就足夠了,但對於未來的工作,我仍然想讓buttord工作。'sos,g] = tf2sos(b,a)',然後級聯濾波器'Hd = dfilt.df2sos(sos,g)',然後應用濾波器ybutter = filter(Hd,timeseries)仍然給我零。 頻率響應'freqz(Hd)'採用標準化單位,我不知道如何解釋。 – janon128

+0

好的,很酷。修正你的時間系列代碼(它給了我一個錯誤),我會幫助更多:) – learnvst

+0

我正在使用的(detrended)時間系列可在這裏: http://dl.dropbox.com/u/ 1918592/detrendedTS.mat 其中第一列是時間數據,第二列是生成的數據。 – janon128