📄 fft_xgjis.c
字号:
#include"math.h"
#include"FFT_xgjis.h"
#include<c8051f120.h>
#include<flash.h>
sbit AD_RC=P0^6;
sbit AD_BUSY=P0^7;
/**********************************************************
延时函数
**********************************************************/
void delay10ns(unsigned int t)
{
while(--t!=0);
}
//************************************************** 1
//函数输入:无
//函数输出:16bit的数据
//函数说明:AD采样
int ads8505(void)
{
unsigned char data_L,data_H;
int ads;
SFRPAGE = 0x0f;
AD_RC=1;
AD_RC=0;
delay10ns(5);
AD_RC=1;
while(!AD_BUSY);
data_L=P2;
data_H=P3;
ads=data_H;
ads=ads<<8;
ads=ads+data_L;
return(ads);
}
//************************************************** 2
//函数输入:
//函数输出:将功率普存入FLASH
//函数说明:功率转换
void account_mod(int *fftnum)
{
unsigned int fdl=0;
unsigned int vfft;
float bum;
unsigned long bufz1;
unsigned long bufz2;
for( fdl=0;fdl<1024;fdl++)
{
bufz1 = abs(fftnum[fdl*2]);
bufz2 = abs(fftnum[fdl*2+1]);
bufz1 = bufz1*bufz1;
bufz2 = bufz2*bufz2;
bufz1 = bufz1+bufz2; //算出功率值
bum =(float)bufz1;
bum = sqrt(bum);
vfft =(int)bum;
fftnum[fdl] = vfft;
} //将模值计算出存在前全局数组的1024
}
//************************************************** 3
//函数输入:全局数组source
//函数输出:频谱排列的序号 调用后频谱序号按照频谱小到大排列在数组
//函数说明:
void account_order(int *fftnum)
{
int num1,num2,re1,re2,ref;
unsigned char flagmp=1;
int buforder[1024];
for(num1=0;num1<1024;num1++) //初始序列
{
buforder[num1]=num1;
}
for(num1=0;(num1<1024)&&(flagmp==1);num1++)
{ flagmp=0;
for(num2=0;num2<1024-num1;num2++)
{ re1= fftnum[buforder[num2]];
re2= fftnum[buforder[num2+1]];
if(re1>re2)
{
flagmp = 1;
ref = buforder[num2];
buforder[num2] = buforder[num2+1];
buforder[num2+1] = ref;
}
}
}
for( num1=0;num1<1024;num1++)
{
fftnum[2047-num1]=buforder[num1];
}
}
//************************************************** 4
//函数输入: 全局数组source
//函数输出:各个频率分量的功率之和 --总功率(电压的平方和后开根号)
//函数说明: 返回数据为32位数据
int account_pall(int *fftnum)
{
int numb;
float pk11;
unsigned long sumall=0,sumall1=0;
for(numb=0;numb<1024;numb++)
{ sumall1= fftnum[numb];
sumall=sumall+sumall1*sumall1;
}
pk11 = sumall;
pk11 = sqrt(pk11);
if(pk11>0x7fff) pk11 = 0x7fff;
numb = (int)pk11;
return(numb);
}
//************************************************** 5
//函数输入: 全局数组source
//函数输出:信号的失真度
//函数说明: 返回数据为32位浮点数据
float shizhd(int *fftnum)
{
int nums,nums1;
long re1,sum1;
int fftn;
float sun1,sun2,r;
sun1 = 0;
sun2 = 0;
sum1 = 0;
nums = fftnum[1024];
for(nums1=0;nums1<1024;nums1++)
{
if((nums+fftnum[1024])<1024)
{
nums=nums+fftnum[1024];
re1=fftnum[nums];
re1=re1*re1;
sum1=sum1+re1;
}
else
break;
}
sun1 = sum1;
sun1 = sqrt(sun1);
fftn = fftnum[fftnum[1024]];
sun2 = fftn ;
r= sun1/sun2;
return(r);
}
//************************************************** 6
//函数输入: 排序后频率分量的位置。 0-1023表示自然顺序;1024-2047表示排序后位置
//函数输出: 该频率分量的功率值 Dbm
//函数说明: 返回数据为32位浮点数据 频率的分贝数。
float account_dbm(int volt0,unsigned int K_ff)
{
float pa0,pa1,pa;
pa0 = volt0;
pa1 = K_ff;
pa = log10(2*pa0/pa1)*20+log10(20)*10;
return (pa);
}
//************************************************** 7
//函数输入: 全局数组source
//函数输出: 判断输入信号的周期性,若为周期则返回周期值,若为非周期则返回0;
//函数说明: 返回数据为32位浮点数据 周期毫秒数。
float cyc_jud(int *fftnum)
{
float cyc1,cyc2;
cyc1 = account_pall(fftnum);
cyc1 = cyc1/1024;
cyc2 = fftnum[fftnum[1024]];
if(cyc2/cyc1>10)return(fftnum[1024]);
else return(0);
}
//************************************************** 8
//函数输入: 全局数组source
//函数输出: 判断输入信号的频率分量个数;
//函数说明: 返回数据unint 。
unsigned int fnum_jud(int *fftnum)
{
unsigned int fyc1,fyc2;
fyc2 =fftnum[fftnum[1024]];
fyc2 = fyc2/512;
for(fyc1=0;fyc1<1024;fyc1++)
{
if(fftnum[fftnum[fyc1+1024]]<fyc2) break;
}
return(fyc1);
}
//************************************************** 9
//函数输入: 全局数组source
//函数输出: 各频率分量的均方根; 带入频率转换函数就可以转换出DBm数
//函数说明: 返回数。
int sum_fp(int *fftnum)
{
int fyc1,fyc2 ;
unsigned long fycc1=0,fycc2=0;
float fycc;
fycc1=0;
fycc2=0;
fyc2 = fnum_jud(fftnum) ;
for(fyc1=0;fyc1<fyc2;fyc1++);
{ fycc1= fftnum[fftnum[fyc1+1024]];
fycc2=fycc2+fycc1*fycc1;
}
fycc = fycc2;
fycc = sqrt(fycc);
// if(fycc>0x7fff) fycc = 0x7fff;
fyc1 = (int)fycc;
return(fyc1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -