码迷,mamicode.com
首页 > 其他好文 > 详细

FFTW的使用

时间:2015-06-29 10:05:10      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:fftw

FFTW首页:http://www.fftw.org/

据说FFTW是世界上最快的FFT。


一、Windows安装FFTW
  1. 从网址http://www.fftw.org/install/windows.html 上获得FFTW的windows dll预编译版本;
  2. 解压缩文件,打开windows命令行窗口,就是那个cmd窗口。然后把当前目录转换到你解压缩文件的目录下。
  3. 执行以下3个指令
        这里的def可以加路径 def:D:\fftw\libfftw3-3.def 这样。
               lib/machine:ix86/def:libfftw3-3.def
               lib/machine:ix86/def:libfftw3f-3.def
               lib/machine:ix86/def:libfftw3l-3.def
        这会在该目录下建三个相应的dll文件和lib文件

二、VS配置FFTW
  • 链接器  |  输入  |  附加依赖项    加入libfftw3-3.lib,libfftw3f-3.lib,libfftw3l-3.lib 
  • libfftw3-3.dll,libfftw3f-3.dll,libfftw3l-3.dll放在当前工程目录(或system32)或在vs属性中的Debugging  |  Environment 中添加路径(例:path=%path%;.\fftw\bin)
  • 记得include“fftw3.h”

     测试demo

#include "fftw3.h"
#include <stdio.h>
#define N 8
int main()
{
	int i;
	fftw_complex *din,*out;
	fftw_plan p;
	din  = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
	out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
	if((din==NULL)||(out==NULL))
	{
		printf("Error:insufficient available memory\n");
	}
	else
	{
		for(i=0; i<N; i++)/*测试数据*/
		{
			din[i][0] = i+1;
			din[i][1] = 0;
		}
	}
	p = fftw_plan_dft_1d(N, din, out, FFTW_FORWARD,FFTW_ESTIMATE);
	fftw_execute(p); /* repeat as needed */
	fftw_destroy_plan(p);
	fftw_cleanup();
	for(i=0;i<N;i++)/*OUTPUT*/
	{
		printf("%f,%fi\n",din[i][0],din[i][1]);
	}
	printf("\n");
	for(i=0;i<N;i++)/*OUTPUT*/
	{
		printf("%f,%fi\n",out[i][0],out[i][1]);
	}

	if(din!=NULL) fftw_free(din);
	if(out!=NULL) fftw_free(out);
	getchar();
	return 0;
}
结果输出如下:

技术分享


三、对图像做FFT的demo
IplImage *img1 = 0;
IplImage *img2 = 0;
uchar *img1_data;
uchar *img2_data;

fftw_complex *data_in;
fftw_complex *fft;
fftw_complex *ifft;
fftw_plan plan_f;
fftw_plan plan_b;

int width, height, step;
int i, j, k;

/* load original image */
img1 = cvLoadImage("lena.bmp", CV_LOAD_IMAGE_GRAYSCALE);
if (img1 == 0)
{
	std::cout << "cannot load file" << std::endl;
	return 0;
}

/* create new image for IFFT result */
img2 = cvCreateImage(cvSize(img1->width, img1->height), IPL_DEPTH_8U, 1);

/* get image properties */
width = img1->width;
height = img1->height;
step = img1->widthStep;
img1_data = (uchar *)img1->imageData;
img2_data = (uchar *)img2->imageData;

/* initialize arrays for fftw operations */
data_in = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * width * height);
fft = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * width * height);
ifft = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * width * height);

/* create plans */
plan_f = fftw_plan_dft_1d(width * height, data_in, fft, FFTW_FORWARD, FFTW_ESTIMATE);
plan_b = fftw_plan_dft_1d(width * height, fft, ifft, FFTW_BACKWARD, FFTW_ESTIMATE);

/* load img1's data to fftw input */
for (i = 0, k = 0; i < height; ++i)
{
	for (j = 0; j < width; ++j)
	{
		data_in[k][0] = (double)img1_data[i * step + j];
		data_in[k][1] = 0.0;
		k++;
	}
}

/* perform FFT */
fftw_execute(plan_f);

/* perform IFFT */
fftw_execute(plan_b);

/* normalize IFFT result */
for (i = 0; i < width * height; ++i)
{
	ifft[i][0] /= (double)(width * height);
}

/* copy IFFT result to img2's data */
for (i = 0, k = 0; i < height; ++i)
{
	for (j = 0; j < width; ++j)
	{
		img2_data[i * step + j] = (uchar)ifft[k++][0];
	}
}

/* display images */
cvNamedWindow("original_image", CV_WINDOW_AUTOSIZE);
cvNamedWindow("IFFT", CV_WINDOW_AUTOSIZE);
cvShowImage("original_image", img1);
cvShowImage("IFFT", img2);

cvWaitKey(0);

/* free memory */
cvDestroyWindow("original_image");
cvDestroyWindow("IFFT");
cvReleaseImage(&img1);
cvReleaseImage(&img2);
fftw_destroy_plan(plan_f);
fftw_destroy_plan(plan_b);
fftw_free(data_in);
fftw_free(fft);
fftw_free(ifft);

参考资料:
[1] FFTW_Documentation_CN[百度文库]



FFTW的使用

标签:fftw

原文地址:http://blog.csdn.net/cyh706510441/article/details/46676123

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!