原创 用于NIOS软核处理器的FFT程序

2010-3-26 13:58 2859 2 3 分类: FPGA/CPLD

NIOS软核处理器,时钟100MHz ,字长32位,外扩8MRAM


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


文件fft.c


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


#include "fft.h"
extern int costap[2048];
extern int sintap[2048];
//extern int test_data[4096];


/**********


自己编写的开平方程序


**********/
alt_64 sqrt2(alt_64 data)         
{
 alt_64 s="0";
 int i;
 for(i=0x8000;i>0;i>>=1)
 {
  s|=i;
  if(s*s>data)
   s&=~i;
 }
 return s;
}


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


算幅度函数


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


void getamp(int x[],int y[],int wamp[],int len)
{
 int i;
 for(i=0;i<len;i++)
 {
       //wamp=x*x+y*y;
    wamp=sqrt2(x*x+y*y);//开方后放大
 }


}


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


fft计算函数


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


void fft(int x[],int y[],int n)
{//x[]为实部,y[]为虚部(全为0),n为点数
 int tr,ti,p,q;
 int i,j,k,qn,a,b,c,cen,zu,ge;


 a=n-1;
 for(i=0,j=0;i<a;i++)//循环n-1次
 {                                           
  if(i<j)                                   
  {
   tr="x"[j];
   x[j]=x;
   x=tr;
   ti="y"[j];
   y[j]=y;
   y=ti;
  }//交换x<->x[j],y<->y[j]
  k="n/2";
  while(k<(j+1))
  {
   j="j-k";
   k="k/2";
  }
  j="j"+k;
 }//此循环把原序列变成2点奇偶序列
 


 cen=11;                       //如果n=8,则cen=3;
 zu=n;
 for(i=0;i<cen;i++)       
 {
  zu="zu/2";         //组数(4,2,1)
  for(j=0;j<zu;j++)        //第i 层中的第 j组
  { 
   ge=(n/zu)/2;//一组中蝶形的个数(1,2,4)     
   for(k=0;k<ge;k++)       //第 j 组中的第k个
   {                       //第 a 和第 b 个元素作蝶形运算,WNC
    a="j"*ge*2+k;            //(0,2,4,6)(0,1,4,5)(0,1,2,3)
    b="a"+ge;                //(ge=1,2,4)
    c="k"*zu;                //(0,0,0,0)(0,2,0,2)(0,1,2,3)
    qn=(2048/n)*c;
    //注意sign
    tr=(x*costap[qn]-y*sintap[qn])>>15;//由于正余弦表放大32768倍,此处缩小32768倍
    ti=(y*costap[qn]+x*sintap[qn])>>15;
    p="x"[a];
    q="y"[a];
    //蝶形运算
    x[a]=(p+tr)>>1;//防止数据溢出
    y[a]=(q+ti)>>1;
    x=(p-tr)>>1;
    y=(q-ti)>>1;
   }
  }
 }
}


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


文件fft.h


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


#ifndef FFT_H_
#define FFT_H_
#include "alt_types.h"
alt_64 sqrt2(alt_64 data);
void getamp(int x[],int y[],int wamp[],int len);
void fft(int x[],int y[],int n);
#endif /*FFT_H_*/

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户563753 2011-8-4 10:05

先收藏了,再看!!
相关推荐阅读
用户1510090 2010-11-07 14:55
遗传算法程序----欢迎下载!
C语言遗传算法的程序。求取函数f(x)=x*sin(10*pi*x)+1在[-1,2]上的最大值,包含复制、交叉、变异等操作,修改后可用于其他程序。采用Visual Studio开发,基于控制台。是您...
用户1510090 2010-08-18 22:18
电子系统抗干扰设计漫谈
 一、从电源讲起    设计电源时的主要问题有:电源发热、电源噪声、电源去耦、电源地线设计以及线性电源与开关电源的选择等  问题。最大的干扰来自50Hz的工频及其谐波干扰。下面说一些设计经验与实际中常...
用户1510090 2010-04-23 19:16
程控滤波器的故事
       程控滤波器是2007年全国电赛的D题,一个很经典的模拟题目。很自然的,这道题成为了我们参加2009年竞赛的必做训练题目。记得做这个题的那一周还正好碰上了本世纪最精彩的一次日全食,挺令人唏...
用户1510090 2010-03-30 21:20
管道输运粉体的质量
项目日期:2008年11月气固两相流广泛的存在于自然界和工业生产过程中,应用管道气力输送工艺来传送煤粉、水泥、矿石、盐类以及面粉等都是属于典型的气固两相流流动。由于气固两相流本身性质的复杂性和测量当中...
用户1510090 2010-03-27 21:01
JAVA中数组使用要点
一、一维数组      在声明数组时不能指定其长度,如语句int  score[6];是不对的。应该使用new关键字来为定义的数组分配内存。如:int[]score=new int[6];二、多维数组...
EE直播间
更多
我要评论
1
2
关闭 站长推荐上一条 /3 下一条