美好的一天,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看起來不像過濾器......
Numpy不是Matlab,也許他們做了不同的事情(因爲他們不聲稱是等同的)? –
這兩個函數的文檔都意味着它們應該做同樣的事情。它們都是直接形式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
嗯......數學與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