| Signal Processing Toolbox | ![]() |
表示
y=fftfilt(b,x) y=fftfilt(b,x,n)
詳細
fftfiltは、FIRフィルタのみに機能する周波数領域のフィルタリング手法で、効率的なFFTベースのオーバラップ加算法を使ってデータをフィルタ処理します。
y は、係数ベクトル = fftfilt(b,x)
bによって記述されるフィルタでベクトルxのデータをフィルタ処理し、データベクトルyを出力します。fftfiltが実行する演算は、差分方程式により時間領域内で、つぎのように表されます。
これと等価な表現は、z変換、または、周波数領域表現で、つぎのように表されます。
デフォルトでは、fftfiltは効率的な実行時間を保証するFFTの長さとデータブロック長を選択します。
y は、FFT長 = fftfilt(b,x,n)
nfft = 2^nextpow2(n)とデータブロック長(nfft - length(b) + 1)を使用します。
fftfiltは、実数入力と複素数入力のどちらに対しても機能します。
例題
fftfilt と filterから得られる結果が等価であることを示します。
b=[1 2 3 4]; x=[1 zeros(1,99)]'; norm(fftfilt(b,x) - filter(b,1,x)) ans=9.5914e-15
アルゴリズム
fftfilt は、fftを使って、オーバラップ加算法(参考文献[1])を実現します。これは、入力データ列をブロックとして連続的に抜き出し、周波数領域に変換し、フィルタ処理を行い、組み合わせるものです。fftfiltは、入力データ列xを長さLのデータブロックに分割します。
そして、つぎの操作により、フィルタbと各ブロックのコンボリューションを行います。
y = ifft(fft(x(i:i+L-1),nfft).*fft(b,nfft));
ここで、nfftはFFTの長さです。fftfiltは、結果を(nb-1)点ずつ重ね合せ、その和を計算します。ここで、nbはフィルタの長さです。
fftfiltは、ユーザがFFTの長さnを設定するかどうか、またフィルタや信号の長さによって、種々の方法で、主要パラメータのLとnfftを選択します。nの値(FFTの長さを決定する)が設定されなければ、fftfiltは、これらの主要パラメータを自動的に選択します。
length(x)がlength(b)より大きい場合、 fftfiltは、ブロック数とFFT毎のフロップ数を乗算した結果が最小になる値を選択します。length(b)がlength(x)に等しいか、または大きい場合、fftfiltは、つぎの長さの単一FFTを使用します。 2^nextpow2(length(b) + length(x) - 1)
これは本来、つぎの計算を行なうものです。
y = ifft(fft(B,nfft).*fft(X,nfft))
nに値を設定すると、fftfiltは、FFTの長さnfftを2^nextpow2(n)に、データブロック長をnfft - length(b) + 1に選択します。nがlength(b)未満の場合、fftfiltは、nをlength(b)に設定します。
参考
|
コンボリューションおよび多項式乗算 |
|
巡回型(IIR)または非巡回型(FIR)フィルタによるデータのフィルタリング |
|
ゼロ位相ディジタルフィルタリング |
参考文献
[1] Oppenheim, A.V., and R.W. Schafer, Discrete-Time Signal Processing, Prentice-Hall, 1989.
| fft2 | fftshift | ![]() |