win7 64位_VS2010的fftw3配置

配置过程参考了http://www.tuicool.com/articles/JbmINj,但是按照该篇博客,在我的机子上并没有成功。

下面叙述我的配置过程,仅供参考!

 

[1]下载FFTW库

http://www.fftw.org/install/windows.html官方下载地址。

我电脑装的是win7 64位系统。

image

下载后,解压如图image

[2]使用Lib.exe生成相应的Lib文件

这一步注意路径是C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\lib.exe.
不注意路径可能出现下述错误。

image

在cmd将路径设置到amd64\路径下,将libfftw3-3.def,libfftw3l-3.def,libfftw3f-3.def拷贝到该路径下,执行Lib命令,

64位版本:

lib /machine:x64 /def:libfftw3f-3.def

lib /machine:x64 /def:libfftw3-3.def

lib /machine:x64 /def:libfftw3l-3.def

生成库文件libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib。注意:如果在cmd中输入命令后出现下图的错误,

image

请重新以管理员身份打开cmd,重复上面的配置命令,即可解决该问题.

[3]将生成的库文件libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib放入vc中的lib文件夹,可惜这么做没有成功,程序编译没有通过,试着将这些3个静态库放在了lib/amd64/路径下,编译通过了。

把fftw3.h放入vc中的include文件夹,放置dll文件时,这里需要注意64bit系统,依旧放在windows/system32文件中,我是这么做的,因为我在vs2010中按照正常的步骤创建了Win32控制台应用程序,试了一次,放在SysWOW64,程序编译通过了,但是程序在运行时提示缺少动态库。

[4]新建工程应用:

    头文件:#include”fftw3.h“,

   设置参数:”项目“==>"项目属性"==>"配置属性"==>"链接器"==>"输入"==>"附加依赖项",将以下三项添加进去:

   libfftw3-3.lib

   libfftw3f-3.lib

   libfftw3l-3.lib

[5]程序运行,测例如下:

https://github.com/undees/fftw-example/blob/master/fftw_example.c

经过修改,8点fft,其结果和matlab fft结果验证一致,这里输出的是幅值,实部和虚部的模。

/* Start reading here */

#include "fftw3.h"

#define NUM_POINTS 8


/* Never mind this bit */

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

#define REAL 0
#define IMAG 1
//#define M_PI 3.14159265358979323846

void acquire_from_somewhere(fftw_complex* signal) {
    /* Generate two sine waves of different frequencies and
     * amplitudes.
     */

    int i;
    for (i = 0; i < NUM_POINTS; ++i) {
       // double theta = (double)i / (double)NUM_POINTS * M_PI;

        /*signal[i][REAL] = 1.0 * cos(10.0 * theta) +
                          0.5 * cos(25.0 * theta);

        signal[i][IMAG] = 1.0 * sin(10.0 * theta) +
                          0.5 * sin(25.0 * theta);*/
		signal[i][REAL] = (double)i;
		printf("start:[%d]=%f\n",i,signal[i][REAL]);
		signal[i][IMAG] = (double)0.0;
    }
}

void do_something_with(fftw_complex* result) {
    int i;
    for (i = 0; i < NUM_POINTS; ++i) {
        double mag = sqrt(result[i][REAL] * result[i][REAL] +
                          result[i][IMAG] * result[i][IMAG]);

        printf("%g\n", mag);
    }
}


/* Resume reading here */

int main() {
    fftw_complex signal[NUM_POINTS];
    fftw_complex result[NUM_POINTS];

    fftw_plan plan = fftw_plan_dft_1d(NUM_POINTS,
                                      signal,
                                      result,
                                      FFTW_FORWARD,
                                      FFTW_ESTIMATE);

    acquire_from_somewhere(signal);
    fftw_execute(plan);
    do_something_with(result);

    fftw_destroy_plan(plan);

    return 0;
}

image

posted @ 2015-10-28 17:52  benbenTang  阅读(750)  评论(0编辑  收藏  举报