PythonでMATLAB2次フィルターを再作成

Nov 20 2020

MatlabfilterDesignerツールでいくつかのカスタムフィルターを作成し、それらのフィルターを大量のオーディオファイルに適用したいと思います。Pythonを使用して、オーディオにフィルターを適用したいと思います。

Matlabでバターワースフィルターを作成し、ASCIIファイルとしてエクスポートしました。そこに2つのデータがあります。SOSマトリックススケール値。次に、Pythonでファイルを読み取り、SOSマトリックスを取得し、次のように結果を使用して信号をフィルタリングしました(を使用scipy.sosfilt)

from scipy import signal

x_sos = signal.sosfilt(sos, x)  # x is my signal

得られた結果は、振幅が異なることを除いて、目的の形状になっています(Matlabで同じフィルターを適用し、Pythonコードからの出力を比較しました)。スケール値がこの方程式に含まれる必要があることを理解しています。しかし、どうすればそれを組み込むことができますか?私はこの答えを理解していません。この質問にはスケール値を説明する回答がありますが、それでもPythonコードでそれをどのように使用すべきかわかりません


編集:(答えを得た後)最終的なコードに興味がある人には、ここにあります。そして、このスレッドで再び説明があります

from scipy import signal
import numpy as np

x_sos = signal.sosfilt(sos, x) * np.prod(scale)  # x is my signal

回答

1 Hilmar Nov 20 2020 at 21:15

スケール値はすべてである必要があります $1$ 最初のものを除いてそれがそうでない限り $1$あまりにも。出力信号にその最初のスケール値を乗算するか、SOSマトリックスの最初の3行の最初の3つの数値にその数値を乗算してからフィルタリングします。

編集

フィルタ設計者は、これを必要以上に複雑にしていることがわかりました。すべてのスケール値を乗算し、出力に積を乗算するだけです。