📄 head_fft.h
字号:
#include<math.h>
#define WR PORTD.0
#define RD PORTD.1
#define INT PIND.3
#define pi 3.14159
#define N 32
float kf;
float distortion[N];
char l=0;
char my_pow(char a,char b);
float xr[N];
byte data,xr_temp[N];
void sample()
{
l=0;
while(l<32)
{
if(flag)
{
WR=0;
WR=1;
while(INT);
RD=0;
data=PINC;
data=PINC;
RD=1;
//xr[l]=(float)5.0*data/256;
//xr[l]=dat;
xr_temp[l]=data;
flag=0;
l++;
}
}
//deal with data
for(l=0;l<N;l++)
xr[l]=(float)5.0*xr_temp[l]/256;
}
void FFT()
{
float xiebo=0;
char k,nn,nm1,nv2,j,m,le,le1,i,ip;
float xi[N]={0},temp,ur,ui,wr,wi,tr,ti,url,uil;
//FFT Begin
nn=N;
//求幂M的值
m=0;
do
{
m=m+1;
nn/=2;
}while(nn!=1);
//cout<<m<<endl;
//求逆序数
nn=N;
nv2=nn/2;
nm1=nn-1;
j=0;
for(i=0;i<nm1;i++)
{
if(i<j)
{
temp=xr[j];
xr[j]=xr[i];
xr[i]=temp;
}
k=nv2;
while(k<j+1) {j-=k;k/=2;}
j+=k;
}
//FFT算法
nn=N;
for(l=1;l<=m;l++)
{
le=my_pow(2,l);
le1=le/2;
ur=1;
ui=0;
wr=cos(pi/le1);
wi=-sin(pi/le1);
for(j=1;j<=le1;j++)
{
for(i=j-1;i<nn;i+=le)
{
ip=i+le1;
//if(ip>15) break;
tr=xr[ip]*ur-xi[ip]*ui;
ti=xr[ip]*ui+xi[ip]*ur;
xr[ip]=xr[i]-tr;
xi[ip]=xi[i]-ti;
xr[i]=xr[i]+tr;
xi[i]=xi[i]+ti;
}
url=ur*wr-ui*wi;
uil=ur*wi+ui*wr;
ur=url;
ui=uil;
}
}
//求失真度
for(j=0;j<N;j++)
distortion[j]=xr[j]*xr[j]+xi[j]*xi[j];
for(j=2;j<N/2;j++) xiebo+=distortion[j];
kf=sqrt(xiebo/(distortion[1]+xiebo))*100;
l=0;
for(i=0;i<N;i++)
{
xr[i]=0;xi[i]=0;
}
xiebo=0;
}
char my_pow(char a,char b)
{
char w,result=1;
for(w=0;w<b;w++) result*=a;
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -