C 使用FFTW分割阵列时的分段错误
我想使用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
#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)返回值以确保操作成功。