FFT 関数を数回呼び出すアルゴリズムを開発しています。いくつかの時間制約 (リアルタイムが望ましい) があるため、すべての FFT 呼び出しに費やされる時間を最小限に抑える必要があります。
私は OpenCV ライブラリを使用しており、既に 2 つの異なるアプローチでコードを実装しています。
- FFTW ライブラリを使用します。データ/メモリ管理 + FFT(8ms) = 14ms (つまり、FFT_MEASURE フラグ)。
- OpenCV fft 関数を使用します。データ/メモリ管理 + FFT (21ms) = 23ms (平均)。
私の入力データは常に 512x512 ピクセルの実画像として固定されているため、DFT の数学的定義に基づいて FFT アルゴリズムを実装し、正弦/余弦テーブルを保存すると、パフォーマンスが向上すると思いますか、それとも FFTW ライブラリが本当に非常に最適化されていますか?より良いアイデアはありますか?
すべてのアイデアや提案は本当に高く評価されます。今のところ、並列化や GPU の実装は考えていません。
ありがとうございました
アップデート:
システム: Windows 7 の Intel Xeon 5130 2.0GHz CPU、Visual Studio 10.0 および FFTW 3.3.3 (サイトの指示に従ってコンパイル)、OpenCV 2.4.3。
FFTW を使用した FFT 呼び出しのコード例 (入力: OpenCV Mat CV_32F (1 チャネル、float 型)、出力 OpenCV Mat CV_32FC2 (2 チャネル、float 型)):
float *im_data;
fftwf_complex *data_in;
fftwf_complex *fft;
fftwf_plan plan_f;
int i, j, k;
int height=I.rows;
int width=I.cols;
int N=height*width;
float* outdata = new float[2*N];
im_data = ( float* ) I.data;
data_in = ( fftwf_complex* )fftwf_malloc( sizeof( fftwf_complex ) * N );
fft = ( fftwf_complex* )fftwf_malloc( sizeof( fftwf_complex ) * N );
plan_f = fftwf_plan_dft_2d( height , width , data_in , fft , FFTW_FORWARD , FFTW_MEASURE );
for(int i = 0,k=0; i < height; ++i) {
float* row = I.ptr<float>(i);
for(int j = 0; j < width; j++) {
data_in[k][0]=(float)row[j];
data_in[k][1] =(float)0.0;
k++;
}
}
fftwf_execute( plan_f );
int width2=2*width;
// writing output matrix: RealFFT[0],ImaginaryFFT[0],RealFFT[1],ImaginaryFFT[1],...
for( i = 0, k = 0 ; i < height ; i++ ) {
for( j = 0 ; j < width2 ; j++ ) {
outdata[i * width2 + j] = ( float )fft[k][0];
outdata[i * width2 + j+1] = ( float )fft[k][1];
j++;
k++;
}
}
Mat fft_I(height,width,CV_32FC2,outdata);
fftwf_destroy_plan( plan_f );
fftwf_free( data_in );
fftwf_free( fft );
return fft_I;