2015-10-23 77 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