首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFTW结果为零

FFTW结果为零
EN

Stack Overflow用户
提问于 2012-03-02 23:43:26
回答 2查看 1.1K关注 0票数 1

我正在尝试让FFTW在C中工作,它曾经在另一个项目中工作(在JNI中),我或多或少地复制了那个项目的代码,遗憾的是没有结果。

首先,我生成一个正弦信号,如下所示:

代码语言:javascript
复制
double* generateSignal() {
    int fs=44100;
    double fsd = 44100.0; // fs in double format
    double f1=1000.0;
    int i;
    double PI = 3.141592653589793238462643;

    double t[fs];
    double value = 0.0;
    for (i = 0; i < fs; i++) {
        t[i] = value;
        value += 1.0/fsd;
    }

    double* signal = (double*) malloc(sizeof(double) * fs);
    for (i = 0; i < fs; i++) {
        signal[i] = sqrt(2) * sin(2 * PI * f1 * t[i]);
    }

    return signal;
}    

这是可行的,我只是为了完整而张贴它。

接下来,我想使用FFTW转换信号,我使用以下方法(基于FFTW documentation)进行转换:

代码语言:javascript
复制
void processSignal(double* signal) {
    int size = 44100;
    int i;

    fftw_complex* in = fftw_malloc(sizeof(fftw_complex) * size);
    fftw_complex* out = fftw_malloc(sizeof(fftw_complex) * size);

    for (i = 0; i < size; i++) {
        double* ptr = in[i];
        *ptr = signal[i];       // set first double, real part
        *(ptr + 1) = 0.0;       // set second double, imaginary part
    }

    fftw_plan p = fftw_plan_dft_1d(size, in, out, FFTW_FORWARD, FFTW_ESTIMATE); 
    fftw_execute(p);

    for (i = 0; i < size; i++) {
        double* ptr = out[i];
        signal[i] = *ptr;       // get real part
    }

    fftw_destroy_plan(p);
    fftw_free(in);
    fftw_free(out);
}

请注意FFTW文档中的这一点:typedef double fftw_complex[2];

现在,这将导致signal-array的所有值均为-0.000000。我真的看不出这段代码有什么问题,所以有人能指出我做错了什么吗?

谢谢。

PS:为了清晰起见,我在代码中去掉了print-statements。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-03 19:11:51

天啊,这太愚蠢了。

这些值的大小类似于-2.0E-9。结果是四舍五入的,因此打印了-0.00000。

非常感谢弗雷德。他的问题是“你的预期产出是多少?”使我很好地查看了我之前提到的JNI-project的输出,并认识到我的错误。

也感谢你的其他答案!

票数 0
EN

Stack Overflow用户

发布于 2012-03-03 08:24:44

我认为问题可能是您用当前迭代的真实部分覆盖了上一次迭代的虚构部分。

代码语言:javascript
复制
for (i = 0; i < size; i++) {
        double* ptr = in[i];    //  <-- here's a problem
        *ptr = signal[i];       // set first double, real part
        *(ptr + 1) = 0.0;       // set second double, imaginary part
    }

i在每次迭代中逐一递增,因此在第一次迭代中,ptr指向输入复数的实部,ptr + 1指向复数的虚部,但在第二次迭代中,ptr指向复数的虚部,ptr + 1指向复数number1的实部。

解决此问题的一些建议可能是:

代码语言:javascript
复制
for (i = 0, j = 0; i < size; i++, j+= 2) {
    double* ptr = in[j];    // j increments by 2 making ptr alays point to real part 
    *ptr = signal[i];       // set first double, real part
    *(ptr + 1) = 0.0;       // set second double, imaginary part
}

代码语言:javascript
复制
double* ptr = in[0]
for (i = 0; i < size; i++) {
        *ptr++ = signal[i]; // set first double, real part
        *ptr++ = 0.0;       // set second double, imaginary part
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9536124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档