我正在尝试移植使用 FFTW 的代码以使用 KissFFT。
代码使用fftwf_plan_r2r_2d()
withFFTW_REDFT01
。
KissFFT 中的等效调用是什么?
如果这个调用 (with FFTW_REDFT01
) 等效于 DCT,我可以只使用直接 DCT 变换,例如OpenCVcv::dct
吗?
是否需要进行一些输入数据修改,例如反射和对称化?
我正在尝试移植使用 FFTW 的代码以使用 KissFFT。
代码使用fftwf_plan_r2r_2d()
withFFTW_REDFT01
。
KissFFT 中的等效调用是什么?
如果这个调用 (with FFTW_REDFT01
) 等效于 DCT,我可以只使用直接 DCT 变换,例如OpenCVcv::dct
吗?
是否需要进行一些输入数据修改,例如反射和对称化?
回答我自己的问题......在这两个
参考资料
的帮助下,我最终完全没有使用 DFT,而是使用 OpenCV 的and代替。 cv::dct()
cv::idct()
要回答这个问题,fftwf_plan_r2r_2d(...,FFTW_REDFT10, FFTW_REDFT10,...)
可以用这个带有额外缩放的 OpenCV 代码替换:
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
请注意,OpenCV 仅支持具有偶数行和列的图像。