最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

三种C语言实现的FFT例程

来源:动视网 责编:小OO 时间:2025-09-29 02:18:24
文档

三种C语言实现的FFT例程

三种C语言实现的FFT例程#include#include/*********************************************************************快速福利叶变换C函数函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的复数使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_
推荐度:
导读三种C语言实现的FFT例程#include#include/*********************************************************************快速福利叶变换C函数函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的复数使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_
三种C语言实现的FFT例程

#include

#include

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

 快速福利叶变换C函数

函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依

 赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复

 数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的

 复数

使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的

 应该为2的N次方,不满足此条件时应在后面补0

函数调用:FFT(s);

时 间:2010-2-20

版 本:Ver1.0

参考文献:

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

#include

#定义圆周率值

#定义福利叶变换的点数

s定义一个复数结构

s输入和输出:从S[1]开始存放,根据大小自己定义

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

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

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

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

输出参数:a和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=0;

  struct compx u,w,t;

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

 如果i      t=xin[j];           

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

 如果k<=j,表示j的最高位为

     {           

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

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

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

  }

  {

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

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

 控制蝶形结级数

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

 蝶形结距离,即第m级蝶形的蝶形结相距le点

    lei=le/2;                               //同一蝶形结中参加运算的两点的距离

    u.real=1.0;                             //u为蝶形结运算系数,初始值为1

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

 控制计算不同种蝶形结,即计算系数不同的蝶形结

 控制同一蝶形结运算,即计算系数相同蝶形结

        ip=i+lei;                           //i,ip分别表示参加蝶形运算的两个节点

        t=EE(xin[ip],u);                    //蝶形运算,详见公式

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

  }

  

}

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

函数原型:void main() 

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

输入参数:无

输出参数:无

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

{  

  int i;

 给结构体赋值

  {

 实部为正弦波FFT_N点采样,赋值为1

     s[i].imag=0;                                //虚部为0

  }

  

 进行快速福利叶变换

  

 求变换后结果的模值,存入复数的实部部分

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

 

}

 

#include

#include

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

 快速福利叶变换C程序包

函数简介:此程序包是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依

 赖硬件。此程序包采用联合体的形式表示一个复数,输入为自然顺序的复

 数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的

 复数.此程序包可在初始化时调用create_sin_tab()函数创建正弦函数表,

 以后的可采用查表法计算耗时较多的sin和cos运算,加快可计算速度

使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的

 应该为2的N次方,不满足此条件时应在后面补0。若使用查表法计算sin值和

 值,应在调用FFT函数前调用create_sin_tab()函数创建正弦表

函数调用:FFT(s);

时 间:2010-2-20

版 本:Ver1.1

参考文献:  

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

#include

#定义福利叶变换的点数

#定义圆周率值

s定义一个复数结构

s输入和输出:从S[0]开始存放,根据大小自己定义

f定义正弦表的存放空间

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

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

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

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

输出参数:a和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 create_sin_tab(float *sin_t)

函数功能:创建一个正弦采样表,采样点数与福利叶变换点数相同

输入参数:*sin_t存放正弦表的数组指针

输出参数:无

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

{

  int i;

for(i=0;i  sin_t[i]=sin(2*PI*i/FFT_N);

}

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

函数原型:void sin_tab(float pi)

函数功能:采用查表的方法计算一个数的正弦值

输入参数:pi 所要计算正弦值弧度值,范围0--2*PI,不满足时需要转换

输出参数:输入值pi的正弦值

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

float sin_tab(float pi)

{

  int n;

  float a;

if(n>=0&&nelse if(n>=FFT_N/2&&n  return a;

}

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

函数原型:void cos_tab(float pi)

函数功能:采用查表的方法计算一个数的余弦值

输入参数:pi 所要计算余弦值弧度值,范围0--2*PI,不满足时需要转换

输出参数:输入值pi的余弦值

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

float cos_tab(float pi)

{

}

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

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

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

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

输出参数:无

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

void FFT(struct compx *xin)

{

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

  struct compx u,w,t;

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

 如果i      t=xin[j];           

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

 如果k<=j,表示j的最高位为

     {           

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

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

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

  }

  {

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

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

 控制蝶形结级数

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

 蝶形结距离,即第m级蝶形的蝶形结相距le点

    lei=le/2;                         //同一蝶形结中参加运算的两点的距离

    u.real=1.0;                        //u为蝶形结运算系数,初始值为1

    //w.real=cos(PI/lei);                  //不适用查表法计算sin值和cos值

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

 控制计算不同种蝶形结,即计算系数不同的蝶形结

 控制同一蝶形结运算,即计算系数相同蝶形结

        ip=i+lei;                          //i,ip分别表示参加蝶形运算的两个节点

        t=EE(xin[ip],u);                   //蝶形运算,详见公式

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

  }

  

}

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

函数原型:void main() 

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

输入参数:无

输出参数:无

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

{  

  int i;

  create_sin_tab(SIN_TAB);

 给结构体赋值

  {

 实部为正弦波FFT_N点采样,赋值为1

     s[i].imag=0;                             //虚部为0

  }

 进行快速福利叶变换

  

 求变换后结果的模值,存入复数的实部部分

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

 

}

 

#include

#include

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

 快速福利叶变换C程序包

函数简介:此程序包是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依

 赖硬件。此程序包采用联合体的形式表示一个复数,输入为自然顺序的复

 数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的

 复数.此程序包可在初始化时调用create_sin_tab()函数创建正弦函数表,

 以后的可采用查表法计算耗时较多的sin和cos运算,加快可计算速度.与

 版相比较,Ver1.2版在创建正弦表时只建立了1/4个正弦波的采样值,

 相比之下节省了FFT_N/4个存储空间

使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的

 应该为2的N次方,不满足此条件时应在后面补0。若使用查表法计算sin值和

 值,应在调用FFT函数前调用create_sin_tab()函数创建正弦表

函数调用:FFT(s);

时 间:2010-2-20

版 本:Ver1.2

参考文献:  

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

#include

#定义福利叶变换的点数

# //定义圆周率值

s  //定义一个复数结构

s  //FFT输入和输出:从S[0]开始存放,根据大小自己定义

f //定义正弦表的存放空间

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

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

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

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

输出参数:a和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 create_sin_tab(float *sin_t)

函数功能:创建一个正弦采样表,采样点数与福利叶变换点数相同

输入参数:*sin_t存放正弦表的数组指针

输出参数:无

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

{

  int i;

for(i=0;i<=FFT_N/4;i++)

  sin_t[i]=sin(2*PI*i/FFT_N);

}

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

函数原型:void sin_tab(float pi)

函数功能:采用查表的方法计算一个数的正弦值

输入参数:pi 所要计算正弦值弧度值,范围0--2*PI,不满足时需要转换

输出参数:输入值pi的正弦值

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

float sin_tab(float pi)

{

  int n;

  float a;

if(n>=0&&n<=FFT_N/4)

else if(n>FFT_N/4&&nelse if(n>=FFT_N/2&&n<3*FFT_N/4)

else if(n>=3*FFT_N/4&&n<3*FFT_N)

  

  return a;

}

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

函数原型:void cos_tab(float pi)

函数功能:采用查表的方法计算一个数的余弦值

输入参数:pi 所要计算余弦值弧度值,范围0--2*PI,不满足时需要转换

输出参数:输入值pi的余弦值

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

float cos_tab(float pi)

{

}

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

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

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

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

输出参数:无

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

void FFT(struct compx *xin)

{

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

  struct compx u,w,t;

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

 如果i      t=xin[j];           

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

 如果k<=j,表示j的最高位为

     {           

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

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

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

  }

  {

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

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

 控制蝶形结级数

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

 蝶形结距离,即第m级蝶形的蝶形结相距le点

    lei=le/2;                               //同一蝶形结中参加运算的两点的距离

    u.real=1.0;                             //u为蝶形结运算系数,初始值为1

    //w.real=cos(PI/lei);                  //不适用查表法计算sin值和cos值

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

 控制计算不同种蝶形结,即计算系数不同的蝶形结

 控制同一蝶形结运算,即计算系数相同蝶形结

        ip=i+lei;                          //i,ip分别表示参加蝶形运算的两个节点

        t=EE(xin[ip],u);                   //蝶形运算,详见公式

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

  }

  

}

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

函数原型:void main() 

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

输入参数:无

输出参数:无

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

{  

  int i;

  create_sin_tab(SIN_TAB);

 给结构体赋值

  {

 实部为正弦波FFT_N点采样,赋值为1

     s[i].imag=0;                                //虚部为0

  }

 进行快速福利叶变换

  

 求变换后结果的模值,存入复数的实部部分

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

 

}

 

文档

三种C语言实现的FFT例程

三种C语言实现的FFT例程#include#include/*********************************************************************快速福利叶变换C函数函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的复数使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top