FFTは高速フーリエ変換を行うライブラリであり、離散フーリエ変換(DFT)を計算するアルゴリズムです。
個の複素数データ
に対するDFT
は以下の式で与えられます。
ここで、
です。逆変換は以下の式で与えられます。
上記の式では、順変換に対しスケーリングを行なわず、逆変換を
でスケーリングします。他に、
で順変換をスケーリングし逆変換にスケーリングを行わない方法、もしくは両方の変換を
でスケーリングする方法があります。
Itanium® Processor Family (IPF)版MathKeisanのFFTは、 Intel® Math Kernel Library(MKL)のFFTおよびDFTのインタフェースを備えています。 本章ではこれ以降、SX版のMathKeisanのFFTについてのみ記載しています。
FFTの機能はパッケージによってそれぞれ大きく異なっており、標準となるユーザインタフェースがありません。
SX版MathKeisanのFFTは、
Cray®のLibSciTM 3.1 および
HP MLIBのVECLIB
[3]
と同じ機能を備えています。
MathKeisanのLibSciTMと
Cray®のLibSciTM
のインタフェースはワーク配列のサイズ以外は同じです。
FFT
のリファレンス(man page)にワーク配列サイズの計算方法を記載しています。
MathKeisan FFTは、以下の変換に対応しています。
これらの変換はすべて、以下のデータ型のマッピングに利用できます。
ユーザインタフェース情報は、いくつかの箇所に記載されています。
ZFFTMLT サブルーチンの情報を見るには、
man zfftmlt と入力してください。マニュアルページをご覧になれない場合は、
Man Page
を参照してください。。
PARFFTは、FFTのOpenMP版です。
FFTと同じユーザインタフェースを備えているので、
FFTにリンクされたコードであればPARFFTにリンクさせることができます。
環境変数 OMP_NUM_THREADS が
np
に設定されている場合、PARFFTは
np
個のスレッド上で実行されます。OMP_NUM_THREADSが設定されていない場合には、
PARFFTは
mp
個のスレッド上で実行されます。この時、
mp
はリソースグループまたはノード内の最大スレッド数です。
を
と定義するとDFTは以下のような行列とベクトルの積により与えられます。
のべき乗の計算を無視するならば、DFTの浮動小数点演算数は
になります。1965年に
Cooley と Tukey
[1]
が、DFTを計算するFFTアルゴリズムを開発しました。
が2のべき乗である時、FFTアルゴリズムでは演算数が
と大幅に少なくなります。一般的な
では、演算数は
です。当時CooleyとTukeyは知りませんでしたが、FFTのアルゴリズムはすでに
Gauss
[2]
により1805年に提唱され、その死後1866年に発表されていました。
本アルゴリズムを理解するため、
が2のべき乗である場合を考えます。
をDFTの式に代入します。
とし
を偶数成分
と奇数成分
に分割します。
という周期性を使って
を変換します。
を前半の
個と後半の
個のエントリに分割します。
と
という周期性を使って
を変換します。
サイズが
、演算数が
のオリジナルDFTを、サイズが
、演算数が
の2つのDFTと置き換えました。
ステップ続けて、長さ
のオリジナルDFTを長さ1のDFTと置き換えることができます。
これを基数2のFFTと呼びます。
本アルゴリズムは2のべき乗だけでなく、一般の
まで拡張することが可能です。
上記の分割処理は、時間間引き形(DIT)Cooley-Tukeyアルゴリズムに対応しています。
合計で8回の分割があります。
MathKeisan FFTライブラリで用いられる分割は、
周波数間引き形(DIF)Stockhamアルゴリズムです。
本アルゴリズムから派生したアルゴリズムは
Van Loan
[4]
に記載されています。
DIF Stockhamアルゴリズムの演算数はCooley-Tukeyと同じですが、演算を行う順序が違います。
FFTの計算は、一連の基数のステップ
として行われます。
は一般的に、
を素因数分解して得られる小さな素数です。
計算中のベクトル長は基数
ステップで
、基数
ステップで
、基数
ステップでは以下のようになります。
が小さいと、FFT計算時のベクトル長は短くなります。
アプリケーションによっては、同じ長さの1次元FFTがたくさん必要になります。
FFTの長さが
で、FFTの数が
だとすると、多重1次元FFTは以下のように記述することができます。
ここで
と
は複素数の2次元配列です。
多重1次元FFT計算時の基数
ステップにおけるベクトル長は、以下のようになります。
このようにベクトル長が長いため、1次元FFTより多重1次元FFTの方が性能上有利です。
複素数
の2次元フーリエ変換
は、以下の式で与えられます。
ここで
と定義すると
は以下の式になります。
こうして2次元フーリエ変換は、
と
の2つの多重1次元FFTにより置き換えられました。
同様に、3次元フーリエ変換は3つの多重1次元FFTにより置き換えられます。
MathKeisanルーチンの内部では、2次元および3次元フーリエ変換は
多重1次元計算カーネルを呼び出して計算しています。
これをrow-column法といいます。
実数-複素数FFTは対称性を持っているので、複素数-複素数FFTに比べ、
演算数およびメモリ使用量において約2倍性能が良くなっています。
周期性があることがわかるように、DFTを三角関数
と
を使って記述します。
が実数である場合、
は
について周期性を持つ複素共役となります。これにより、
の値の半分しか格納しなくて良いことになります。値
は、DC周波数と呼ばれます。
が偶数の場合、値
はナイキスト周波数と呼ばれます。恒等式
および
から、
と
が実数であることが分かります。
入力ベクトルがサイズ
の実数である実数-複素数FFTの場合、速度とメモリの優位性を活かすには、
出力ベクトルはサイズ
の複素数である必要があります。
入力ベクトルがサイズ
の複素数である複素数-実数FFTの場合、出力ベクトルはサイズ
の実数である必要があります。サイズが
ではなく
である理由は、DC周波数とナイキスト周波数の冗長ゼロ部が格納されるからです。
LibSciTMやVECLIBのインタフェースの中には
空間節約を利用しているものもありますが、そうでないものもあります。
インタフェース情報は、
FFTのリファレンス(man page)
を参照してください。
多重1次元、2次元、3次元FFTサブルーチンは、 データを2次元または3次元の配列に格納しています。 配列の整合寸法が2の高次べき乗である場合、 バンクコンフリクトにより性能が劣化します。 配列の整合寸法は奇数に設定してバンクコンフリクトを防止するのが最善です。
| 名称 | 接頭辞 | 説明 | |
|---|---|---|---|
| LibSci | ?FFT
| CC ZZ
| 1次元複素数-複素数FFT |
?FFT
| C Z
| 1次元複素数-複素数FFT | |
?FFT2
| C Z
| 1次元複素数-複素数FFT | |
?FFT
| SC DZ
| 1次元実数-複素数FFT | |
?FFT
| CS ZD
| 1次元複素数-実数FFT | |
?FFT2
| RC DZ
| 1次元実数-複素数FFT | |
?FFT2
| CR ZD
| 1次元複素数-実数FFT | |
?FFT2D
| CC ZZ
| 2次元複素数-複素数FFT | |
?FFT2D
| C Z
| 2次元複素数-複素数FFT | |
?FFT2D
| SC DZ
| 2次元実数-複素数FFT | |
?FFT2D
| CS ZD
| 2次元複素数-実数FFT | |
?FFT3D
| CC ZZ
| 3次元複素数-複素数FFT | |
?FFT3D
| C Z
| 3次元複素数-複素数FFT | |
?FFT3D
| SC DZ
| 3次元実数-複素数FFT | |
?FFT3D
| CS ZD
| 3次元複素数-実数FFT | |
?FFTM
| CC ZZ
| 多重1次元複素数-複素数FFT | |
M?FFT
| C Z
| 多重1次元複素数-複素数FFT | |
?FFTMLT
| C Z
| 多重1次元複素数-複素数FFT | |
?FFTM
| SC DZ
| 多重 1次元実数-複素数FFT | |
?FFTM
| CS ZD
| 多重 1次元複素数-実数FFT | |
?FFTMLT
| R D
| 多重 1次元実数-複素数、複素数-実数FFT | |
?FTFAX
| F D
| 実数のFFT因数を生成、三角関数表を計算する | |
?FTFAX
| C Z
| 複素数のFFT因数を生成、三角関数表を計算する | |
XERFFT
| FFTエラー処理を行う | ||
| VECLIB | ?1DFFT
| C Z
| 1次元複素数-複素数FFT、複素数引数 |
?1DFFT
| S D
| 1次元複素数-複素数FFT、実数引数 | |
?RC1FT
| C Z
| 1次元実数-複素数、複素数-実数FFT、複素数引数 | |
?RC1FT
| S D
| 1次元実数-複素数、複素数-実数FFT、実数引数 | |
?2DFFT
| C Z
| 2次元複素数-複素数FFT、複素数引数 | |
?2DFFT
| S D
| 2次元複素数-複素数FFT、実数引数 | |
?RC2FT
| C Z
| 2次元実数-複素数、複素数-実数FFT、複素数引数 | |
?RC2FT
| S D
| 2次元実数-複素数、複素数-実数FFT、実数引数 | |
?3DFFT
| C Z
| 3次元複素数-複素数FFT、複素数引数 | |
?3DFFT
| S D
| 3次元複素数-複素数FFT、実数引数 | |
?RC3FT
| C Z
| 3次元実数-複素数、複素数-実数FFT、複素数引数 | |
?RC3FT
| S D
| 3次元実数-複素数、複素数-実数FFT、実数引数 | |
?FFTS
| C Z
| 多重 1次元複素数-複素数FFT、複素数引数 | |
?FFTS
| S D
| 多重 1次元複素数-複素数FFT、実数引数 | |
?RCFTS
| C Z
| 多重 1次元実数-複素数、複素数-実数FFT、複素数引数 | |
?RCFTS
| S D
| 多重 1次元実数-複素数、複素数-実数FFT、実数引数 |