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_*/
用户563753 2011-8-4 10:05