使用FFTW分离阵列时出现分段错误

时间:2017-07-10 11:54:10

标签: c split fftw

我想使用FFTW分割数据并查看其性能。所以,我根据我在互联网上找到的一些例子写了这个简单的程序。

代码如下:

#include <stdlib.h>
#include "defines.h"
#include <math.h>
#include <fftw3.h>

int main(void)
{ 
  double *Xre, *Xim, *Yre, *Yim;
  int N = 4096;
  int i =0, j=0;
  fftw_plan Plan;
  fftw_iodim Dim;

  Xre =  fftw_malloc(sizeof(double) * N);
  Xim =  fftw_malloc(sizeof(double) * N);
  Yre =  fftw_malloc(sizeof(double) * N);
  Yim =  fftw_malloc(sizeof(double) * N);

  for (i = 0; i < N; i++)
  {
    Xre[i] = input_data[2*i];
    Xim[i] = input_data[2*i+1];
  }
  if(!(Plan = fftw_plan_guru_split_dft(1, &Dim, 0, NULL,Xre, Xim, Yre, Yim, FFTW_ESTIMATE)))
    printf("FFTW3 failed to create plan.");

  fftw_execute_split_dft(Plan, Xre, Xim, Yre, Yim);

  printf("RESULTS:\n\n");
  for (j = 0; j < N; j++)
  {
    printf("RE: %f,\tIM: %f \n", Yre[j], Yim[j]);
  }
  fftw_destroy_plan(Plan);
  fftw_free(Xre);
  fftw_free(Xim);
  fftw_free(Yre);
  fftw_free(Yim);
  return 0;
}

其中Xre和Xim指的是实数和虚数的输入,而Yre,Yim用于结果。在input_data文件中声明的defines.h si如下:

float input_data[8192] ={
-7.418860e-02,  1.188460e-03 ,  -1.612460e-02 ,  -7.506560e-02,
 7.372410e-02, -3.039230e-02 ,   4.457970e-02 ,   6.862750e-02,
-6.164490e-02,  5.634830e-02 ,  -6.556000e-02 ,  -5.147360e-02,
...          , ...           ,  ...           ,  ...           }            

我做了一些调试,似乎在执行行fftw_execute_split_dft(Plan, Xre, Xim, Yre, Yim)中发生了分段错误。我已经阅读了这篇文章fftw split example crashes。但是,我仍然不明白这个错误背后的原因。

1 个答案:

答案 0 :(得分:3)

来自文档:

fftw_plan fftw_plan_guru_split_dft(
     int rank, const fftw_iodim *dims,
     int howmany_rank, const fftw_iodim *howmany_dims,
     double *ri, double *ii, double *ro, double *io,
     unsigned flags);

您会看到dims作为常量指针传递。因此需要使用数组的实际维度进行初始化(并且只能通过传递指针,库无法从数组中计算大小)

结构如下:

typedef struct {
     int n;
     int is;
     int os;
} fftw_iodim;
  

这里,n是维度的大小,而os和os是输入和输出数组的维度的跨度。 (步幅是沿着这个维度分离连续元素。)

因此,您的计划使用随机数组大小进行了不正确的初始化。在创建计划之前,我会按照以下进行初始化:

Dim.n = N;
Dim.is = 1;
Dim.os = 1;