我正在开发一个调用FFT函数多次的算法。我有几个时间约束(需要实时执行),因此我需要尽量减少每个FFT调用所花费的时间。
我正在使用OpenCV库进行开发,并已经使用两种不同的方法实现了我的代码:
- 使用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通道,浮点类型),输出OpenCV Mat CV_32FC2(2通道,浮点类型):
我正在使用OpenCV库进行开发,并已经使用两种不同的方法实现了我的代码:
- 使用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通道,浮点类型),输出OpenCV Mat CV_32FC2(2通道,浮点类型):
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;