4

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;
4

3 に答える 3

3

Your FFT time with FFTW seems very high. To get the best of out FFTW with fixed size FFTs you should generate a plan using the FFTW_PATIENT flag and then ideally save the generated "wisdom" for subsequent re-use. You can generate wisdom either from your own code or using the fftw-wisdom tool.

于 2012-12-04T13:23:13.313 に答える
1

Intel Math Kernel Library (Intel コンパイラとは別)の FFT は、ほとんどの場合、FFTW よりも高速です。あなたの場合、価格を正当化するのに十分な改善になるかどうかはわかりません.

独自の FFT をローリングすることは、おそらく時間の有効な使い方ではないという他の人たちの意見に同意します (その方法を学びたい場合を除きます)。利用可能な FFT 実装 (FFTW、MKL) は、長年にわたって非常に細かく調整されてきました。改善できないと言っているわけではありませんが、わずかな利益を得るためには、おそらく多くの作業と時間が必要になるでしょう。

于 2012-12-04T16:12:55.823 に答える
0

fftw は本当に最適化されていると信じてください。

fftw のコンパイルに使用したコンパイラはどれですか? Intel のコンパイラが gcc よりも優れたパフォーマンスを提供する場合があります

于 2012-12-04T12:44:46.007 に答える