ZH ·
🌏 English

在 Visual Studio 2010 中配置 FFTW 3.3.2 快速傅里叶变换库

0. 前言

在进行信号处理或图像处理开发时,经常需要使用快速傅里叶变换(FFT)库。FFTW 是目前公认性能领先的开源实现。虽然网上有很多配置教程,但大多信息零散或不够完整。本文将整理在 Visual Studio 2010(VS2010)环境下配置 FFTW 3.3.2 的完整步骤。

路径约定:


1. 基本概念

1.1 FFTW 3.3.2

FFTW (Fastest Fourier Transform in the West) 是一个用于计算离散傅里叶变换(DFT)的 C 语言标准库,由 MIT 的 Matteo Frigo 和 Steven G. Johnson 开发。它支持一维或多维、实数或复数以及任意规模的数据变换。FFTW 具有自动适应性,能根据特定机器的硬件(缓存、存储器、寄存器)自动优化性能。

1.2 VS2010

即 Microsoft Visual Studio 2010 集成开发环境。


2. 环境搭建

2.1 下载与准备

  1. 访问 FFTW Windows 下载页面,下载最新的预编译 DLL 压缩包(如 32-bit version)。
  2. 将下载的压缩包解压至 路径 1

2.2 生成 .lib 文件

打开命令提示符(cmd),切换到 路径 1,依次执行以下三条命令:

lib /machine:ix86 /def:libfftw3-3.def
lib /machine:ix86 /def:libfftw3f-3.def 
lib /machine:ix86 /def:libfftw3l-3.def 

注:最后一条命令中是 3l(小写字母 L)。

执行成功后,路径 1 下会生成三个 .lib 文件。此时,该目录下应包含:3 个 .dll 文件、3 个 .lib 文件和 fftw3.h 头文件。

2.3 常见问题排查

问题一:lib 命令无法执行(提示命令不存在)

问题二:缺少 DLL 导致 lib 无法运行

2.4 配置 VS2010 项目属性

  1. 启动 VS2010,创建一个 Win32 控制台空项目。
  2. Alt + F7 打开项目属性。
  3. 配置属性 (Configuration Properties) -> VC++ 目录 (VC++ Directories) 中:
    • 包含目录 (Include Directories) 中添加 路径 1
    • 库目录 (Library Directories) 中添加 路径 1
  4. 配置属性 -> 链接器 (Linker) -> 输入 (Input)附加依赖项 (Additional Dependencies) 中添加:
    libfftw3-3.lib
    libfftw3f-3.lib
    libfftw3l-3.lib

至此,开发环境配置完成。


3. 编写测试代码

在项目的“源文件”下新建 main.cpp,粘贴以下代码进行验证:

#include "fftw3.h"
#include <stdio.h>
#define N 8

int main()
{
	int i;

	fftw_complex *in, *out;
	fftw_plan p;
	in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
	out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);

	if((in == NULL) || (out == NULL))
	{
		printf("Error: insufficient available memory\n");
	}
	else
	{
		for(i = 0; i < N; i++) /* 准备测试数据 */
		{
			in[i][0] = i + 1;
			in[i][1] = 0;
		}
	}

	p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);

	fftw_execute(p); /* 执行变换 */
	fftw_destroy_plan(p);
	fftw_cleanup();

	printf("Input Data:\n");
	for(i = 0; i < N; i++)
	{
		printf("%f, %fi\n", in[i][0], in[i][1]);
	}

	printf("\nOutput (FFT Result):\n");
	for(i = 0; i < N; i++)
	{
		printf("%f, %fi\n", out[i][0], out[i][1]);
	}

	if(in != NULL) fftw_free(in);
	if(out != NULL) fftw_free(out);
	
	getchar();
	return 0;
}

预期输出

如果配置正确,运行结果应如下所示:

1.000000,0.000000i
2.000000,0.000000i
3.000000,0.000000i
4.000000,0.000000i
5.000000,0.000000i
6.000000,0.000000i
7.000000,0.000000i
8.000000,0.000000i

36.000000,0.000000i
-4.000000,9.656854i
-4.000000,4.000000i
-4.000000,1.656854i
-4.000000,0.000000i
-4.000000,-1.656854i
-4.000000,-4.000000i
-4.000000,-9.656854i

配置完成。