2014-04-09 123 views
1

我想在Matlab中應用butterworth濾波器。我已經設置了過濾器,如下所示:Matlab巴特沃斯濾波器returing NaN

[z,p,k] = butter(5,[30/2000,1000/2000]); 

即切斷低於30赫茲和高於1000赫茲(在2000 Hz的採樣)

輸入數據是在一個較大的矩陣的列,A.

我然後將過濾器如下:

M=filter(z,p,A(:,2)); 

,並曾嘗試:

M=filtfilt(z,p,A(:,2)); 

A有1577563行。過濾器將實際值返回到約1700行左右,但在此之後,條目爲NaN。我試圖從A(:,2)中提取出一些選項,它們在M中生成NaN,但是在它們自己的這些返回數字中,所以我假設它與A的長度有關,而不是特定的值。看起來這是過濾器功能的不穩定性,因爲NaN的開始在不同的測試中有所不同。

我試過減少順序,但得到與第二甚至第一階濾波器類似的結果。

如果有一種方法,我會愉快地上傳A(:,2)中的數據,但我不知道如何在StackExchange中執行此操作。

+0

我猜想,'NaN'從發生某處有一個「0/0」操作。我以前從未見過這種情況,但請問您的信號是否靜止?或者信號有多大幅度(近似)? – patrik

+0

我正在將它應用於多個不同的數據集,併爲每個數據集獲取相同的問題。平均信號強度爲0.1-1。我注意到,通過將濾波器的階數增加到n,NaN開始的點增加到~9900。 – 218

+0

好的,但信號不僅取值在0-1之間,對吧?所以說,它的平均接近0? – patrik

回答

0

我對你想要做的事情有一個完美無效的想法。但也有上的代碼,並在觀念上巨大問題:

  1. 黃油頻率必須是採樣頻率的一半。因此,你 與ZPK -Zero,杆,過濾器 - 結構,和「過濾器」命令實現爲15Hz至500Hz採樣2000Hz的時,這我確定是不是你所需要的,

  2. 你是餵養的filter命令收到BATF 多項式。這可能會導致不可預知的結果,

  3. 你不能設置一個f0f1之間時f1是 奈奎斯特,一半的採樣率,fs/2。如果是這樣,只需使用f0並將 設置爲高通濾波器!如果您仍然需要帶通,請選擇 f1=900或其他東西關閉,而不是非常 nyquist切。

這裏是一個修正版本,爲30Hz和950Hz之間的採樣濾波器,在2000Hz的採樣:

x = randn(500,1);  % Input to the filter 
    [b,a] = butter(5,[30/2000,950/2000]*2); 
    y=filter(b,a,x); 
    fvtool(b,a); 
    plot([x y]); 

問候......