本帖最后由 dwlovehome 于 2011-3-13 09:39 编辑
是这样的,前段时间在往上面下载了一个FFT的程序,是用PIC18做的。这一段时间在研究。不过里面有些看不懂:看不懂的程序如下(下来的完整程序在附件):
/* ************************************************************************
** 函 数 名:void ADCHD()
** 功能描述:单通道高频采样,数据处理,显示.
*************************************************************************** */
void ADCHD()
{
long D,SHU; //数据.
int n_x,k_x,i; //循环参数.
float Ur,Ui,Urn,Uin; //数据处理中间变量.
ADWORDS=ADCAN+7; //确定MAX197控制字.
for(ADD=0;ADD<64;ADD++) //采样.
{
OUTADC(ADWORDS); //送控制字.
DELAY(0); //延时.
DATA[0][ADD]=INADC(); //读取数据.
}
for(ADD=0;ADD<64;ADD++) //显示波形.
{
D=(int)(40.0*DATA[0][ADD]/4096.0); //取数据.
LCDPIEX(ADD+64,40-D); //显示.
}
for(n_x=0;n_x<5;n_x++) //计算.
{
Urn=0.0; //实部.
Uin=0.0; //虚部.
for(k_x=0;k_x<32;k_x++) //n_x次谐波.
{
D=DATA[0][k_x]; //取数据计算.
Urn=Urn+D/409.6*cos((2*n_x+1)*(k_x+1)*0.196);//此处的为什么是D/409.6?一只没想明白!!!
Uin=Uin+D/409.6*sin((2*n_x+1)*(k_x+1)*0.196);
}
Ur=Urn/16.0; //此处除以16,为什么?
Ui=Uin/16.0; //
SHU=(long)(100*sqrt(Ur*Ur+Ui*Ui));//在这里为什么要乘以100,而下面的函数只乘以760!!!!这里算的应该是第i次谐波的幅值,按公式不是等于2/N*sqrt(Ur*Ur+Ui*Ui)么?
UI[0][n_x]=SHU; //第n_x次谐波幅值.
UI[0][5]=SHU*SHU+UI[0][5]; //
}
UI[0][5]=(long)sqrt(UI[0][5]); //总幅值.
for(i=0;i<5;i++) //
{
SHU=UI[0]*1000; //乘以1000又是为什么?
SHU=SHU/(UI[0][5]); //
UP[0]=SHU; //第i次谐波占有率.
}
SHU=1000*(UI[0][5]-UI[0][0]); //
UP[0][5]=SHU/UI[0][5]; //畸变率.
LCDCLEAN(12,2,126,7); //清除数据显示区.
for(i=0;i<6;i++)
{
OUTNUM(UI[0],1,28,2+i); //显示幅值.
OUTNUM(UP[0],3,56,2+i); //显示占有率.
}
ADWORDS=ADCAN; //还原控制字.
}
/* ************************************************************************
** 函 数 名:void XBFX()
** 功能描述:全周波傅立叶积分计算各次谐波的幅值,并返回结果.
*************************************************************************** */
void XBFX()
{
long D,SHU; //数据.
int n_x,k_x,i,n; //循环参数.
float Ur,Ui,Urn,Uin,UIL[2]; //数据处理中间变量.
for(n=0;n<2;n++) //两路信号.
{
for(n_x=0;n_x<5;n_x++) //计算.
{
Urn=0.0; //实部.
Uin=0.0; //虚部.
for(k_x=0;k_x<32;k_x++) //n_x次谐波.
{
D=DATA[CHAN*2+n][k_x]; //取数据计算.
Urn=Urn+D/409.6*cos((2*n_x+1)*(k_x+1)*0.196);
Uin=Uin+D/409.6*sin((2*n_x+1)*(k_x+1)*0.196);
}
Ur=Urn/16.0; //
Ui=Uin/16.0;
SHU=(long)(760*sqrt(Ur*Ur+Ui*Ui)); //这里为什么成760
UI[n][n_x]=SHU; //
UI[n][5]=SHU*SHU+UI[n][5]; //第n_x次谐波幅值.
if(n_x==0)
UIL[n]=atan(Ui/Ur); //相位.
}
UI[n][5]=(long)sqrt(UI[n][5]); //总幅值.
for(i=0;i<5;i++) //
{
SHU=UI[n]*1000; //
SHU=SHU/(UI[n][5]); //
UP[n]=SHU; //第i次谐波占有率.
}
SHU=1000*(UI[n][5]-UI[n][0]); //
UP[n][5]=SHU/UI[n][5]; //畸变率.
}
L[CHAN]=abs((long)(1000*(UIL[0]-UIL[1])-40)); //功率因数角.//乘以1000的原因是?
S[CHAN]=(long)(UI[0][5]*UI[1][5]); //S.
P[CHAN]=(long)(S[CHAN]*cos(L[CHAN]/1000.0)); //P.为什么又除了1000啊
Q[CHAN]=(long)(S[CHAN]*sin(L[CHAN]/1000.0)); //Q.
} |