windows下使用fftw进行傅里叶变换及其编程实例

傅里叶变换应该是上大二的时候《信号与系统》课上学过,上研后在《数字信号处理》课上又学了一遍。当初一直在想傅里叶变换到底有什么用呢?什么时候能用上呢?时间如梭,没想到毕业四年后,一个小项目要用到傅里叶变换,喜大普奔啊,当初晦涩的概念、眼晕的公式,终于没白学。是的,其实任何知识都不是白学的,即使工作中一直用不到傅里叶变换,至少思维得到了锻炼,都是有益的。在应用傅里叶变换过程中,可以按照公式自己编程实现,也可以使用已有的开源傅里叶变换函数库。经过查阅资料,本人选用fftw函数库来进行傅里叶变换,因为fftw官网上提到说该函数库性能非常出众,甚至可以和同类型的商业软件相竞争。fftw官网地址为:http://www.fftw.org/

一、fftw下载

由于本人是在windows平台开发,于是到下面链接:http://www.fftw.org/install/windows.html下载已编译版本。如下图所示,该图信息量很大,既有32/64两个版本的下载链接,同时还有生成lib文件命令。即32位系统命令为:
lib /def:libfftw3-3.def,而64位系统为: lib /machine:x64 /def:libfftw3-3.def。

下载解压后,会发现只有dll和头文件,在没有lib文件时,使用fftw库时会比较繁琐。于是在应用fftw编程前还是动手先生成lib文件。方法很简单,首先打开VS命令提示工具。本人使用的开发工具为VS2005,如下图所示:

打开后,cd到已下载的fftw文件目录,然后执行前面提到的lib生成命令,如下图所示:

命令执行完毕后,即可在当前目录内看到新生成的lib文件,我这边分别生成了double、float、long double三个版本,实际使用时可根据项目需要,选择相应精度的版本。生成的lib库文件如下图所示:

二、简单编程实例

有了头文件、lib/dll文件,那就什么都有了。新建一个工程,马上用起来吧。下面为一个非常简单的编程实例,主要完成实数傅里叶变换,输入为正弦曲线,输出为傅里叶变换的幅度谱。

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "include/fftw3.h"
#pragma comment(lib, "libfftw3-3.lib") // double版本
// #pragma comment(lib, "libfftw3f-3.lib")// float版本
// #pragma comment(lib, "libfftw3l-3.lib")// long double版本

#define PI 3.1415926

int main()
{
	int len = 8;
	double *in = NULL;
	// 如果要使用float版本,需先引用float版本的lib库,然后在fftw后面加上f后缀即可.
	fftw_complex *out = NULL;// fftwf_complex --> 即为float版本
	fftw_plan p;
	in  = (double *)fftw_malloc(sizeof(double) * len);
	out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * len);
	double dx = 1.0 / len;

	// 输入纯实数
	for (int i = 0; i < len; i++)
	{
		in[i] = sin(2*PI * dx*i) + sin(4*PI * dx*i);

		printf("%.2f ", in[i]);
	}
	printf("\n\n");

	// 傅里叶变换
	p = fftw_plan_dft_r2c_1d(len, in, out, FFTW_ESTIMATE);
	fftw_execute(p);

	// 输出幅度谱
	for (int i = 0; i < len; i++)
	{
		float len = sqrt(out[i][0]*out[i][0] + out[i][1]*out[i][1]);
		printf("%.2f ", len);
	}
	printf("\n");

	// 释放资源
	fftw_destroy_plan(p);
	fftw_free(in);
	fftw_free(out);

	system("pause");
	return 0;
}

运行结果如下图所示,从结果来看,在频率为1及2两个位置有幅度输出,这与输入的频率为1及2的两个叠加正弦波吻合,结果正确。

windows下使用fftw进行傅里叶变换及其编程实例

时间: 2024-10-14 20:17:28

windows下使用fftw进行傅里叶变换及其编程实例的相关文章

