gpt4 book ai didi

c++ - FFT 和 IFFT 与 FFTW

转载 作者:太空狗 更新时间:2023-10-29 20:55:06 26 4
gpt4 key购买 nike

我正在尝试对 float 组执行 ifft 和 fft。然而,两者的结果是一样的。你有什么主意吗?为什么结果相同,即使我对其中一个使用 FFTW_FORWARD 而对另一个使用 FFTW_BACKWARD?

  int N=16;
fftwf_complex in[N], out[N];
fftwf_plan p1, q;

/* prepare a cosine wave */
for (i = 0; i < N; i++) {
in[i][0] = cos(3 * 2*M_PI*i/N);
in[i][1] = 0;
}

/* forward Fourier transform, save the result in 'out' */
p1 = fftwf_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
fftwf_execute(p1);
for (i = 0; i < N; i++)
cout << out[i][0] << endl;
fftwf_destroy_plan(p1);

printf("\nInverse transform:\n");
q = fftwf_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE);
fftwf_execute(q);
for (i = 0; i < N; i++)
cout << out[i][0] << endl;
fftwf_destroy_plan(q);

最佳答案

您只显示输出箱的实部,而忽略虚部。恰好实部匹配,但虚部不同(它们实际上是复共轭):

#include <iostream>
#include <cmath>
#include "fftw3.h"

using namespace std;

int main()
{
int N=16;
fftwf_complex in[N], out[N];
fftwf_plan p1, q;

for (int i = 0; i < N; i++) {
in[i][0] = cos(3 * 2*M_PI*i/N);
in[i][1] = 0;
}

p1 = fftwf_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
fftwf_execute(p1);
for (int i = 0; i < N; i++)
cout << out[i][0] << " + j" << out[i][1] << endl; // <<<
fftwf_destroy_plan(p1);

printf("\nInverse transform:\n");
q = fftwf_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE);
fftwf_execute(q);
for (int i = 0; i < N; i++)
cout << out[i][0] << " + j" << out[i][1] << endl; // <<<
fftwf_destroy_plan(q);

return 0;
}

编译运行:

$ g++ -Wall fftwf.cpp -lfftw3f && ./a.out

3.67394e-16 + j0
1.19209e-07 + j7.34788e-16
-3.67394e-16 + j0
8 + j-7.34788e-16
3.67394e-16 + j0
2.38419e-07 + j7.34788e-16
-3.67394e-16 + j0
1.19209e-07 + j-7.34788e-16
3.67394e-16 + j0
1.19209e-07 + j7.34788e-16
-3.67394e-16 + j0
2.38419e-07 + j-7.34788e-16
3.67394e-16 + j0
8 + j7.34788e-16
-3.67394e-16 + j0
1.19209e-07 + j-7.34788e-16

Inverse transform:
3.67394e-16 + j0
1.19209e-07 + j-7.34788e-16
-3.67394e-16 + j0
8 + j7.34788e-16
3.67394e-16 + j0
2.38419e-07 + j-7.34788e-16
-3.67394e-16 + j0
1.19209e-07 + j7.34788e-16
3.67394e-16 + j0
1.19209e-07 + j-7.34788e-16
-3.67394e-16 + j0
2.38419e-07 + j7.34788e-16
3.67394e-16 + j0
8 + j-7.34788e-16
-3.67394e-16 + j0
1.19209e-07 + j7.34788e-16

值得注意的是,FFT 和 IFFT 在数学上几乎相同。它们通常都作为单个例程实现,并带有指示方向(正向或反向)的标志。通常,此标志仅影响旋转因子的虚部的符号。

关于c++ - FFT 和 IFFT 与 FFTW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36913337/

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