Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用FFTW分割阵列时的分段错误_C_Split_Fftw - Fatal编程技术网

C 使用FFTW分割阵列时的分段错误

C 使用FFTW分割阵列时的分段错误,c,split,fftw,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 Pla

我想使用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;
}
typedef struct {
     int n;
     int is;
     int os;
} fftw_iodim;

我做了一些调试,似乎分段错误发生在执行行
fftw\u execute\u split\u dft(Plan、Xre、Xim、Yre、Yim)
。我读过这篇文章。但是,我仍然不知道这个错误背后的原因。

来自文档:

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
作为常量指针传递。因此,它需要使用数组的实际维度进行初始化(并且库不能仅通过传递指针来计算数组的大小)

结构如下:

#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;
}
typedef struct {
     int n;
     int is;
     int os;
} fftw_iodim;
这里,n是维度的大小,is和os是输入和输出数组在该维度上的步长。(步幅是沿此标注的连续元素的分隔。)

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

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

从文件中:

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
作为常量指针传递。因此,它需要使用数组的实际维度进行初始化(并且库不能仅通过传递指针来计算数组的大小)

结构如下:

#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;
}
typedef struct {
     int n;
     int is;
     int os;
} fftw_iodim;
这里,n是维度的大小,is和os是输入和输出数组在该维度上的步长。(步幅是沿此标注的连续元素的分隔。)

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

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

在哪里定义了
input\u data
?也不应该初始化
fftw\u iodim Dim
?因为fftw lib不能通过仅仅传递指针来知道数组的大小。它是在
defines.h
文件中定义的。我将编辑我的帖子来显示它。关于:
if(!(Plan=fftw\u Plan\u guru\u split\u dft(1,&Dim,0,NULL,Xre,Xim,Yre,Yim,fftw\u ESTIMATE))printf(“FFTW3无法创建计划”)1)创建“计划”失败时,错误消息应输出到
stderr
,而不是
stdout
。2) 失败后,不要尝试使用“计划”,而是释放所有内存分配,然后退出程序。即
perror(“FFTW3失败”);无fftw_(Xre);无fftw_(Xim);fftw_免费(Yre);fftw_free(Yim);退出(退出失败);}注意:
exit()
exit\u FAILURE
来自
stdlib.h
每行后面,如:
Xre=fftw\u malloc(sizeof(double)*N)
,始终检查(!=NULL)返回值以确保操作成功。在哪里定义了
input\u data
?也不应该初始化
fftw\u iodim
?因为fftw lib不能通过仅仅传递指针来知道数组的大小。它是在
defines.h
文件中定义的。我将编辑我的帖子来显示它。关于:
if(!(Plan=fftw\u Plan\u guru\u split\u dft(1,&Dim,0,NULL,Xre,Xim,Yre,Yim,fftw\u ESTIMATE))printf(“FFTW3无法创建计划”)1)创建“计划”失败时,错误消息应输出到
stderr
,而不是
stdout
。2) 失败后,不要尝试使用“计划”,而是释放所有内存分配,然后退出程序。即
perror(“FFTW3失败”);无fftw_(Xre);无fftw_(Xim);fftw_免费(Yre);fftw_free(Yim);退出(退出失败);}注意:
exit()
exit\u FAILURE
来自
stdlib.h
每行后面,如:
Xre=fftw\u malloc(sizeof(double)*N),始终检查(!=NULL)返回值以确保操作成功。