Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

fftfilt

オーバーラップ加算法を使用した FFT ベースの FIR フィルター処理

説明

y = fftfilt(b,x) では、ベクトル x 内のデータが係数ベクトル b の記述するフィルターでフィルター処理されます。

y = fftfilt(b,x,n)n を使用して FFT 長を求めます。

y = fftfilt(d,x)digitalFilter オブジェクト d を使用してベクトル x のデータをフィルター処理します。

y = fftfilt(d,x,n)n を使用して FFT 長を求めます。

すべて折りたたむ

小さなオペランドには filter の方が、大きなオペランドには fftfilt の方が効率的であることを確認します。20 タップの短いフィルターと 2,000 タップの長いフィルターの 2 つの乱数フィルターを使用して、106 個の乱数をフィルター処理します。tictoc を使用して実行時間を測定します。実験を 100 回繰り返して統計を向上させます。

rng default

N = 100;

shrt = 20;
long = 2000;

tfs = 0;
tls = 0;
tfl = 0;
tll = 0;

for kj = 1:N
    
    x = rand(1,1e6);

    bshrt = rand(1,shrt);

    tic
    sfs = fftfilt(bshrt,x);
    tfs = tfs+toc/N;

    tic
    sls = filter(bshrt,1,x);
    tls = tls+toc/N;

    blong = rand(1,long);

    tic
    sfl = fftfilt(blong,x);
    tfl = tfl+toc/N;
    
    tic
    sll = filter(blong,1,x);
    tll = tll+toc/N;

end

平均時間を比較して表示します。

fprintf('%4d-tap filter averages: fftfilt: %f s; filter: %f s\n',shrt,tfs,tls)
  20-tap filter averages: fftfilt: 0.198692 s; filter: 0.011825 s
fprintf('%4d-tap filter averages: fftfilt: %f s; filter: %f s\n',long,tfl,tll)
2000-tap filter averages: fftfilt: 0.065351 s; filter: 0.261912 s

この例では、Parallel Computing Toolbox™ ソフトウェアが必要です。サポートされている GPU の一覧については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。

加法性ホワイト ガウス ノイズの正弦波の合計から構成される信号を作成します。正弦波の周波数は、2.5、5、10 および 15 kHz です。サンプリング周波数は 50 kHz です。

Fs = 50e3;
t = 0:1/Fs:10-(1/Fs);
x = cos(2*pi*2500*t) + 0.5*sin(2*pi*5000*t) + 0.25*cos(2*pi*10000*t)+ ...
    0.125*sin(2*pi*15000*t) + randn(size(t));

designfilt を使用してローパス FIR 等リップル フィルターを設計します。

d = designfilt('lowpassfir','SampleRate',Fs, ...
    'PassbandFrequency',5500,'StopbandFrequency',6000, ...
    'PassbandRipple',0.5,'StopbandAttenuation',50);
B = d.Coefficients;

オーバーラップ加算法によって、GPUでデータをフィルター処理します。gpuArray を使用してデータを GPU に入力します。gather を使用して出力を MATLAB® ワークスペースに返し、フィルターされたデータのパワー スペクトル密度推定をプロットします。

y = fftfilt(gpuArray(B),gpuArray(x));
periodogram(gather(y),rectwin(length(y)),length(y),50e3)

入力引数

すべて折りたたむ

フィルター係数。ベクトルとして指定します。b が行列の場合、fftfilt では、b の各列にあるフィルターが信号ベクトル x に適用されます。

入力データ。ベクトルとして指定します。x が行列の場合、fftfilt では各列がフィルター処理されます。bx が同じ列数を持つ行列の場合、bi 列目を使用して xi 列目がフィルター処理されます。fftfilt は、実数入力および複素数入力の両方に使用できます。

FFT 長。正の整数として指定します。既定では、fftfilt では効率的な実行時間になるように FFT の長さとデータ ブロック長が選択されます。

デジタル フィルター。digitalFilter オブジェクトで指定します。d を周波数応答仕様に基づいて生成するには、関数 designfilt を使用します。

出力引数

すべて折りたたむ

出力データ。ベクトルまたは行列として返されます。

詳細

すべて折りたたむ

filter 関数との比較

入力信号が比較的大きい場合は、fftfiltfilter よりも高速です。

filterx の各サンプルに対して N 回 (N はフィルター長) の乗算を行います。fftfilt では、12Llog2L のコストで 2 つの FFT 演算 (信号ブロック長 L の FFT と、FFT どうしの積の逆 FT) が実行されます。ここで、L はブロック長です。次に、L ポイントごとの乗算を実行します。総コストは L+Llog2L=L(1+log2L) 回の乗算です。そのため、コスト比は L(1+log2L)/(NL)=(1+log2L)/N になります。これは log2L / N に近似できます。

つまり、fftfilt は、log2L が N 未満である場合により高速になります。

アルゴリズム

fftfilt では、FIR フィルターに対してのみ機能する周波数領域のフィルター処理手法である、効率的な FFT ベースの "オーバーラップ加算" [1]を使用して、連続的な周波数領域のフィルター処理された入力シーケンスのブロックを組み合わせることで、データをフィルター処理します。fftfilt で実行される演算は、差分方程式により時間領域内で、以下のように表されます。

y(n)=b(1)x(n)+b(2)x(n1)++b(nb+1)x(nnb)

これと等価な表現は、Z 変換、すなわち "周波数領域" 表現で、以下のように表されます。

Y(z)=(b(1)+b(2)z1++b(nb+1)znb)X(z)

fftfiltfft を使用してオーバーラップ加算法を実装します。fftfilt は、入力シーケンス x を長さ L のデータ ブロックに分割します。このとき、L はフィルター長 N よりも長くなければなりません。

さらに、以下の操作により、フィルター b で各ブロックを畳み込みます。

y = ifft(fft(x(i:i+L-1),nfft).*fft(b,nfft));

ここで、nfft は FFT の長さです。fftfilt は、連続的な出力セクションを n-1 点ずつオーバーラップさせ、その和を計算します。ここで、n はフィルターの長さです。

fftfilt では、フィルターと信号の FFT 長 n を指定するかどうかによって、さまざまな方法で主要パラメーターの Lnfft が選択されます。FFT の長さを決定する n の値を指定しない場合は、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 の長さ nfft2^nextpow2(n)、データ ブロック長に nfft - length(b) + 1 が選択されます。nlength(b) 未満の場合、fftfilt では nlength(b) が設定されます。

参照

[1] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 1999.

拡張機能

バージョン履歴

R2006a より前に導入