【发布时间】:2023-03-28 08:26:01
【问题描述】:
我有用 python 编写的代码。它使用 numpy 计算实际输入的 FFT 的正部分。我需要将此代码移植到 C++。
import numpy as np
interp=[131.107, 133.089, 132.199, 129.905, 132.977]
res=np.fft.rfft(interp)
print res
rfft 的结果是 [ 659.27700000+0.j, 1.27932533-1.4548977j, -3.15032533+2.1158917j]
我尝试使用 OpenCV 进行 1D DFT:
std::vector<double> fft;
std::vector<double> interpolated = {131.107, 133.089, 132.199, 129.905, 132.977};
cv::dft( interpolated, fft );
for( auto it = fft.begin(); it != fft.end(); ++it ) {
std::cout << *it << ' ';
}
std::cout << std::endl;
cv::dft 的结果是 {1.42109e-14, -127.718, -94.705, 6.26856, 23.0231}。它与 numpy.fft.rfft 有很大不同。在计算 OpenCV 的 dft 之后,所有输入的 DC 值(零元素)接近于零,这看起来很奇怪。
使用 FFTW3 库给我的结果与 OpenCV 的结果相同:
std::vector<double> interpolated = {131.107, 133.089, 132.199, 129.905, 132.977};
fftw_complex* out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * 3 );
fftw_plan plan = fftw_plan_dft_r2c_1d( interpolated.size( ), interpolated.data( ), out, FFTW_ESTIMATE );
fftw_execute(plan);
fftw_destroy_plan(plan);
for( size_t i = 0; i < interpolated.size( ); ++i ) {
std::cout << " (" << out[ i ][ 0 ] << ", " << out[ i ][ 1 ] << ")";
}
fftw_free(out);
这段代码给了我与 OpenCV 相同的结果。它打印:(1.42109e-14, 0) (-127.718, -94.705) (6.26856, 23.0231)。
为什么我在 C++ 和 python 中得到不同的 dft 结果?我做错了什么?
谢谢!
【问题讨论】:
-
我在python中试过
cv2,import cv2;cv2.dft(interp)和numpy的结果一样。