乗算または畳み込みとしてフィルタリングを実装する方が数値的に安定ですか?


12

5次バターワースフィルターを使用して20,000サンプルの信号をオフラインでフィルター処理するプログラムを作成しています。FFT実装にアクセスできます。フィルタリングを実装するための2つの選択肢があるようです。

  • 時間領域でインパルス応答で信号を畳み込む、または
  • 周波数領域で信号にインパルス応答を乗算し、結果を逆変換する

これらの方法は、理論的なFTの場合と同じです。しかし、DFTを使用して実際にそれを行うと、状況は異なると思います。方法の1つは数値的に安定していますか?他に知っておくべき問題はありますか?計算の数は重要ではありません。


FFT方式は、ほとんどの信号長で計算がはるかに高速になります。時間領域の畳み込みでは、長さが短いだけが高速です。
エンドリス

回答:


5

畳み込みでは、再帰的なフィルタリングがないため、安定性の問題に遭遇することはありません。したがって、エラーを蓄積することはありません。つまり、システムはすべてゼロであり、極はありません。FFTに基づく畳み込みは、O(n ^ 2)ではなくO(n log n)の算術演算があるため、FFTベースの畳み込みの方が誤差が少ないことを、私は逸話的に聞きましたが、確認していません。

通常、私が知る限り、バターワースフィルターは再帰(IIR)フィルターとして実装されているため、別のトピックです。IIRフィルターにはゼロと同様に極があるため、実際には安定性の問題が発生する可能性があります。また、IIRフィルターの場合、FFTベースの方法はオプションではありませんが、IIRフィルターは非常に低次になる傾向があります。

IIRフィルターの安定性の問題に関しては、高次で問題が発生する傾向があります。数字を捨てて、およそ6次がそれを推進していると言います。代わりに、それらは通常、カスケードバイクアッド(2次フィルターセクション)として実装されます。5次フィルターの場合、z領域の伝達関数(5次の有理関数)として記述し、5つの極と5つのゼロに分解します。複素共役を収集すると、2つのバイクアッドと1つの1次フィルターが得られます。一般に、極が単位円に近づくにつれて、安定性の問題が発生する傾向があります。

また、IIRフィルターにはノイズとリミットサイクルの問題がある可能性があるため、異なる数値プロパティを持つさまざまなフィルタートポロジ(つまり、直接形式I、直接形式II)がありますが、この点については考えすぎません。精度が高く、ほぼ間違いなく十分です。


FIRフィルターでのみ機能するとはどういう意味ですか?とにかく、IIRフィルターを何らかの方法でサンプリングする必要があると思いました。これを避けるために、IIRフィルターは通常時間領域に実装されていますか?
アンドレアス

1
私の知る限り、IIRフィルターは常に時間領域で実装されています。IIRフィルター(ここでは、たとえば、2次フィルターまたは「バイカッド」)は、などの差分方程式によって定義されy(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2)ます。これは、以前の入力サンプル(x値)と以前の出力サンプル(y値)の組み合わせであることに注意してください。FIRフィルターは過去の入力のみに依存するため、効率的な周波数領域の実装が可能です。IIRフィルターはそうではありませんが、とにかく非常に効率的です。IIRフィルターは次数がはるかに低いためです。
シュナーフ

1
IIRフィルターが非常に低次になる傾向があるのは、極(前の出力サンプルのフィードバック)により、FIRフィルターと比較して非常に少ない係数でフィルターがより急峻になるためです。もっと低い次数と言えば、一般的なIIRフィルターは2次(5つの係数)であるかもしれませんが、同じタスクの典型的なFIRフィルターは数千の係数を持つかもしれません。
シュナーフ

4

ほとんどすべての場合、最良の選択は畳み込みでもFFTでもなく、IIRフィルターを直接適用するだけです(たとえばsosfilt()関数を使用)。これは、CPUとメモリの消費の点で非常に効率的です。

