高次フィルターのカスケードバイカッドセクションはどのように機能しますか?


20

私は8次のIIRフィルターを実装しようとしていますが、これまで読んだすべてのアプリケーションノートと教科書には、2次のセクションとして2を超える次数のフィルターを実装するのが最善であると書かれています。tf2sosMATLABで2次セクションの係数を取得するために使用しましたが、予想どおり、4 2次セクションの6x4係数が得られました。SOSとして実装する前は、8次フィルターには7つの以前のサンプル値を保存する必要がありました(および出力値も)。ここで、2次セクションとして実装するとき、フローが入力から出力までどのように機能するか、2つの前のサンプル値のみを保存する必要がありますか?または、最初のフィルターの出力はx_in2番目のフィルターのように送られますか?


uは言及したように2ではなく、その段階でのフィルターの順序に応じて、すべての段階で以前の状態を保存する必要があります

回答:


13

最後に言ったことです(「または、最初のフィルターの出力はx_inとして2番目のフィルターに送られますか?」)。アイデアは簡単です。カスケードにある個別の2次フィルターとしてバイクアッドを扱います。最初のフィルターからの出力は2番目のフィルターへの入力であり、以下同様に、遅延線はフィルター間で広がります。メモリが制約された環境で構造を最適化する必要がある場合、隣接するバイカッドに冗長な遅延メモリがあることに注意してください(つまり、ステージ1の最後のいくつかの出力サンプルはステージ2の最後のいくつかの入力サンプルと同じなので、フィルターを個別に実装する場合のように、個別に保存する必要はありません)。


ありがとう!私は、MATLABですばやくそれを行うことができました。以前の混乱の原因は、ゲインを増やすことを忘れていたためです(ugh!)。したがって、あらゆる種類のアイデアが忍び寄ってきました
。– anasimtiaz

tf2sosからの出力引数としてゲインを要求する必要がない場合(投稿された私のコード例のように)、再度乗算する必要はありません。
-learnvst

9

2次セクションを実装するには、実際には2つの方法があります。パラレルとシリアルです。シリアルバージョンでは、セクションNの出力はセクションN + 1への入力です。並列バージョンでは、すべてのセクションに同じ入力があり(ゼロの共役複素数ペアではなく1つの実ゼロのみ)、各セクションの出力は単純に合計されます。2つの方法は、Zドメイン伝達関数の部分分数展開によって関連付けられています。警告:これは数値的に扱いにくい問題であり、標準のMatlab実装 "residuez"は、単位円に近い極を持つ典型的なオーディオフィルターに対して非常に大きな数値誤差を生じる可能性があります。


6

以下に、2次セクションをカスケードする方が良い理由を示すためのデモコードを少し示します。

clc

sr = 44100;
order = 13;

[b,a] = butter(order,1000/(sr/2),'low');
[sos] = tf2sos(b,a);

x = [1; zeros(299,1)]; %impulse


% all in one
Y = filter(b,a,x);

% cascaded biquads
Z = x;
for nn = 1:size(sos,1);
    Z = filter(sos(nn,1:3),sos(nn,4:6), Z );
end


cla; plot(Y, 'k'); hold on; plot(Z,':r'); hold off

上記の例で与えられたローパスフィルターの場合、約12から13のオーダーで、数値誤差が蓄積して、カスケードバイクアッドを使用しない実装に対して視覚的に異なるインパルス応答が得られます。フィルターに応じて、走行距離は異なります。

注文= 10

ここに画像の説明を入力してください

注文= 13

ここに画像の説明を入力してください


@learvst私が間違っている場合は修正してください、しかしあなたのコードは利益を逃します。すべきではない:[sos gain] = tf2sos(b,a); // Rest of code for nn = 1:size(sos,1); Z = filter(sos(nn,1:3),sos(nn,4:6), Z ); end Z = filter(gain,1,Z);
user915783
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.