2

Pythons sosfilt関数をエミュレートするために、Apple の Accelerate Framework、vDSP biquad 関数https://developer.apple.com/documentation/accelerate/1450838-vdsp_biquad?language=objc#parametersを使用しています。すべてのフィルタリングを実行しましたが、除去しようとしている過渡信号があることに気付きました。Python では、これはsosfilt_zi https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.sosfilt_zi.html#scipy.signal.sosfilt_ziから初期条件を見つけ、最初の要素を掛けることで行われます。フィルタリングされているデータで。私はこの素晴らしい例Matlab filtfilt() function implementation in Javaに従いました。

sosfilt_ziを使用して Python で初期条件を出力すると、セクションごとに 2 つの値が得られるので (2 次カスケードを使用しています)、合計で 4 つの値が得られます。

ただし、 iOSのシングル チャネルバイクアッド機能では、Delayに(2*M)+2を要求しています。初期条件は遅延に関連しており、信号を調整してトランジェントを除去するには、これを変更する必要があると想定していました。

iOS の biquad 関数の Delay Parameter の関数定義は、"biquad の各セクションの直接形式 1 の「過去の」状態データで初期化された単精度値の配列です。配列の長さは (2 * M) + 2, ここで、M はセクションの数です.各セクション m について、Delay[2 m:2 m+1] はセクション m の 2 つの遅延入力値を表し、Delay[2 M:2 M+1] はセクション m の 2 つの遅延入力値を表しますフィルタの 2 つの遅延出力値。この関数の実行後、この配列にはフィルタの最終状態データが含まれます。」

2 つのセクションがある場合、遅延配列は次のようになります。

[0:1] - セクション 0 の入力遅延値

[2:3] - セクション 1 の入力遅延値

[4:5] - 出力遅延値

私は最初、Delay を 6 個のゼロの配列に設定しました。sosfilt_ziの出力がDelay の 2 つの入力セクションの適切な値である場合、フィルターの遅延出力値を見つけるにはどうすればよいでしょうか?

vDSP に精通していて、過渡信号を除去できる人、またはカスケード接続された 2 次セクションの遅延値を調整する方法を説明できる人はいますか? 遅延値を調整するのは正しい動きですか? Pythonでこれらの値を取得するにはどうすればよいですか?

私の遅延配列は次のようになると考えていました(以下の2番目のリンクに示されている値を使用):

[0.72095219 -0.28358224] - セクション 0

[-0.80004591 0.80004591] - セクション 1

ただし、これが正しい場合、その出力がどうなるかはわかりません。助けていただければ幸いです!iOS の biquad 関数に関するドキュメントや例はほとんど見つかりませんでした。ありがとうございました!

バターワース バンドパス フィルター - 初期条件が適用されています

sosfilt_zi の出力 - 初期条件を与える

上が iOS vDSP からの Biquad Filter の結果、下が初期条件での sosfilt の結果

初期化中の遅延

双二次関数

4

0 に答える 0