fftw_plan_dft_2d重复优化

原文:http://bbs.csdn.net/topics/330133751


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include "fftw3.h"

#define NNx 1025
#define NNy 1025
// ================= Main ================= //
int main(int argc, char *argv[])
{
    fftw_complex *in, *out, *in2;
    fftw_plan p,q;
    clock_t start, end;
    int i=0, j=0, k=0;
    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) *NNx*NNy );
    in2 = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) *NNx*NNy );
    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) *NNx*NNy );

    for(  i=0; i < NNx*NNy; i++)
    {
        in[i][0] = i;
        in[i][1] = 0.0;
    }

    start=clock();
    for( k=0; k<100; k++)
    {
    p=fftw_plan_dft_2d( NNx, NNy, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
    q=fftw_plan_dft_2d( NNx, NNy, out, in2, FFTW_BACKWARD, FFTW_ESTIMATE);
    fftw_execute( p ); // repeat as needed//
    fftw_execute( q );
    }
    end=clock();
    printf(" FFTW : %f second\n", (double)  (end-start)/CLOCKS_PER_SEC  );

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

 system("PAUSE");
 return 0;

}

建议优化:


 // 这里初始化plan可能要花费几秒钟

     p=fftw_plan_dft_2d( NNx, NNy, in, out, FFTW_FORWARD, FFTW_MEASURE); 
     q=fftw_plan_dft_2d( NNx, NNy, out, in2, FFTW_BACKWARD, FFTW_MEASURE);
 
     for (  i=0; i < NNx*NNy; i++) 
    
         in[i][0] = i;
         in[i][1] = 0.0;
    
 
     // 以下执行部分将获得最佳性能
     start= clock (); 
     for ( k=0; k <100; k++) 
    
     fftw_execute_dft( p, in, out ); 
     fftw_execute_dft( q, out, in2 ); 
     }
     end =  clock ();

备注:

如果in和out指针相同为原位运算,否则为非原位运算。

sign可以为正变换FFTW_FORWARD(-1),也可以为逆变换FFTW_BACKWORD(+1),实际上就是变换公式中指数项的符号。需注意FFTW的逆变换没有除以N,即数据正变换再反变换后是原始数据的N倍。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: fftw_plan_dft_1d是一个用于计算一维离散傅立叶变换(DFT)的函数,它是FFTW库提供的一部分。它的函数原型为: ``` fftw_plan fftw_plan_dft_1d(int n, fftw_complex *in, fftw_complex *out, int sign, unsigned flags); ``` 其中,n表示输入序列的长度,in和out分别是输入和输出序列的指针,sign表示正向(1)或反向(-1)变换,flags是一组标志,用于控制变换的行为。该函数返回一个表示计划的fftw_plan对象,可以在之后的计算中重复使用。 使用fftw_plan_dft_1d函数进行DFT计算的一般流程是: 1. 创建输入序列in和输出序列out,并初始化它们的值。 2. 调用fftw_plan_dft_1d函数创建计划。 3. 调用fftw_execute函数执行计算。 4. 使用输出序列out进行后续处理。 5. 调用fftw_destroy_plan函数销毁计划。 6. 释放输入序列in和输出序列out的内存。 需要注意的是,FFTW库还提供了许多其他函数和数据类型,用于支持不同的DFT计算和优化。具体使用方法可以参考FFTW库的官方文档。 ### 回答2: fftw_plan_dft_1d是一个用于创建一维离散傅里叶变换(DFT)计划的函数。 DFT是一种将信号从时域转换到频域的数学变换方法,可以用于信号处理、图像处理、音频处理等领域。 fftw_plan_dft_1d函数的原型如下: ```C fftw_plan fftw_plan_dft_1d(int n, fftw_complex *in, fftw_complex *out, int sign, unsigned flags); ``` 该函数有四个参数: - n:表示信号的长度。 - in:输入信号的指针,类型为fftw_complex,它是一个复数数组。 - out:输出信号的指针,类型为fftw_complex,也是一个复数数组。 - sign:表示进行正向变换(+1)还是逆向变换(-1)。 - flags:表示一些额外的选项,可以是FFTW_ESTIMATE、FFTW_MEASURE或FFTW_PATIENT。 使用fftw_plan_dft_1d函数,我们可以创建一个计划(plan)对象,该对象描述了如何执行一维DFT变换。然后,我们可以调用fftw_execute函数来执行该计划,将输入信号转换为输出信号。 下面是一个简单的示例代码: ```C #include <fftw3.h> int main() { int n = 10; fftw_complex in[n]; fftw_complex out[n]; // 创建计划 fftw_plan plan = fftw_plan_dft_1d(n, in, out, FFTW_FORWARD, FFTW_ESTIMATE); // 执行计划 fftw_execute(plan); // 释放计划 fftw_destroy_plan(plan); return 0; } ``` 这段代码创建了一个长度为10的输入信号数组in和输出信号数组out。然后,它创建了一个正向DFT变换的计划,并执行该计划。最后,通过调用fftw_destroy_plan函数来释放计划对象。 fftw_plan_dft_1d函数是FFTW库中用于一维DFT计划创建的重要函数之一。通过合理使用该函数,我们可以在信号处理中高效地进行频域转换。 ### 回答3: fftw_plan_dft_1d是一个用于计算一维离散傅里叶变换(DFT)的函数。DFT是一种将一个时域的离散信号转换为频域的方法。该函数通过调用FFTW库中的算法来计算DFTfftw_plan_dft_1d的参数包括输入信号的长度、输入信号的数据类型、输出信号的数据类型以及变换的方向(正向或逆向)。该函数将返回一个fftw_plan对象,这个对象是一个描述已设定的DFT计算的计划。 通过创建一个fftw_plan对象,可以在之后的代码中重复使用该计划,从而提高计算效率。fftw_plan对象可以通过fftw_execute函数来执行DFT计算,将输入信号转换为对应的输出信号。 在使用fftw_plan_dft_1d时需要注意两点。首先,需要在使用完fftw_plan对象后使用fftw_destroy_plan函数来销毁计划,以释放内存资源。其次,输入和输出的信号长度应该相等,否则会导致错误结果。 总而言之,fftw_plan_dft_1d是一个用于计算一维DFT的函数,通过创建和执行fftw_plan对象来进行信号变换。使用该函数可以方便地计算离散傅里叶变换,从而在信号处理和频谱分析等领域进行相关计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值