2015-10-23 74 views
0

有沒有人有關於python(lfilter)中的小數精度的想法。 根據他們對Matlab filter()和SciPy lfilter()的文檔,似乎他們應該是等價的。 我在matlab和python中做了一些計算...不幸的是,我得到的結果是不同的,我不知道爲什麼?Python中的十進制精度Scipy lfilter?

作爲輸入我使用係數的相同集:

b1 = np.array([0.987968850910341, -1.975937701820681, 0.987968850910341]) 
a1 = np.array([1.000000000000000, -1.975859694926928, 0.976015708714434]) 

和以下的Python爲過濾器的代碼:

filtered = lfilter(b1, a1, signal_in, axis=0) 

和在MATLAB:

filtered = filter(b1, a1, signal_in) 

但結果是不同的...和那些來自matlab的是正確的。 但是應該在小數點後的第四位達成一致。

我會很感激任何暗示這裏有什麼問題。

問候

這裏是我的一塊輸入數據:

108699371.346 
108699354.081 
108699336.818 
108699319.553 
108699302.288 
108699285.023 
108699267.757 
108699250.494 
108699233.231 
108699215.969 
108699198.707 
108699181.443 
108699164.18 
108699146.917 
108699129.654 
108699112.393 
108699095.133 
108699077.872 
108699060.611 
108699043.351 
108699026.091 
108699008.832 
108698991.572 
108698974.312 
108698957.053 
108698939.794 
108698922.536 
108698905.274 
108698888.014 
108698870.754 
108698853.494 
108698836.234 
108698818.976 
108698801.719 
108698784.462 
108698767.205 
108698749.95 
108698732.693 
108698715.436 
108698698.179 

回答

1

至少在我的系統(SciPy的0.16.0,Python的3.4.3,MATLAB r2014b,所有64位),結果是相同。但是,MATLAB和numpy以不同的方式顯示它們。 numpy默認將結果顯示爲8位小數,而MATLAB默認顯示的結果只有4位小數。但是,在內部,都有更多的精度位置(都使用雙精度浮點數,精度爲15-17小數位)。

如果我使用sprintf將MATLAB結果顯示爲8位小數,結果與scipy結果(使用逐字符比較)相同。所以並不是說scipy在做任何錯誤的事情,甚至是任何不同的數值上,numpy對於如何顯示浮點數的默認值都不同於MATLAB。

array([ 1.07391593e+08, 1.04799110e+08, 1.02252456e+08, 
     9.97509288e+07, 9.72938364e+07, 9.48804965e+07, 
     9.25102361e+07, 9.01823919e+07, 8.78963097e+07, 
     8.56513445e+07, 8.34468604e+07, 8.12822305e+07, 
     7.91568365e+07, 7.70700690e+07, 7.50213272e+07, 
     7.30100186e+07, 7.10355593e+07, 6.90973734e+07, 
     6.71948935e+07, 6.53275598e+07, 6.34948208e+07, 
     6.16961327e+07, 5.99309594e+07, 5.81987724e+07, 
     5.64990510e+07, 5.48312815e+07, 5.31949579e+07, 
     5.15895811e+07, 5.00146595e+07, 4.84697083e+07, 
     4.69542498e+07, 4.54678129e+07, 4.40099335e+07, 
     4.25801542e+07, 4.11780240e+07, 3.98030987e+07, 
     3.84549400e+07, 3.71331165e+07, 3.58372028e+07, 
     3.45667795e+07]) 

什麼MATLAB打印默認:

那麼默認numpy的打印

filtered = 

    1.0e+08 * 

    Columns 1 through 14 

     1.0739 1.0480 1.0225 0.9975 0.9729 0.9488 0.9251 0.9018 0.8790 0.8565 0.8345 0.8128 0.7916 0.7707 

    Columns 15 through 28 

     0.7502 0.7301 0.7104 0.6910 0.6719 0.6533 0.6349 0.6170 0.5993 0.5820 0.5650 0.5483 0.5319 0.5159 

    Columns 29 through 40 

     0.5001 0.4847 0.4695 0.4547 0.4401 0.4258 0.4118 0.3980 0.3845 0.3713 0.3584 0.3457 

什麼MATLAB打印,當我將它設置爲使用的精密8位小數sprintf('%0.8e, ',filtered)

1.07391593e+08, 1.04799110e+08, 1.02252456e+08, 9.97509288e+07, 9.72938364e+07, 9.48804965e+07, 9.25102361e+07, 9.01823919e+07, 8.78963097e+07, 8.56513445e+07, 8.34468604e+07, 8.12822305e+07, 7.91568365e+07, 7.70700690e+07, 7.50213272e+07, 7.30100186e+07, 7.10355593e+07, 6.90973734e+07, 6.71948935e+07, 6.53275598e+07, 6.34948208e+07, 6.16961327e+07, 5.99309594e+07, 5.81987724e+07, 5.64990510e+07, 5.48312815e+07, 5.31949579e+07, 5.15895811e+07, 5.00146595e+07, 4.84697083e+07, 4.69542498e+07, 4.54678129e+07, 4.40099335e+07, 4.25801542e+07, 4.11780240e+07, 3.98030987e+07, 3.84549400e+07, 3.71331165e+07, 3.58372028e+07, 3.45667795e+07, 

scipy和MATLAB的結果設置爲相同的格式:

scipy: 1.07391593e+08 1.04799110e+08 1.02252456e+08 9.97509288e+07 9.72938364e+07 9.48804965e+07 9.25102361e+07 9.01823919e+07 8.78963097e+07 8.56513445e+07 8.34468604e+07 8.12822305e+07 7.91568365e+07 7.70700690e+07 7.50213272e+07 7.30100186e+07 7.10355593e+07 6.90973734e+07 6.71948935e+07 6.53275598e+07 6.34948208e+07 6.16961327e+07 5.99309594e+07 5.81987724e+07 5.64990510e+07 5.48312815e+07 5.31949579e+07 5.15895811e+07 5.00146595e+07 4.84697083e+07 4.69542498e+07 4.54678129e+07 4.40099335e+07 4.25801542e+07 4.11780240e+07 3.98030987e+07 3.84549400e+07 3.71331165e+07 3.58372028e+07 3.45667795e+07 
MATLAB: 1.07391593e+08 1.04799110e+08 1.02252456e+08 9.97509288e+07 9.72938364e+07 9.48804965e+07 9.25102361e+07 9.01823919e+07 8.78963097e+07 8.56513445e+07 8.34468604e+07 8.12822305e+07 7.91568365e+07 7.70700690e+07 7.50213272e+07 7.30100186e+07 7.10355593e+07 6.90973734e+07 6.71948935e+07 6.53275598e+07 6.34948208e+07 6.16961327e+07 5.99309594e+07 5.81987724e+07 5.64990510e+07 5.48312815e+07 5.31949579e+07 5.15895811e+07 5.00146595e+07 4.84697083e+07 4.69542498e+07 4.54678129e+07 4.40099335e+07 4.25801542e+07 4.11780240e+07 3.98030987e+07 3.84549400e+07 3.71331165e+07 3.58372028e+07 3.45667795e+07 

另外,你不需要axis參數爲SciPy的過濾器,至少如果使用向量(1D陣列)。

+0

感謝您確認應該在結果之間達成一致,我找到了我的錯誤。不必要的是我做了一箇中間步驟,它可以削減十進制數。但現在它完美地工作。 – kinga