高速フーリエ変換 (FFT) の使用

高速フーリエ変換 (FFT) の使用は、特にフィルタリングが不可欠なデジタル信号処理の分野で、データ処理のパフォーマンスを向上するユニバーサルな方法です。

畳み込み定理では、空間ドメインの 2 つの信号のフィルタリングを周波数ドメインの各点乗算として計算できるとしています。周波数ドメイン間のデータ変換は通常、フーリエ変換を使用して行われます。インテル® プロセッサー向けに最適化されたインテル® IPP の FFT 関数を使用して、入力信号に有限インパルス応答 (FIR) フィルターを適用できます。配列をゼロでパディングしてデータ配列の長さを次の 2 の累乗に増やした後、順方向の FFT 関数を入力信号と FIR フィルター係数に適用することもできます。この方法で得られたフーリエ係数は、各点乗算されていて、結果は簡単に空間ドメインに変換しなおすことができます。FFT の使用によりパフォーマンスは大幅に向上します。

適用するフィルターが複数の反復処理で同じ場合、1 回計算したフィルター係数を各反復で再利用できます。回転テーブルとビット反転テーブルは、順方向変換および逆方向変換関数で同時に作成されます。次のサンプルコードは、この種のフィルタリングにおける主演算を示しています。

/// 要求されたバッファーのサイズを取得
   ippsFFTGetSize_R_32f ( fftord, IPP_FFT_DIV_INV_BY_N, ippAlgHintNone, &sizeSpec, &sizeInit, &sizeBuffer );

   /// 要求されたバッファーのメモリー割り当て
   pMemSpec = ippsMalloc_8u ( sizeSpec );

   if (sizeInit > 0) {
      pMemInit = ippsMalloc_8u ( sizeInit );
   }
   
   pMemBuffer = ippsMalloc_8u ( sizeBuffer );

   /// FFT 構造体を初期化
   ippsFFTInit_R_32f ( &pFFTSpec, fftord, IPP_FFT_DIV_INV_BY_N, ippAlgHintNone, pMemSpec, pMemInit );

   /// 順方向の FFT を実行してソースデータ xx を周波数ドメインに配置
   ippsFFTFwd_RToPack_32f( xx, XX, pFFTSpec, pMemBuffer );

   /// 順方向の FFT を実行してフィルター係数 hh を周波数ドメインに配置
   ippsFFTFwd_RToPack_32f( hh, HH, pFFTSpec, pMemBuffer  );

   /// 周波数ドメインの各点乗算は畳み込み
   ippsMulPack_32f( HH, XX, Dst, fftlen );

   /// 逆方向の FFT を実行して時間定義域で結果を取得
   ippsFFTInv_PackToR_32f( XX, yy, pFFTSpec, pMemBuffer );

パフォーマンスを大幅に向上させる別の方法として、大規模なサイズのデータ処理に FFT と乗算を使用する方法があります。

インテル® IPP の信号処理 FIR フィルターは FFT を使用して実装されているため、FIR 関数の特別な実装を作成する必要はありません。


このヘルプトピックについてのフィードバックを送信