📄 fpga_fft.c
字号:
//*************************************快速傅立叶变换**************************************
/*
此系统的接收主要基于频域,实时的接收对傅立叶变换的速度要求较高,所以采用FPGA实现。
参量说明:
x:输入的时域信号和输出的频域信号的指针;
n:傅立叶变换的点数;
sign:正负傅立叶变换的标志;
*/
#include"math.h"
#include"fpga_fft.h"
//#include"globalval.h"
void fpga_fft(struct xi *x,int n,int sign)
{
int i,j,k,l,m,n1,n2;
double c,c1,e,s,s1,t,tr,ti;
for(j=1,i=1;i<25;i++)
{
m=i;
j=2*j;
if(j==n)
{
break;
}
}//确定傅立叶变换的级数
n1=n-1;
for(j=0,i=0;i<n1;i++)
{
if(i<j)
{
tr=(x+j)->real;
ti=(x+j)->imag;
(x+j)->real=(x+i)->real;
(x+j)->imag=(x+i)->imag;
(x+i)->real=tr;
(x+i)->imag=ti;
}
k=n/2;
while(k<(j+1))
{
j=j-k;
k=k/2;
}
j=j+k;
}
n1=1;
for (l=1;l<=m;l++)
{
n1=2*n1;
n2=n1/2;
e=pi/n2;
c=1.0;
s=0.0;
c1=(double)cos(e);
s1=(double)-sign*sin(e);
for(j=0;j<n2;j++)//计算下一级的数据
{
for(i=j;i<n;i+=n1)
{
k=i+n2;
tr=c*(x+k)->real-s*(x+k)->imag;
ti=c*(x+k)->imag+s*(x+k)->real;
(x+k)->real=(x+i)->real-tr;
(x+k)->imag=(x+i)->imag-ti;
(x+i)->real=(x+i)->real+tr;
(x+i)->imag=(x+i)->imag+ti;
}
t=c;
c=c*c1-s*s1;
s=t*s1+s*c1;
}
}
if (sign==-1)//傅立叶逆变换
{
for(i=0;i<n;i++)
{
(x+i)->real/=n;
(x+i)->imag/=n;
}
}
}
void hamming(double w[],int n)
{
int i;
for(i=0;i<n;i++)
{
w[i]=(double)(0.54-0.46*cos(2*pi*i/(n-1)));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -