快速傅里叶变换C程序--方便移植

/********************************************************************* 快速福利叶变换C 函数

函数简介:此函数是通用的快速傅里叶变换C 语言函数,移植性强,以下部分不依 赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复 数(输入实数是可令复数虚部为0),输出为经过FFT 变换的自然顺序的 复数

使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的 应该为2的N 次方,不满足此条件时应在后面补0

函数调用:FFT(s);

时 间:2010-2-20

版 本:V er1.0

参考文献:

**********************************************************************/ #include

#define PI 3.[***********][***********]1971 //定义圆周率值 #define FFT_N 128 //定义福利叶变换的点数

struct compx {float real,imag;}; //定义一个复数结构 struct compx s[FFT_N]; //FFT输入和输出:从S[1]开始存放,根据大小自己定义

/*******************************************************************

函数原型:struct compx EE(struct compx b1,struct compx b2)

函数功能:对两个复数进行乘法运算

输入参数:两个以联合体定义的复数a,b

输出参数:a 和b 的乘积,以联合体的形式输出

*******************************************************************/

struct compx EE(struct compx a,struct compx b)

{

struct compx c;

c.real=a.real*b.real-a.imag*b.imag;

c.imag=a.real*b.imag+a.imag*b.real;

return(c);

}

/*****************************************************************

函数原型:void FFT(struct compx *xin,int N)

函数功能:对输入的复数组进行快速傅里叶变换(FFT )

输入参数:*xin复数结构体组的首地址指针,struct 型

*****************************************************************/

void FFT(struct compx *xin)

