Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何像在Python numpy.FFT.rfft中那样在cv::dft中指定FFT长度_Python_C++_Numpy_Opencv_Fft - Fatal编程技术网

如何像在Python numpy.FFT.rfft中那样在cv::dft中指定FFT长度

如何像在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

我已经使用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_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版本相同的结果?


更新:

我尝试了以下解决方案:

  • 我将输入“窗口帧”的大小调整为fft长度(用零填充)
  • 对新输入执行cv::dft
  • 将输出调整为(fft_长度/2)+1

    std::向量t; 窗口帧。调整大小(fft长度); cv::dft(窗口帧,t); t、 调整大小((fft_长度/2)+1)

  • 结果是:

    [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]

    我无法使用您的解决方案获得相同的结果。正如我在文档中读到的,输出大小取决于cv::dft,因此在应用FFT之前调整t的大小是不起作用的。我还试图调整输入“window\u frame”的大小,但结果也不一样。@AnhVoNguyenNhat:很抱歉,错误的代码,应该调整输入的大小,正如我在文本中所写的那样。事实上,输出可能与NumPy产生的不完全相同,OpenCV有自己独特的格式……是的,我也这么认为。所以我调整了输入的大小并更新了帖子。谢谢您的评论。@AnhVoNguyenNhat:我编辑了答案,以解决您问题的最后一个补充内容。我希望这足够清楚。