我想使用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。但是,我仍然不明白这个错误背后的原因。
答案 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;