Python Scipy lfilter中的十进制精度?

时间:2015-10-23 07:54:39

标签: python filter scipy precision

有没有人对python(lfilter)中的小数精度有所了解。 根据他们对Matlab filter()和SciPy lfilter()的文档,看起来它们应该是等价的。 我在matlab和python中进行了一些计算...不幸的是,我得到的结果是不同的,我不知道为什么?

作为输入,我使用相同的系数集:

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 个答案:

答案 0 :(得分: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。

默认情况下,numpy打印的是什么:

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打印的内容:

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

当我将其设置为使用sprintf('%0.8e, ',filtered)时使用8位小数的精度时,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, 

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

此外,您不需要scipy过滤器的axis参数,至少在使用向量(1D数组)时。