6

良い一日、

私はmatlabコードをpythonに移植することをいじっていましたが、この奇妙な問題に遭遇しました。少しグーグルで調べましたが、何か間違ったことをしていることを示す情報は見つかりませんでした。

問題の核心は、Python の scipy.signal.lfilter と比較すると、Matlab の filter(b, a, data) (matlab に組み込まれている) が異なる出力を生成していることです。

これは、任意のピンク ノイズ信号に対して実行される問題です。

サードパーティから提供されたフィルター係数を持っていますが、それらは次のとおりです。

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 個のサンプルを出力して、入力が同じであることを確認します。

マトラブ:

   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

パイソン:

[[ 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]]

次に、フィルター関数を呼び出します

マトラブ:

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.499012320158226

パイソン:

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 ビット (Intel)] -> python

1.6.2 -> でこぼこ

私の質問はこれです:私は何か間違ったことをしていますか、それともscipyパッケージの本質的で基本的な機能にバグを見つけただけですか?

キング様、

K

編集:以下のコメントでは、衝動でそれを養うことが提案されていました(私は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

パイソン:

[[ 1.53512468]
 [ 0.        ]
 [ 0.        ]
 [ 0.        ]
 [ 0.        ]
 [ 0.        ]
 [ 0.        ]
 [ 0.        ]
 [ 0.        ]
 [ 0.        ]
 [ 0.        ]
 [ 0.        ]
 [ 0.        ]
 [ 0.        ]]

ここには間違いなく何か問題があります。これはフィルターのようには見えません...

4

1 に答える 1

10

これはバグではありません。Matlabは配列filter最初のscipy.signal.lfilter次元で動作しますが、デフォルトでは最後の次元で動作します。

あなたの質問から、data配列には 2 番目の次元があることがわかります (おそらく空ですか?)。使用するlfilterと、デフォルトで にaxis=-1なり、python で得た答えが得られます。matlab と同じ動作が必要な場合は、最初の軸を指定するか、配列をスクイーズする必要があります (2 番目の次元のサイズが 1 の場合)。

out = lfilter(b, a, data, axis=0)
out = lfilter(b, a, np.squeeze(data))

これらはどちらも次を返します。

[ 0.09505519
 -0.08298293
 -0.180851
 -0.09045846
 -0.00479434
 -0.04911579
  0.1836602
 -0.06142895
  0.18555065
 -0.07059774
 -0.04452408
 -0.19503684
  0.08298322
 -0.13317581
  0.49901232]
于 2013-06-05T13:52:56.340 に答える