📄 dxdb1.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 + -