在windows下用C语言写socket通讯实例

原文:在windows下用C语言写socket通讯实例 From:Microsoft Dev Center #undef UNICODE #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <stdlib.h> #include <stdio.h> // Need to link with Ws2

win7系统下用vspd软件进行串口编程实例

http://blog.csdn.net/qiusuo800/article/details/8299777 目前,我在学习C#串口编程类的基础知识,在网上也找了一些资料,但都存在一些问题,现在他们基础上再进行一定的修改,且更详细的表达如何实现串口编程,实现串口的发送与接收.本文通过一个完整的实例,目的在于说明在win7系统中进行串口编程时: 1.  用C# 编程串口的属性定义.成员变量以及方法等问题: 2.  掌握串口的发送与接收,利用虚拟串口来进行通讯,体验串口通讯: 至于具体的串口通信原理

windows下一个tomcat版本创建多个实例

照着做成功了,记录一下,原地址:https://my.oschina.net/stategrace/blog/202431 首先下载一个tomcat我们在任意一个盘符内创建一个文件夹,下面有tomcat1,tomcat2,tomcat3,等等 复制tomcat中conf到tomcat1,tomcat2,tomcat3,中 修改server.xml配置文件中的三个端口,不要有重复,即 <Server port="8005" shutdown="SHUTDOWN"

在windows下的QT编程中的_TCHAR与QString之间的转换

由于在windows下的QT编程中,如果涉及到使用微软的API,那么不可避免使用_TCHAR这些类型,因此在网上查了一下,其中一个老外的论坛有人给出了这个转换,因此在这里做一下笔记 : )#ifdef UNICODE #define QStringToTCHAR(x)     (wchar_t*) x.utf16() #define PQStringToTCHAR(x)    (wchar_t*) x->utf16() #define TCHARToQString(x)     QString:

初探WINDOWS下IME编程

初探WINDOWS下IME编程作者:广东南海市昭信科技有限公司-李建国 大家知道,DELPHI许多控件有IME属性.这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现.下面说一下本人对IME的研究结果,并提供示例工程供大家参考: 下载示例工程 10.6K 本文示例程序运行结果如上图1.将用到的API RegOpenKey:打开注册表一键RegQueryValue:查询一键值RegQueryValueEx:同上RegCloseKey:关闭打开的键 LoadKeyboardLay

windows下的socket网络编程(入门级)

windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先写了个简单的winSocket网路通信的例子,以便以后用到的时候有个参考. windows下使用winsock编程与linux/unix的区别在于windows下需要先有一个初始化的操作,结束的时候需要一个清理的操作.还有windows下编译的时候需要连接ws32_lib库. 大致过程如下 1.初始

Windows下多线程编程(一)

前言 熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常.Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求. 进程与线程 1. 进程的概念 进程就是正在运行的程序.主要包括两部分: • 一个是操作系统用来管理进程的内核对象.内核对象也是系统用来存放关于进程的统计信息的地方. • 另一个是地址空间,它包含所有可执行模块或 D L L模块的代码和数据.它还包含动态内 2. 线程的概念 线程就是描述进程的一条执

Windows下Hadoop编程环境配置指南

刘勇    Email: [email protected] 本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣! 简介 鉴于最近在研究Hadoop编程时,为考虑编程的方便,在Windows本地编译源程序,然后直接访问Hadoop集群,这样给广大编程人员提供了极大的便利.在这个过程中积累了一些实际经验,并针对在该过程中(初级阶段)可能会遇到的问题,提供一些解决方案,希望对大家有所帮助. 环境介绍 Hadoop 集群:hadoop

winsock教程- windows下的socket编程(c语言实现)

winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下代码片段只能运行在windows下.windows API中的socket编程部分叫做winsock. 你电脑上做出的任何网络通信背后基本上都有socket,它是一个网络的基本组成部分.举个例子说当你在浏览器键入www.google.com的时候,socket连接到google.com并且取回那个页面然后才