打印

求助:关于FFT转换的程序问题

[复制链接]
1926|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dwlovehome|  楼主 | 2011-3-13 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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.
}

Program.rar

8.57 KB

之歌就是下载下来的全部文件了

沙发
dwlovehome|  楼主 | 2011-3-14 14:58 | 只看该作者
额,木有人知道的么?高手指点下迷津啊~~~~

使用特权

评论回复
板凳
dwlovehome|  楼主 | 2011-3-14 14:58 | 只看该作者
额,木有人知道的么?高手指点下迷津啊~~~~

使用特权

评论回复
地板
wujinliang007| | 2011-3-14 15:16 | 只看该作者
初来砸到

使用特权

评论回复
5
nicklee112233| | 2011-3-14 15:57 | 只看该作者
看来解铃还需系铃人吧,谁写的程序谁最清楚,呵呵!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

41

帖子

0

粉丝