{

int f,m,nv2,nm1,i,k,l,j=1;

struct compx u,w,t;

nv2=FFT_N/2; //变址运算,即把自然顺序变成倒位序,采用雷德算法

nm1=FFT_N-1;

for(i=0;i

{

if(i

{

t=xin[j];

xin[j]=xin[i];

xin[i]=t;

}

k=nv2; //求j 的下一个倒位序

while(k

{

j=j-k; //把最高位变成0

k=k/2; //k/2,比较次高位,依次类推,逐个比较,直到某个位为0 }

j=j+k; //把0改为1

}

{

int le,lei,ip; //FFT运算核,使用蝶形运算完成FFT 运算 f=FFT_N;

for(l=1;(f=f/2)!=1;l++) //计算l 的值,即计算蝶形级数

;

for(m=1;m

{ //m表示第m 级蝶形,l 为蝶形级总数l=log(2)N

le=2

lei=le/2; //同一蝶形结中参加运算的两点的距离 u.real=1.0; //u为蝶形结运算系数,初始值为1 u.imag=0.0;

w.real=cos(PI/lei); //w为系数商,即当前系数与前一个系数的商 w.imag=-sin(PI/lei);

for(j=0;j

{

for(i=j;i

{

ip=i+lei; //i,ip 分别表示参加蝶形运算的两个节点 t=EE(xin[ip],u); //蝶形运算,详见公式

xin[ip].real=xin[i].real-t.real;

xin[ip].imag=xin[i].imag-t.imag;

xin[i].real=xin[i].real+t.real;

xin[i].imag=xin[i].imag+t.imag;

}

u=EE(u,w); //改变系数,进行下一个蝶形运算 }

}

}

}

/************************************************************

函数原型:void main()

函数功能:测试FFT 变换,演示函数使用方法

输入参数:无

输出参数:无

************************************************************/

void main()

{

int i;

for(i=0;i

{

s[i].real=sin(2*3.[**************]*i/FFT_N); //实部为正弦波FFT_N点采样,赋值为1 s[i].imag=0; //虚部为0

}

FFT(s); //进行快速福利叶变换

for(i=0;i

s[i].real=sqrt(s[i].real*s[i].real+s[i].imag*s[i].imag);

while(1);

}

/********************************************************************* 快速福利叶变换C 函数

函数简介:此函数是通用的快速傅里叶变换C 语言函数,移植性强,以下部分不依 赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复 数(输入实数是可令复数虚部为0),输出为经过FFT 变换的自然顺序的 复数

使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的 应该为2的N 次方,不满足此条件时应在后面补0

函数调用:FFT(s);

时 间:2010-2-20

版 本:V er1.0

参考文献:

**********************************************************************/ #include

#define PI 3.[***********][***********]1971 //定义圆周率值 #define FFT_N 128 //定义福利叶变换的点数

struct compx {float real,imag;}; //定义一个复数结构 struct compx s[FFT_N]; //FFT输入和输出:从S[1]开始存放,根据大小自己定义

/*******************************************************************

函数原型:struct compx EE(struct compx b1,struct compx b2)

函数功能:对两个复数进行乘法运算

输入参数:两个以联合体定义的复数a,b

输出参数:a 和b 的乘积,以联合体的形式输出

*******************************************************************/

struct compx EE(struct compx a,struct compx b)

{

struct compx c;

c.real=a.real*b.real-a.imag*b.imag;

c.imag=a.real*b.imag+a.imag*b.real;

return(c);

}

/*****************************************************************

函数原型:void FFT(struct compx *xin,int N)

函数功能:对输入的复数组进行快速傅里叶变换(FFT )

输入参数:*xin复数结构体组的首地址指针,struct 型

*****************************************************************/

void FFT(struct compx *xin)

{

int f,m,nv2,nm1,i,k,l,j=1;

struct compx u,w,t;

nv2=FFT_N/2; //变址运算,即把自然顺序变成倒位序,采用雷德算法

nm1=FFT_N-1;

for(i=0;i

{

if(i

{

t=xin[j];

xin[j]=xin[i];

xin[i]=t;

}

k=nv2; //求j 的下一个倒位序

while(k

{

j=j-k; //把最高位变成0

k=k/2; //k/2,比较次高位,依次类推,逐个比较,直到某个位为0 }

j=j+k; //把0改为1

}

{

int le,lei,ip; //FFT运算核,使用蝶形运算完成FFT 运算 f=FFT_N;

for(l=1;(f=f/2)!=1;l++) //计算l 的值,即计算蝶形级数

;

for(m=1;m

{ //m表示第m 级蝶形,l 为蝶形级总数l=log(2)N

le=2

lei=le/2; //同一蝶形结中参加运算的两点的距离 u.real=1.0; //u为蝶形结运算系数,初始值为1 u.imag=0.0;

w.real=cos(PI/lei); //w为系数商,即当前系数与前一个系数的商 w.imag=-sin(PI/lei);

for(j=0;j

{

for(i=j;i

{

ip=i+lei; //i,ip 分别表示参加蝶形运算的两个节点 t=EE(xin[ip],u); //蝶形运算,详见公式

xin[ip].real=xin[i].real-t.real;

xin[ip].imag=xin[i].imag-t.imag;

xin[i].real=xin[i].real+t.real;

xin[i].imag=xin[i].imag+t.imag;

}

u=EE(u,w); //改变系数,进行下一个蝶形运算 }

}

}

}

/************************************************************

函数原型:void main()

函数功能:测试FFT 变换,演示函数使用方法

输入参数:无

输出参数:无

************************************************************/

void main()

{

int i;

for(i=0;i

{

s[i].real=sin(2*3.[**************]*i/FFT_N); //实部为正弦波FFT_N点采样,赋值为1 s[i].imag=0; //虚部为0

}

FFT(s); //进行快速福利叶变换

for(i=0;i

s[i].real=sqrt(s[i].real*s[i].real+s[i].imag*s[i].imag);

while(1);

}


相关内容

  • 单细胞拉曼光谱系统控制软件
  • 单细胞拉曼光谱系统控制软件 单细胞拉曼光谱系统控制软件是针对拉曼光谱系统的具体功能要求并结合硬件系统来进行设计和实现.根据硬件系统待实现的功能来对相应器件进行二次开发,以达到系统原位.实时.连续.自动获取单细胞拉曼光谱的目的. §1 单细胞拉曼光谱系统控制软件总体设计 §1.1 开发环境 本套系统软 ...

  • 图像拼接调研报告
  • 图像拼接的调研报告 1. 图像拼接的意义和国内外研究现状 1.1 意义 图像拼接(image mosaic)技术是将一组相互间存在重叠部分的图像序列进行空间配准,经重采样融合后形成一幅包含各图像序列信息的宽视角场景的.完整的.高清晰的新图像的技术.图像拼接是数字图像处理领域的一个重要的研究方向,在摄 ...

  • 基于OpenCV的非线性图像畸变校正研究
  • 2011年6月15日第34卷第12期 现代电子技术 ModernElectronicsTechniue q Jun.2011 Vol.34No.12 基于OenCV的非线性图像畸变校正研究p 陶旺林,卢选民,刘李娟,单 长 ()西北工业大学电子信息学院,陕西西安 710129 摘 要:由于光学镜头加 ...

  • 计算机原理问答题
  • 第一章 1.翻译和解释的区别和联系? 区别:翻译是整个程序转换,解释是低级机器的一串语句仿真高级机器的一条语句. 联系:都是高级机器程序在低级机器上执行的必须步骤. 2.为什么将计算机系统看成是多级机器构成的层次结构? 可以调整软.硬件比例:可以用真正的实处理机代替虚拟机器:可以在1台宿主机上仿真另 ...

  • 软件工程实用教程2版课后答案
  • 第1章软件工程引论 1.什么是软件危机?它和软件工程有什么关系? 答案要点: 由于软件规模的扩大.功能的增强和复杂性的增加,使得在一定时间内仅依靠少数人开发一个软件变得越来越困难.在软件开发中经常会出现时间延迟.预算超支.质量得不到保证.移植性差等问题,甚至有的项目在耗费了大量人力.财力后,由于离目 ...

  • 软件工程银行卡管理系统课程设计
  • 华北电力大学 课程名称:软件工程 课程题目:银行存储系统 组员:孟格思 姜婷 刘宏宇 赵雄飞 杨俊森 专业:计算机科学与技术 班级:计算1102 学院:控制与计算机工程学院 时间:2013年10月24号 目录 一.开发背景与目标 ................................... ...

  • 天津专接本软件工程专业考试资料
  • 1. 软件工程:是指导计算机软件开发和维护的一门工程学科.采用工程的概念.原理.技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好技术方法结合起来,以经济地开发出高质量的软件并有效地维护它. 2. 软件危机:是指在计算机软件的开发与维护过程中所遇到的一系列问题. 3. ...

  • Boost升压斩波电路
  • 2013 ~2014 学年 第 2 学期 <直流电机斩波电路> 课 程 设 计 报 告 题 目: 直流电机斩波电路 专 业: 自动化 班 级: 11自动化(1)班 姓 名: 李勇 刘城 刘备 李亚 卢伟 刘德 指导教师: 焦俊生 电气工程学院 2014年4月2日 1.任务书 2.答辩记录 ...

  • 现代信号处理及其应用
  • [数字信号处理在视频领域的应用] [] [111044A ] [111044124] [2014.4.15] 摘要: 本文主要介绍了数字信号处理在视频领域的应用,包括相关背景.发展历程及其未来发展趋势.包含数字信号处理视频的标准及应用,重点突出数字信号处理在视频处理中的具体技术及其的实现. 目录 数 ...