首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

思--- 时域抽取基2FFT算法C程序注解

思--- 时域抽取基2FFT算法C程序注解

简介:此程序包是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依
             赖硬件。此程序包采用联合体的形式表示一个复数,输入为自然顺序的复
             数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的
             复数.此程序包可在初始化时调用create_sin_tab()函数创建正弦函数表,
             以后的可采用查表法计算耗时较多的sin和cos运算,加快可计算速度
使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的
          应该为2的N次方,不满足此条件时应在后面补0。若使用查表法计算sin值和
          cos值,应在调用FFT函数前调用create_sin_tab()函数创建正弦表
函数调用:FFT(s);
**********************************************************************/

#define FFT_N 128                                                   //定义傅里叶变换的点数
#define PI 3.1415926535897932384626433832795028841971     //定义圆周率值

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

/*******************************************************************
函数原型: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 create_sin_tab(float *sin_t)
函数功能:创建一个正弦采样表,采样点数与福利叶变换点数相同
输入参数:*sin_t存放正弦表的数组指针
输出参数:无
******************************************************************/
void create_sin_tab(float *sin_t)          //利用sin函数的周期性,只需存储半周期值   
{
  int i;
  for(i=0;i




  sin_t=sin(2*PI*i/FFT_N);
}
/******************************************************************
函数原型:void sin_tab(float pi)
函数功能:采用查表的方法计算一个数的正弦值
输入参数:pi 所要计算正弦值弧度值,范围0--2*PI,不满足时需要转换
输出参数:输入值pi的正弦值
******************************************************************/
float sin_tab(float pi)          //pi的范围由调用者来维护,此函数默认0--2*PI
{
  int n;
  float a;
   n=(int)(pi*FFT_N/2/PI);          //把2π等间隔分为FFT_N等分,利用2π/FFT_N=pi/n,
  
  if(n>=0&&n

                    a=SIN_TAB[n];      //则直接查表,否则利用sin函数的周期性
  else if(n>=FFT_N/2&&n


                    a=-SIN_TAB[n-FFT_N/2];
  return a;
}
/******************************************************************
函数原型:void cos_tab(float pi)
函数功能:采用查表的方法计算一个数的余弦值
输入参数:pi 所要计算余弦值弧度值,范围0--2*PI,不满足时需要转换
输出参数:输入值pi的余弦值
******************************************************************/
float cos_tab(float pi)
{
   float a,pi2;
   pi2=pi+PI/2;
   if(pi2>2*PI)
     pi2-=2*PI;
   a=sin_tab(pi2);             //直接利用前述正弦表,简化处理
   return a;
}
/*****************************************************************
函数原型:void FFT(struct compx *xin)
函数功能:对输入的复数组进行快速傅里叶变换(FFT)
输入参数:*xin复数结构体组的首地址指针,struct型
输出参数:无
*****************************************************************/
返回列表