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 | ![]() |