gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:26:58 25 4
gpt4 key购买 nike

我已经使用 numpy.fft.rfft() 在 python 中成功地进行了 FFT。现在,我想将此代码移植到 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_length/2)+1。

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

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

结果是:

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

如何获得与 Python 版本相同的结果?


更新:

我尝试了以下解决方案:

  1. 我将输入“window_frame”的大小调整为 fft_length(用零填充)
  2. 对新输入执行 cv::dft
  3. 将输出调整为 (fft_length/2) + 1

    std::vector t;window_frame.resize(fft_length);cv::dft(window_frame, t);t.resize((fft_length/2)+1);

结果是:

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

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

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

现在,如何对这些数据执行 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 个实数值。 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]

关于python - 如何像在 Python numpy.fft.rfft 中那样在 cv::dft 中指定 FFT 长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54323991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com