FFTW fftwf_plan_r2r_2d() с эквивалентом FFTW_REDFT01

Я пытаюсь портировать код, использующий FFTW, для использования KissFFT.
В коде используется fftwf_plan_r2r_2d() с FFTW_REDFT01.

Каким будет эквивалентный вызов в KissFFT?

Если этот вызов (с FFTW_REDFT01) эквивалентен DCT, могу ли я вместо этого просто использовать прямое преобразование DCT, например. например, OpenCV cv::dct?
Является ли есть ли какая-то модификация входных данных, которую мне нужно сделать, например, отражения и симметризация?


person Adi Shavit    schedule 20.05.2013    source источник


Ответы (1)


Отвечая на мой собственный вопрос...
С помощью этих две ссылки, в итоге я не вообще использовал DFT, но вместо этого используйте OpenCV 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 поддерживает только изображения с четным количеством строк и столбцов.

person Adi Shavit    schedule 20.05.2013
comment
Спасибо большое за это, недавно наткнулся именно на эту проблему, еще нужно портировать функцию fftwf_plan_r2r_2d(...,...,...,..., FFTW_REDFT00, FFTW_REDFT00, FFTW_ESTIMATE | FFTW_DESTROY_INPUT))) Any идеи? - person Kachinsky; 26.11.2013