【问题标题】:FFTW3 2D, passing fftw_complex arrayFFTW3 2D,传递 fftw_complex 数组
【发布时间】:2018-08-27 10:29:24
【问题描述】:

我正在尝试实现here 中的方向来计算二维傅里叶变换:

#include <stdio.h>
#include <stdlib.h>
#include </usr/local/include/fftw3.h>
#include <math.h>

#define NUM_POINTS 600

#define REAL 0
#define IMAG 1

void acquire_from_somewhere(fftw_complex *signal) {

    int i, j, m_gamma=2, Lambda=1;
    double theta=0.095,kappa=5.;
    for (i = 0; i < NUM_POINTS; ++i) {
    for (j = 0; j < NUM_POINTS; ++j) {
    double x = (double)i / (double)NUM_POINTS * M_PI, y = (double)j / (double)NUM_POINTS * M_PI;

    signal[i][j][REAL] = Lambda*cos(theta/2)*cos(theta/2)*cos(m_gamma * atan(y/x));

    signal[i][j][IMAG] =0.;
    }}
}

void do_something_with(fftw_complex *result, double *mag) {
    int i,j;
    for (i = 0; i < NUM_POINTS; ++i) {
    for (j = 0; j < NUM_POINTS; ++j) {
        *mag = sqrt(result[i][j][REAL] * result[i][j][REAL] + result[i][j][IMAG] * result[i][j][IMAG]);

        printf("%g\n", *mag);
    }}
}


/* Resume reading here */

int main() {

    double mag;
    fftw_complex signal[NUM_POINTS][NUM_POINTS];
    fftw_complex result[NUM_POINTS][NUM_POINTS];

    fftw_plan plan = fftw_plan_dft_2d(NUM_POINTS,NUM_POINTS,
                                  &signal[0][0],
                                  &result[0][0],
                                  FFTW_FORWARD,
                                  FFTW_ESTIMATE);

    acquire_from_somewhere(&signal[0][0]);
    fftw_execute(plan);
    do_something_with(&result[0][0], &mag);

//    printf("%g\n", mag);

        fftw_destroy_plan(plan);

        return 0;
}

我收到以下类型的错误:

FFT.c:26:21: error: subscripted value is not an array, pointer, or vector
    signal[i][j][REAL] = Lambda*cos(theta/2)*cos(theta/2)*cos(m_gamma * atan(y/x));//Lambda*(cos(theta/2)*cos(theta/2)*cos(m_gamm...
    ~~~~~~~~~~~~^~~~~

我不知道去哪里看...我想,传递二维数组的传统方式不适用于 fftw_complex。如何解决我的错误?

【问题讨论】:

    标签: c error-handling syntax-error fft fftw


    【解决方案1】:
    fftw_complex *signal
    

    表示正在传递一个指向fftw_complex 的指针,可能是一个衰减的一维数组。

    3D 数组衰减为指向 2D 数组的指针。所以你应该把这个论点写成

    fftw_complex (*signal)[][]
    

    同样在您的问题中,您谈论的是 2D 数组,但将 signal 视为 3D 数组,不一致。

    【讨论】:

    • 谢谢!根据手册 fftw_complex [size][size] 是 2D,第三个隐含维度 [1]-imaginary 和 [0]-real。如果我说 3D,可能有人会想到 fftw_complex [size][size][size] 的情况……我遵循手册定义。
    • 这样我得到:错误:数组的元素类型不完整 'fftw_complex []' void acquire_from_somewhere(fftw_complex (*signal)[][])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2010-11-19
    • 2021-04-21
    • 2012-06-10
    • 2014-04-20
    相关资源
    最近更新 更多