説明
[高速フーリエ変換]

Fast Image Engene の高速フーリエ変換関数群(以下FIE_FFTと呼称)は、 前方/後方の両方の高速フーリエ変換を1次元、2次元において、複素数、実数の両データ形式で行うことが出来ます。

データの型
下記の4種類のデータ型がFIE_FFTでは使用できます。
  1. unsigned char
  2. unsigned short
  3. short
  4. double

FIE_FFTで使用できる複素数データはすべて double型の集合です。 下記の3種の形式が利用可能です。

  1. interleaved format
  2. splitted format
  3. packed format

参照:
f_fft_data_type
一次元フーリエ変換とその逆変換
1次元における長さ $ N $ の複素数データ $ x $ の時間領域における順方向フーリエ変換は下式にて定義されます。

\[ X_k = \sum_{n=0}^{N-1} x_n e^{- \frac {2\pi i } { N } nk } \qquad k = 0,\dots,N-1 \qquad i^2 = -1 \]

逆フーリエ変換は下式にて定義されます。

\[ x_k = \sum_{n=0}^{N-1} X_n e^{ \frac {2\pi i }{N} nk } \qquad k = 0,\dots,N-1 \qquad i^2 = -1 \]

1次元の実数データは、すべての虚数部を0にした複素数データとして処理できます。 したがって、複素数データでの定義は実数のデータにも適用することが出来ます。 実際には実数データの変換はより効率的に行えるアルゴリズムが実装されています。

二次元フーリエ変換とその逆変換
N 、高さ M の2次元データの順方法フーリエ変換は下式にて定義されます。

\[ X_{k_1, k_2} = \sum_{n=0}^{N-1} e^{-{2\pi i \over N} nk_1 } \sum_{m=0}^{M-1} e^{-{2 \pi i \over M} mk_2 } x_{n,m} \qquad k_1 = 0,\dots,N-1, \qquad k_2 = 0, \dots, M-1 \qquad i^2 = -1 \]

2次元データの周波数領域における逆変換は下式にて定義されます。

\[ x_{k_1, k_2} = \sum_{n=0}^{N-1} e^{ {2\pi i \over N} nk_1 } \sum_{m=0}^{M-1} e^{ {2 \pi i \over M} mk_2 } X_{n,m} \qquad k_1 = 0,\dots,N-1, \qquad k_2 = 0, \dots, M-1 \qquad i^2 = -1 \]

FIE_FFTで使用できる複素数の2次元データの形式は f_fft_data_type に記述されています。

実際には、2次元のフーリエ変換は、各行に対して1次元のフーリエ変換を行った後、 各列に対して1次元のフーリエ変換を行うことで実行されます。 2次元の実数データの変換は、虚数部を0にした2次元複素数データの変換を考えることで概念が分かりますが、 実際にFIE_FFTに実装されているアルゴリズムは、より効率的に変換を行うようにデザインされています。

フーリエ変換の正規化
フーリエ変換されたデータの値は、データの長さに比例します。 そのため、変換結果はデータの長さに応じて正規化する必要があります。 FIE_FFTでは、4種類の正規化手法 (f_fft_normalize_type) が使用可能です。 FIE_FFTの初期化関数を実行する際に、どの手法を使用するかフラグで指定して下さい。 周波数画像の可視化が目的の場合はF_FFT_DIV_FWD_BY_Nを、周波数フィルタリングが目的の場合はF_FFT_DIV_INV_BY_Nの利用を推奨します。

参照:
f_fft_normalize_type, fnFIE_fft_1D_alloc(), fnFIE_fft_2D_alloc()
スケーリングとサチュレーション
FIE_FFTでは変換前の空間/時間領域のデータに3種の整数データ形式が使用可能です。 変換後の周波数空間データは必ず double 型にて格納されます。 したがって、整数データ型への逆フーリエ変換を行う際は、スケール値と飽和処理について考慮する必要があります。 FIE_FFTの整数データ型への逆フーリエ変換関数では、スケーリングと飽和処理を行います。 飽和処理は自動で行われますが、スケール値はユーザーが正しく設定しなければ、データのダイナミックレンジを そこなうことになります。

データのサイズ
FIE_FFTで扱うことが出来る1次元データの長さは $ 2^{31} $ までです。
2次元画像においても、幅、または高さの最大値は $ 2^{31} $ ですが、実用的な画像サイズはこの制限よりもとても小さくなります。 幅、または高さの最小値は 2 です。また、画像の幅及び高さはどちらも2のべき乗の値でなければなりません。

FIE_FFTでフーリエ変換を行うには、どのような形式であってもFIE_FFTハンドルの初期化が必要になります。 初期化時に回転因子のテーブルや変換に必要なバッファの確保と初期化が行われ、ハンドルによって管理されます。 1次元の変換では、回転因子テーブルの大きさは、変換するデータの長さにより決定されます。 2次元の変換では、画像の幅と高さのうち大きな方の値により決定されます。 確保されたFFTハンドルは下記の条件がすべて満たされている場合、初期化時に指定したFFT処理とは 異なるFFT処理にも使用することが出来ます。

fnFIE_fft_check_spec() 関数を使用すると、確保済みFFTハンドルが目的の処理に使用可能かどうかを確認することが出来ます。 FFTハンドルを初期化時とは異なるFFT処理に使用する場合は、正規化手法の指定に十分注意してください。 正規化手法の指定を間違えると、出力結果は間違った物になってしまいます。 fnFIE_fft_get_spec() 関数を使用すると、確保済みFFTハンドルがどの正規化手法を用いるよう 設定されているかを確認することが出来ます。

関数名命名則
FIE_FFTには沢山の関数があるため、理解しやすいようにFIE_FFTの関数名命名則を示します。 FIE_FFTの関数名命名則は次のようになっています。

2次元FFT後の画像(周波数領域画像)について
fnFIE_fft2_fwd_RealtoDD() によって実画像を周波数領域画像へ変換できます。 出力される画像は、浮動小数点画像(F_IMG_DOUBLE)となっています。変換した画像から fnFIE_fft2_get_mag_and_phase_DD() を用いて強度画像(振幅スペクトル画像)と角度画像(位相スペクトル画像)を得ることもできます。 周波数画像は画像の四方の角から低周波成分、中央に近づくに従って高周波成分となります。また、画像の左上1画素は直流成分を表します。

周波数画像例
floppy1.png

入力画像

fie_fft2_mag.png

強度画像

強度画像は2のべきサイズになるようにリサイズされた入力画像から生成しています。 右の図は強度画像をUC8の濃淡画像(F_IMG_UC8, 1ch)に変換して可視化したものです。

サンプルコード
周波数画像可視化サンプル
FFTを使用した実画像の周波数フィルタリングのサンプル
参考文献:


Documentation copyright © 2009-2024 FAST Corporation.
Generated on Fri Aug 9 16:38:47 2024 for FIEライブラリ by doxygen 1.5.6-FASTSP-p2