如何像在Python numpy.FFT.rfft中那样在cv::dft中指定FFT长度
我已经使用numpy.FFT.rfft()在python中成功地完成了FFT。现在,我想把这个代码移植到C++。p> 在研究了这个主题之后,我能够使用cv::dft进行FFT。但是,问题是,对于numpy.fft.rfft(),还有一个额外的参数,即fft长度,我在cv中找不到它 我的Python代码如下所示:如何像在Python numpy.FFT.rfft中那样在cv::dft中指定FFT长度,python,c++,numpy,opencv,fft,Python,C++,Numpy,Opencv,Fft,我已经使用numpy.FFT.rfft()在python中成功地完成了FFT。现在,我想把这个代码移植到C++。p> 在研究了这个主题之后,我能够使用cv::dft进行FFT。但是,问题是,对于numpy.fft.rfft(),还有一个额外的参数,即fft长度,我在cv中找不到它 我的Python代码如下所示: window_frame = np.array([1,2,3,4]) fft_length = 10 np.abs(np.fft.rfft(window_frame, int(fft_l
window_frame = np.array([1,2,3,4])
fft_length = 10
np.abs(np.fft.rfft(window_frame, int(fft_length)))
结果是:
[10. , 8.16620583 , 4.25325404, 2.51258479 , 2.62865556 , 2.]
[10. -2., 2., -2.]
[10 2.30902 -7.83297 -4.04508 -1.31433 1.19098 2.21238 1.54508 -2.12663 -2]
长度为(fft_长度/2)+1
在C++中,我执行以下代码:
std::vector<double> t;
cv::dft(window_frame, t)
如何实现与Python版本相同的结果?
更新: 我尝试了以下解决方案:
[10. , 8.16620583 , 4.25325404, 2.51258479 , 2.62865556 , 2.]
[10. -2., 2., -2.]
[10 2.30902 -7.83297 -4.04508 -1.31433 1.19098 2.21238 1.54508 -2.12663 -2]
这与在Python版本中应用np.fft.rfft()时相同
现在,如何对这些数据执行np.abs?第一个和最后一个元素是否只有实部?在Python代码中设置FFT长度时,在应用FFT算法之前,输入信号将被截断或用0填充到请求的长度 在C++中,你可以做,例如,
windows_frame.resize(fft_length, 0);
cv::dft(windows_frame, t);
OpenCV有自己独特的表示实值频域的方式,它不同于NumPy产生的方式。NumPy输出N/2+1个复数值(注意!这使用整数除法)。OpenCV输出N个实际值。了解如何为实值输入和输出解释cv::dft
的输出。简言之,第一个阵列元素对应于零频率分量(始终为实值),后续阵列元素对应于频谱前半部分的实部和虚部。对于偶数大小的数组,最后一个数组元素对应于频率分量N/2(始终为实值)。对于奇数大小的阵列,频率分量N/2也很复杂,并且它的两个分量都存在(尽管文档中没有明确说明)
- 偶数大小:
[r0,r1,i1,r2,i2,…rN/2]
- 奇数大小:
[r0,r1,i1,r2,i2,…rN/2英寸/2]