数値が異なるかどうかは、特定のフィルターによって異なります。いくつかの違いが忍び寄る唯一のケースは、極が単位円に非常に近い場合です。役立つトリックもいくつかあります。伝達関数表現とfilter()を使用しないで、sosfilt()で極と零点を使用してください。違いの例を次に示します。

n = 2^16;  % filter length
fs = 44100; % sample rate
x = zeros(n,1); x(1) = 1;
f0 = 15; % cutoff frequency in Hz
% design with poles and zeroes
[z,p,k] = butter(5,f0*2/fs);
clf
plot(sosfilt(zp2sos(z,p,k),x));
% design with transfer function
[b,a] = butter(5,f0*2/fs);
hold on
plot(filter(b,a,x),'k');

filter()は、約15Hz @ 44.1kHzのカットオフで悪くなります。sosfilt()の場合、カットオフは44.1kHzの1/100 Hzを大幅に下回ることができ、問題はありません。

安定性に問題がある場合、FFTはあまり役に立ちません。フィルターはIIRフィルターであるため、インパルス応答は無限であり、最初に切り捨てる必要があります。これらの非常に低い周波数では、インパルス応答が非常に長くなるため、FFTも実用的ではなくなります。

たとえば、44.1 kHzで1/100 Hzのカットオフが必要で、100 dBのインパルス応答のダイナミックレンジが必要な場合、およそ2500万サンプルが必要です!!! これは44.1 kHzでほぼ10分で、元の信号よりも何倍も長くなります


これは数値の問題に関する質問には実際には答えませんが、私は問題を認識していませんfilterでした-ありがとう!私のハイパスカットオフは0.5 Hz @ 250 Hzです。の問題の理由は何filterですか?私は自分で実装を書いています。
アンドレアス

2

なぜ物事が違うと思いますか?理論上の概念は実用的なアプリケーションに変換する必要がありますが、唯一の違いは浮動小数点の問題であり、それを回避することはできません。MATLABの簡単な例で簡単に検証できます。

x=randn(5,1);
y=randn(5,1);
X=fft(x,length(x)+length(y)-1);
Y=fft(y,length(x)+length(y)-1);

z1=conv(x,y);z2=ifft(X.*Y);
z1-z2

ans =

   1.0e-15 *

   -0.4441
   -0.6661
         0
   -0.2220
    0.8882
   -0.2220
         0
   -0.4441
    0.8882

ご覧のとおり、エラーはマシンの精度のオーダーです。FFTメソッドを使用しない理由はありません。Endolithが述べたように、FFTアプローチを使用してフィルター/畳み込み/相互相関などを行うことは非常に一般的であり、非常に小さなサンプル(この例のように)を除いてはるかに高速です。時間領域処理が行われることはありません...それはすべて、アプリケーション、ニーズ、制約に帰着します。


1
元の質問は、FFTベースのフィルター処理に固有の浮動小数点の問題と、時間領域でのフィルターの直接的な実装を掘り下げたものだと思います。これは、非常に長いフィルターを使用している場合や、FFTの実装が不適切な場合など、固定小数点信号処理にとって大きな懸念事項です。倍精度浮動小数点では、長さ5のシーケンスに対する効果は絶対に表示されません。
ジェイソンR

@JasonR上記の例でシーケンスの長さを1e6に拡張した場合、エラーはまだマシン精度です。あなたが言及するエラーは、主に不十分なフィルター設計または不適切なFFT実装のために発生します。それらがうまくいけば、時間領域での畳み込みが周波数領域での畳み込みとは異なる答えを与える理由がわかりません。
ローレムイプサム

1
計算を行うドメインに基づいて異なる答えを与えるべきではありません。私の唯一のポイントは、実際の数学的操作が2つのアプローチ間で大きく異なるため、利用可能なそれぞれの実装に応じて、目に見える違いを見ることができました。倍精度の場合、適切な実装があると仮定すると、極端な場合を除いて違いはないと思います。
ジェイソンR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.