Signal Processing Toolbox | ![]() ![]() |
周波数領域フィルタの実現
時間領域と周波数領域との間には双対性があるため、任意の演算を、いずれの領域で行うことができます。通常、特定の演算には、いずれか一方の領域の方が便利ですが、いずれの領域でも常にある演算を行うことができます。
周波数領域で一般的なIIRフィルタ処理を行うには、入力列の離散フーリエ変換(DFT)にフィルタの分子と分母の各DFTの比を乗算します。
n = length(x);
y = ifft(fft(x).*
fft(b,n)./fft(a,n));
これは、filter
と同じ演算結果となりますが、開始時の過渡状態(エッジ効果)が異なります。データ列が長い場合には、この計算法はきわめて非効率的です。その理由は、入力データのフーリエ係数の長さと同じにするためにフィルタ係数のFFT演算に多くのゼロが付加されることや、データ点n
が増加するに連れてFFTアルゴリズムの効率が低下することです。
ただし、FIRフィルタの場合には、長い列を短い列に分割して、計算上効率的なFFT長にすることができます。関数
y = fftfilt(b,x)
は、オーバラップ加算法(本章の最後にある参考文献[1]を参照)を用いて、長いデータ列を適切な長さのデータ列に分割し、FFTを行い、重ね合わせることにより、フィルタ処理を行ないます。その出力は、filter(b,1,x)
と等しくなります。
![]() | 非因果的ゼロ位相フィルタの実現 | インパルス応答 | ![]() |