ZH ·
🌏 English 在 Visual Studio 2010 中配置 FFTW 3.3.2 快速傅里叶变换库
0. 前言
在进行信号处理或图像处理开发时,经常需要使用快速傅里叶变换(FFT)库。FFTW 是目前公认性能领先的开源实现。虽然网上有很多配置教程,但大多信息零散或不够完整。本文将整理在 Visual Studio 2010(VS2010)环境下配置 FFTW 3.3.2 的完整步骤。
路径约定:
- 路径 1:解压 FFTW 预编译 DLL 包的目录(用于生成
.lib文件)。 - 路径 2:Visual Studio 2010 的安装路径。
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 下载与准备
- 访问 FFTW Windows 下载页面,下载最新的预编译 DLL 压缩包(如 32-bit version)。
- 将下载的压缩包解压至 路径 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 命令无法执行(提示命令不存在)
- 解决方法:找到 VS2010 安装目录下的
...\VC\bin路径(即 路径 2 下的相关目录),将其添加到系统环境变量的Path中。重启 cmd,输入lib,若出现使用说明提示,则配置成功。
问题二:缺少 DLL 导致 lib 无法运行
- 有时
VC\bin下的lib.exe运行需要特定的支持文件。如果报错,可以尝试将路径 2\Common7\IDE目录下的mspdb80.dll、mspdbcore.dll、mspdbsrv.exe、msobj80.dll等文件复制到VC\bin文件夹中。
2.4 配置 VS2010 项目属性
- 启动 VS2010,创建一个 Win32 控制台空项目。
- 按
Alt + F7打开项目属性。 - 在 配置属性 (Configuration Properties) -> VC++ 目录 (VC++ Directories) 中:
- 在 包含目录 (Include Directories) 中添加 路径 1。
- 在 库目录 (Library Directories) 中添加 路径 1。
- 在 配置属性 -> 链接器 (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
配置完成。