FFTW fftwf_plan_r2r_2d()与FFTW_REDFT01等效

时间:2013-05-20 08:51:58

标签: opencv fftw dft dct kissfft

我正在尝试移植使用FFTW的代码来使用KissFFT 该代码使用fftwf_plan_r2r_2d() with FFTW_REDFT01

KissFFT中的等效电话是什么?

如果此调用(使用FFTW_REDFT01)等同于DCT,我是否可以使用直接DCT变换,例如例如OpenCV cv::dct
我需要做一些输入数据修改,比如反射和对称化吗?

1 个答案:

答案 0 :(得分:4)

回答我自己的问题...... 在these two引用的帮助下,我最终使用DFT 而不是,而是使用OpenCV的cv::dct()cv::idct()

要回答这个问题,可以使用此OpenCV代码替换fftwf_plan_r2r_2d(...,FFTW_REDFT10, FFTW_REDFT10,...)并进行额外扩展:

cv::dct(img, resFFT); // fwd dct. This is like Matlab's dct2()
resFFT *= (4 * sqrt(float(img.rows/2)) * sqrt(float(img.cols/2)));
resFFT.row(0) *= sqrt(2.f);
resFFT.col(0) *= sqrt(2.f);

FFTW_REDFT01的反转可以这样完成:

// First re-scale the data for idct():
resFFT /= (4 * sqrt(float(img.rows/2)) * sqrt(float(img.cols/2)));
resFFT.row(0) /= sqrt(2.f);
resFFT.col(0) /= sqrt(2.f);
cv::idct(resFFT, outImg); // this will return the input exactly

// However, the transforms computed by FFTW are unnormalized, exactly like the corresponding, 
// so computing a transform followed by its inverse yields the original array scaled by N, where N is the logical DFT size. 
// The logical DFT size: Logical N=2*n for each axis, this is th implicit symmetrization
// of the image: reflect right and then reflect both halves down.
int logicalSizeN = (2*img.rows) * (2*img.cols);
outImg *= logicalSizeN; // scale to be like FFTW result

更多有用的链接herehere

请注意,OpenCV仅支持具有偶数行和列的图像。