2013-06-05 65 views
3

美好的一天,Matlab濾波器不兼容Python lfilter

我一直在圍繞着移植到python的matlab代碼,我碰到了這個奇怪的問題。我搜索了一下,但沒有發現任何信息表明我做錯了什麼。

問題的核心是Matlab的濾波器(B,A,數據)(它是內置到MATLAB)比較Python的scipy.signal.lfilter

時產生不同的輸出這是問題,在任意粉紅噪音信號進行

我有由第三方給我的濾波器係數和他們如下:

a0 = 1 
a1 = -1.69065929318241 
a2 = 0.73248077421585 
b0 = 1.53512485958697 
b1 = -2.69169618940638 
b2 = 1.19839281085285 

在MATLAB我初始化分子/分母如下:

a = [a0 a1 a2]; 
b = [b0 b1 b2]; 

在Python中我不喜歡這樣寫道:

a = np.array([a0, a1, a2]) 
b = np.array([b0, b1, b2]) 

兩個MATLAB/Python讀物的信號後,我打印出來的第15個樣品,以確保你們知道輸入的是相同的

Matlab的:

0.061920166015625 
    -0.050170898437500 
    -0.117370605468750 
    -0.065979003906250 
    -0.013854980468750 
    -0.042663574218750 
    0.107452392578125 
    -0.044006347656250 
    0.115112304687500 
    -0.043457031250000 
    -0.028778076171875 
    -0.128234863281250 
    0.045227050781250 
    -0.091796875000000 
    0.315063476562500 

的Python:

[[ 0.06192017] 
[-0.0501709 ] 
[-0.11737061] 
[-0.065979 ] 
[-0.01385498] 
[-0.04266357] 
[ 0.10745239] 
[-0.04400635] 
[ 0.1151123 ] 
[-0.04345703] 
[-0.02877808] 
[-0.12823486] 
[ 0.04522705] 
[-0.09179688]] 

然後調用過濾功能

Matlab的:

out = filter(b,a,data); 
out(1:15) 

ans = 

    0.095055186160338 
    -0.082982934483728 
    -0.180851002009017 
    -0.090458464750796 
    -0.004794343459254 
    -0.049115794227541 
    0.183660200687651 
    -0.061428954478571 
    0.185550654888710 
    -0.070597744360580 
    -0.044524076275862 
    -0.195036835228527 
    0.082983215098531 
    -0.133175807494538 
    0.499

的Python:

out = lfilter(b,a,data) 
print out[0:14] 

[[ 0.09505519] 
[-0.07701859] 
[-0.18017853] 
[-0.10128601] 
[-0.02126912] 
[-0.06549391] 
[ 0.16495284] 
[-0.06755524] 
[ 0.17671176] 
[-0.06671197] 
[-0.04417794] 
[-0.19685653] 
[ 0.06942917] 
[-0.14091966]] 

額外的信息:

Matlab的R2012a

2。 7.3(默認情況下,2012年4月10日,23點31分26秒)[MSC v.1500 32位(英特爾)〕 - >蟒

1.6.2 - > numpy的

我的問題是這樣的: 上午我做錯了什麼,或者我在scipy軟件包中發現了一個基本和基本功能的錯誤?

國王的問候,

ķ

編輯:在下面的意見是建議衝動地給它(我不停的coeffs) Matlab的:

1.535124676585826 
    -0.096323067867721 
    -0.088906133468550 
    -0.079755185442926 
    -0.069716811972987 
    -0.059448236072219 
    -0.049440488368964 
    -0.040042331136521 
    -0.031483732058538 
    -0.023898026476545 
    -0.017342192117849 
    -0.011814893332425 
    -0.007272136901341 
    -0.003640523618135 
    -0.000828184619352 

的Python:

[[ 1.53512468] 
[ 0.  ] 
[ 0.  ] 
[ 0.  ] 
[ 0.  ] 
[ 0.  ] 
[ 0.  ] 
[ 0.  ] 
[ 0.  ] 
[ 0.  ] 
[ 0.  ] 
[ 0.  ] 
[ 0.  ] 
[ 0.  ]] 

這裏肯定出了問題, s看起來不像過濾器......

+0

Numpy不是Matlab,也許他們做了不同的事情(因爲他們不聲稱是等同的)? –

+1

這兩個函數的文檔都意味着它們應該做同樣的事情。它們都是直接形式II轉置實現 http://www.mathworks.nl/help/matlab/ref/filter.html http://docs.scipy.org/doc/scipy/reference/generated/scipy。 signal.lfilter.html#scipy.signal.lfilter – kbroos

+0

嗯......數學與Matlab相同(http://www.mathworks.com/help/matlab/ref/filter.html#f83-1015962)和Scipy (http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.lfilter.html#scipy.signal.lfilter)。差異太大而不能捨入錯誤,或浮動vs雙倍。如果你給它一個簡單的脈衝信號(除了一個單一的1.0以外的所有零)並且讓a和b一樣簡單 - 除了單個1(注意a0必須是1)之外全部爲零?真正簡單的測試案例可能會揭示一些事情 – DarenW

回答

8

這不是一個錯誤。 Matlab的filter操作第一個尺寸的陣列,而scipy.signal.lfilter默認操作上一個尺寸。

從你的問題我看到你的data數組有第二維(也許是空的?)。當你使用lfilter時,它默認爲axis=-1,它會給你python的答案。如果你想MATLAB的相同的行爲,你需要指定第一軸或擠壓陣列(如果第二個維度的大小爲1):

out = lfilter(b, a, data, axis=0) 
out = lfilter(b, a, np.squeeze(data)) 

這兩個返回如下:

[ 0.09505519 
-0.08298293 
-0.180851 
-0.09045846 
-0.00479434 
-0.04911579 
    0.1836602 
-0.06142895 
    0.18555065 
-0.07059774 
-0.04452408 
-0.19503684 
    0.08298322 
-0.13317581 
    0.499] 
+1

這工作,謝謝! – kbroos