⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dxdb1.c

📁 在CCS开发工具下交流采样并实现FFT算法
💻 C
字号:
#include <math.h>
#define N  1024
#pragma DATA_SECTION(Uads,"Uad_Sample");
float Uads[8*N];
#pragma DATA_SECTION(Iads,"Iad_Sample");
float Iads[8*N];
#pragma DATA_SECTION(Har,"Har_analyse");
float Har[N];
#pragma DATA_SECTION(W,"W_xishu");
float W[N];
#define pi 3.141592653589793238
float Urms=0;
float Irms=0;
float P=0,Q=0,S=0;
float PF=0,PH=0,F=0;

void fftr2_dit(float * x,float * w,short n);
void bit_rev(float * x,short n);

void main()
{
  short i=0;
  float e=2.0*pi/N;
  float Usum=0;
  float Isum=0;
  float Psum=0;
  float Qsum=0;
  for(i=0;i<4*N;i++)
  {
     
     Uads[2*i]=1.4142135623730950488*cosf(2*pi*i/N);
     Iads[2*i]=1.4142135623730950488*cosf(2*pi*i/N-pi/3);
     Uads[2*i+1]=0.0;
     Iads[2*i+1]=0.0;
  }
  for(i=0;i<N/2;i++)
  {
     W[2*i]=cosf(i*e);
     W[2*i+1]=sinf(i*e);
  }
  //电压有效值
  for (i=0;i<N;i++)
  {
     Usum =Usum+Uads[2*i]*Uads[2*i];
  }
  Urms=sqrt(Usum/N);
  //电流有效值
  for (i=0;i<N;i++)
  {
    Isum =Isum+Iads[2*i]*Iads[2*i];
  }
  Irms=sqrt(Isum/N);
  //有功功率
  for (i=0;i<N;i++)
  {
    Psum=Psum+Uads[2*i]*Iads[2*i];
  }
  P=Psum/N;
  //无功功率
  for (i=0;i<N;i++)
  {
    Qsum=Qsum+Uads[2*i]*Iads[2*i+2*N/4];
  }
  Q=Qsum/N;
  //视在功功率
  S=sqrtf(P*P+Q*Q);
  //功率因数
  PF=P/S;
  //相位差
  PH=acosf(PF);
  //谐波分析
 bit_rev(Uads,N);
 fftr2_dit(Uads,W,N);
 for(i=0;i<N;i++)
 {
    Har[i]=sqrtf(Uads[2*i]*Uads[2*i]+Uads[2*i+1]*Uads[2*i+1])/512;
 }
}

//位反转
void bit_rev(float * x,short n)
{
    short i,j,k;
    float rtemp,itemp;
    j=0;
    for(i=1;i<(n-1);i++)
    {
      k = n>>1;
      while(k<=j)
      {
        j-=k;
        k>>=1;
      }
      j+=k;
      if(i<j)
      {
        rtemp=x[j*2];
        x[j*2]=x[i*2];
        x[i*2]=rtemp;
        itemp=x[j*2+1];
        x[j*2+1]=x[i*2+1];
        x[i*2+1]=itemp;
      }
    }
}
//时分基2 FFT
void fftr2_dit(float * x,float * w,short n)
{
   short i=0,j=0,k=0,m=0;
   short ie=1,n2=n,ia=0;
   float c=0.0,s=0.0,rtemp=0,itemp=0;
   for(i=n;i>1;i>>=1)
   {
     n2>>=1;
     ia=0;
     for(j=0;j<n2;j++)
     {
       for(k=0;k<ie;k++)
       {
         c=W[2*(k*n2)];
         s=W[2*(k*n2)+1];
         m=ia+ie;
         rtemp=c*x[2*m]   +s*x[2*m+1];
         itemp=c*x[2*m+1] -s*x[2*m];
         x[2*m]  =x[2*ia]  -rtemp;
         x[2*m+1]=x[2*ia+1]-itemp;
         x[2*ia]  =x[2*ia]  +rtemp;
         x[2*ia+1]=x[2*ia+1]+itemp;
         ia++;
       }
       ia+=ie;
     }
     ie<<=1;
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -