Python Scipy lfilter 中的小数精度?

Decimal precision in Python Scipy lfilter?

有人知道 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

至少在我的系统上(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

当我将 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

此外,您不需要 scipy 过滤器的 axis 参数,至少如果您使用矢量(一维数组)。