2011-05-17 82 views
0

我想写一个简单的FFTW例程(版本2),我想我刚刚得到了骨头,但我遇到了一个持久性段错误,当我打电话fftwnd_one函数(我正在做一维变换,但为了模块化,我使用了n维代码)。但是,我相信我的问题在于创造计划。任何人都可以提供一些有关此代码有什么问题的见解?如果愿意,我将不胜感激 - 谢谢!FFTW Segfault(可能简单的答案)

作为参考,我在这里使用的函数是sin(x)。我意识到并非所有的数学运算都已经实现,我只是想先让FFTW2库工作,然后才能使数据有用。

#include <stdio.h> 
#include <fftw.h> 
#include <math.h> 
#include <complex.h> 

int main(){ 
    int i; 
    fftw_complex in[8]; 
    fftwnd_plan p; 
    const int *n; 
    int temp = (int)pow(2, 2)*pow(3,2)*pow(5,1)*pow(7,1)*pow(11,1)*pow(13,0); 
    n = &temp; 

    in[0].re = 0; 
    in[1].re = (sqrt(2)/2); 
    in[2].re = 1; 
    in[3].re = (sqrt(2)/2); 
    in[4].re = 0; 
    in[5].re = -(sqrt(2)/2); 
    in[6].re = -1; 
    in[7].re = -(sqrt(2)/2); 

    for(i = 0; i < 8; i++){ 
    (in[i]).im = 0; 
    } 

    p = fftwnd_create_plan(8, n, FFTW_FORWARD, FFTW_ESIMATE | FFTW_IN_PLACE); 
    fftwnd_one(p, &in[0], NULL); 
    fftwnd_destroy_plan(p); 

    printf("Sin\n"); 
    for(i = 0; i < 8; i++){ 
    printf("%d\n", n[i]); 
    } 
    return 0; 
} 

回答

1

前两个参数来fftwnd_create_plan看起来完全错误的。看起来你只是想为8码的1D FFT创建一个计划(如果你只需要一维FFT,这就引发了你为什么使用fftwnd_create_plan的问题)。电话应该是这样的:

const int n = 8; 
p = fftwnd_create_plan(1, // rank = 1, i.e. 1D 
         &n, // size of first (and only) dimension = n = 8 
         FFTW_FORWARD, 
         FFTW_ESIMATE | FFTW_IN_PLACE); 
+0

太棒了,谢谢!我使用fftwnd_create_plan的原因是因为这只是一种测试案例,为的是让我自己熟悉该软件。在我为这个简单的例子工作之后,我将会在图书馆进行一个更大的项目,所以我想使用n维函数,所以我会熟悉它们。现在我已经掌握了每个参数的具体含义,所以我希望能够继续下去。感谢您的帮助! – Patrick 2011-05-17 15:18:24

0

你似乎把n当作一个数组,当它只指向一个整数时。例如,不应该这样:

printf("%d\n", n[i]); 

是:

printf("%d\n", in[i]); 
+0

啊 - 这是真的,谢谢,但我不认为这是问题。我放入了一堆printf语句,并确定在调用fftwnd_one函数时发生段错误。我浏览过文档,我认为最可能的情况是我在创建计划时犯了一个错误,但我不确定。 – Patrick 2011-05-17 06:17:46

相关问题