用C++在傅立叶空间中衍生

发布于 2025-01-23 19:37:47 字数 1820 浏览 2 评论 0原文

我有一个正弦波,我想转变为傅立叶空间。然后在傅立叶空间中取衍生物。然后将我的数据重新转换为真实空间。最后的阵列应该给我余弦。我从fftw.org使用了fft库。

我在第79行上遇到了3个错误:

E0137表达式必须是可修改的lvalue consoleapplication2 e2138表达必须具有算术或未上的枚举C型C 错误C2296'*':非法,左操作数具有'fftw_complex'

第79行的类型:

result2[l] = result1[l] * kappa[l] * sqrt(-1);

这是我的整个代码:

    #include <fftw3.h>

    #define N 64

    #define L 30

   int i;

   int j;

   int k;

    enter code here

   int l;

   #include <stdio.h>
   #include <math.h>

   #define REAL 0
   #define IMAG 1


   void acquire_from_somewhere(fftw_complex* signal) {  
       for (i = 0; i < N; ++i) {
           double x = (double)L / (double)N * (double) i - (double)L / 2;

           signal[i][REAL] = sin(x);

       }
   }

   void do_something_with(fftw_complex* result2) {
    
    for (j = 0; j < N; ++j) {
        double df = result2[j][REAL];

        printf("%g\n", df);
    }
  }

   int main() { 

    double kappa[N];

    fftw_complex fhat[N];

    fftw_complex dfhat[N];

    fftw_complex signal[N];

    fftw_complex result1[N];

    fftw_complex result2[N];

    fftw_plan plan1 = fftw_plan_dft_1d(N,
        signal,
        result1,
        FFTW_FORWARD,
        FFTW_ESTIMATE);
    fftw_plan plan2 = fftw_plan_dft_1d(N,
        dfhat,
        result2,
        FFTW_BACKWARD,
        FFTW_ESTIMATE);
    acquire_from_somewhere(signal);

    fftw_execute(plan1);

    for (k = -N; -N / 2 < k && N / 2 > k; ++k) {

        kappa[k] = 2 * 3.14159265358979323846 * k / L;
        
    }
    
    for (l = 0; l < N; ++l) {
      result2[l] = result1[l] * kappa[l] * sqrt(-1);
    }

    fftw_execute(plan2);
    do_something_with(result2);

    fftw_destroy_plan(plan1);
    fftw_destroy_plan(plan2);

    return 0;
   }

I have a sine wave which I would like to transform into Fourier space. Then take derivative in Fourier space. Then transform my data back into real space. The final array should give me a cosine wave. I have used FFT library from FFTW.org.

I'm getting 3 errors on line 79 which are:

E0137 expression must be a modifiable lvalue ConsoleApplication2
E2138 expression must have arithmetic or unscoped enum type C
Error C2296 '*': illegal, left operand has type 'fftw_complex'

Line 79 is:

result2[l] = result1[l] * kappa[l] * sqrt(-1);

Here is my entire code:

    #include <fftw3.h>

    #define N 64

    #define L 30

   int i;

   int j;

   int k;

    enter code here

   int l;

   #include <stdio.h>
   #include <math.h>

   #define REAL 0
   #define IMAG 1


   void acquire_from_somewhere(fftw_complex* signal) {  
       for (i = 0; i < N; ++i) {
           double x = (double)L / (double)N * (double) i - (double)L / 2;

           signal[i][REAL] = sin(x);

       }
   }

   void do_something_with(fftw_complex* result2) {
    
    for (j = 0; j < N; ++j) {
        double df = result2[j][REAL];

        printf("%g\n", df);
    }
  }

   int main() { 

    double kappa[N];

    fftw_complex fhat[N];

    fftw_complex dfhat[N];

    fftw_complex signal[N];

    fftw_complex result1[N];

    fftw_complex result2[N];

    fftw_plan plan1 = fftw_plan_dft_1d(N,
        signal,
        result1,
        FFTW_FORWARD,
        FFTW_ESTIMATE);
    fftw_plan plan2 = fftw_plan_dft_1d(N,
        dfhat,
        result2,
        FFTW_BACKWARD,
        FFTW_ESTIMATE);
    acquire_from_somewhere(signal);

    fftw_execute(plan1);

    for (k = -N; -N / 2 < k && N / 2 > k; ++k) {

        kappa[k] = 2 * 3.14159265358979323846 * k / L;
        
    }
    
    for (l = 0; l < N; ++l) {
      result2[l] = result1[l] * kappa[l] * sqrt(-1);
    }

    fftw_execute(plan2);
    do_something_with(result2);

    fftw_destroy_plan(plan1);
    fftw_destroy_plan(plan2);

    return 0;
   }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浮生未歇 2025-01-30 19:37:47

您要查找的答案是您的错误消息。您正在尝试将类型fftw_complex的元素与类型double相乘。

根据FFTW的网站,fftw_complex被定义为:
typedef double fftw_complex [2];

这意味着fftw_complex是2个元素的数组double

如果您只是想将这个复杂的数字乘以标量,我将把result1 [i] < / code>视为2D向量,然后将x / y组件乘以kappa [i]result1 [i] [0] * Kappa [i]用于X组件)。

顺便说一句,不要将小写L作为变量。这是通往未来头痛的快速道路。

The answer you're looking for is in your error message. You're trying to multiply an element of type fftw_complex with type double.

According to FFTW's website, fftw_complex is defined like so:
typedef double fftw_complex[2];

This means fftw_complex is an array of 2 elements of type double.

If you're just trying to multiply this complex number with a scalar, I'd treat result1[i] as a 2D vector, and multiply the x / y components by kappa[i] (result1[i][0] * kappa[i] for x component).

As an aside, don't use lowercase L as a variable. That's a quick road to future headaches.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文