OpenCV 傅立叶变换复杂的输出问题
OpenCV Fourier Transform complex output issue
我尝试做一些傅里叶分析,但在 OpenCV cv::dft
函数中 cv::DFT_COMPLEX_OUTPUT
似乎不起作用。我执行以下操作:
// Calculate Fourier transform for each time signal
cv::Mat hf, hf_raw, h, h_raw;
cv::Mat Fp(Pt.size[0], Pt.size[1], CV_64FC2);
cv::Mat Fz(Pt.size[0], Pt.size[1], CV_64FC2);
cv::dft(Pt.t(), Fp, cv::DFT_ROWS, cv::DFT_COMPLEX_OUTPUT);
cv::dft(Zt.t(), Fz, cv::DFT_ROWS, cv::DFT_COMPLEX_OUTPUT);
// [DEBUG]
// Fp and Fz has to be (K*4 x WINDOW_LENGTH) size in the current case (24 x 256)
std::cout << "Fp.size: " << Fp.size << std::endl;
// -> OK
// Fp elements should be complx
std::cout << "Fp.type(): " << Fp.type() << std::endl;
// -> Lots of zero at the end!!! -> With cv::DFT_REAL_OUTPUT there are no zeros
cv::Mat nom, denom, W;
cv::mulSpectrums(Fp, Fp, nom, cv::DFT_ROWS, true);
cv::mulSpectrums(Fz, Fz, denom, cv::DFT_ROWS, true);
我声明 Fp
和 Fz
是两个通道,以便保存实数和复数值(cv::mulSpectrums
函数可以在其上运行)。但是 Fp.type()
结果是 6
,这意味着输出矩阵的类型是 CV_64FC1
。
对于标志,应使用 'or' 运算符,否则第二个将被放入错误的位置!
cv::dft(Pt.t(), Fp, cv::DFT_ROWS | cv::DFT_COMPLEX_OUTPUT);
cv::dft(Zt.t(), Fz, cv::DFT_ROWS | cv::DFT_COMPLEX_OUTPUT);
在这种情况下,输出会很复杂!
我尝试做一些傅里叶分析,但在 OpenCV cv::dft
函数中 cv::DFT_COMPLEX_OUTPUT
似乎不起作用。我执行以下操作:
// Calculate Fourier transform for each time signal
cv::Mat hf, hf_raw, h, h_raw;
cv::Mat Fp(Pt.size[0], Pt.size[1], CV_64FC2);
cv::Mat Fz(Pt.size[0], Pt.size[1], CV_64FC2);
cv::dft(Pt.t(), Fp, cv::DFT_ROWS, cv::DFT_COMPLEX_OUTPUT);
cv::dft(Zt.t(), Fz, cv::DFT_ROWS, cv::DFT_COMPLEX_OUTPUT);
// [DEBUG]
// Fp and Fz has to be (K*4 x WINDOW_LENGTH) size in the current case (24 x 256)
std::cout << "Fp.size: " << Fp.size << std::endl;
// -> OK
// Fp elements should be complx
std::cout << "Fp.type(): " << Fp.type() << std::endl;
// -> Lots of zero at the end!!! -> With cv::DFT_REAL_OUTPUT there are no zeros
cv::Mat nom, denom, W;
cv::mulSpectrums(Fp, Fp, nom, cv::DFT_ROWS, true);
cv::mulSpectrums(Fz, Fz, denom, cv::DFT_ROWS, true);
我声明 Fp
和 Fz
是两个通道,以便保存实数和复数值(cv::mulSpectrums
函数可以在其上运行)。但是 Fp.type()
结果是 6
,这意味着输出矩阵的类型是 CV_64FC1
。
对于标志,应使用 'or' 运算符,否则第二个将被放入错误的位置!
cv::dft(Pt.t(), Fp, cv::DFT_ROWS | cv::DFT_COMPLEX_OUTPUT);
cv::dft(Zt.t(), Fz, cv::DFT_ROWS | cv::DFT_COMPLEX_OUTPUT);
在这种情况下,输出会很复杂!