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

2024-04-25 08:24:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经成功地在python中使用numpy.fft.rfft格式(). 现在,我想把这个代码移植到C++。你知道吗

在研究了这个主题How can I port code that uses numpy.fft.rfft from python to C++?之后,我能够使用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.] 

长度为(fft\u length/2)+1。你知道吗

在C++中,我执行以下代码:

std::vector<double> t;
cv::dft(window_frame, t)

结果是:

[10. -2., 2., -2.]

如何实现与Python版本相同的结果?


更新时间:

我尝试了以下解决方案:

  1. 我将输入“window\u frame”的大小调整为fft\u长度(用零填充)
  2. 对新输入执行cv::dft
  3. 将输出调整为(fft\u length/2)+1

    std::向量t; 窗口_框架.调整大小(U长度); cv::dft(窗框,t); t、 调整大小((fft_length/2)+1);

结果是:

[10 2.30902 -7.83297 -4.04508 -1.31433 1.19098 2.21238 1.54508 -2.12663 -2]

应用时与Python版本相同np.fft.rfft格式()

[10 + 0j, 2.309 - 7.832j, -4.045 - 1.3143j, 1.19098 + 2.212j, 1.54508 -2.126j, -2 + 0j]

现在,我该怎么做呢np.abs公司关于这些数据?第一个和最后一个元素只有真实的部分吗?你知道吗


Tags: 代码fft版本numpy主题格式npabs
1条回答
网友
1楼 · 发布于 2024-04-25 08:24:20

在Python代码中设置FFT长度时,在应用FFT算法之前,输入信号将被截断或用0填充到请求的长度。你知道吗

在C++中,你可以做,例如,

windows_frame.resize(fft_length, 0);
cv::dft(windows_frame, t);

OpenCV有自己独特的表示实值频域的方法,它不同于NumPy产生的方法。NumPy输出N/2+1复数值(注意!使用整数除法)。OpenCV输出N个实值。Read the docs了解如何解释cv::dft的输出以获得实值输入和输出。简而言之,第一个数组元素对应于零频率分量(总是实值),随后的数组元素对应于频谱的前半部分的实部和虚部。对于偶数大小的数组,最后一个数组元素对应于频率分量N/2(总是实值)。对于奇数大小的阵列,频率分量N/2也很复杂,并且它的两个分量都存在(尽管文档中没有明确说明)。你知道吗

  • 偶数大小:[r0, r1, i1, r2, i2, ... rN/2]
  • 奇数大小:[r0, r1, i1, r2, i2, ... rN/2 iN/2]

相关问题 更多 >