📄 epower_fft1024r.c
字号:
/* ==============================================================================
System Name: Real FFT - Software Test Bench (STB)
File Name: Epower_fft1024r.C
Description: Primary System file for demonstrating the Real FFT module
Originator: Advanced Embeeded Control (AEC) - Texas Instruments
Target dependency: x28x
Description:
=============================================================================== */
#include "Epower_28x.h"
/* Create an Instance of FFT module */
RFFT32 fft = RFFT32_1024P_DEFAULTS;
extern long ipcb[1026];
extern long mag[513];
/* 定义三相63次谐波的有功功率和无功功率 */
extern int p_a[64];
extern int q_a[64];
extern int p_b[64];
extern int q_b[64];
extern int p_c[64];
extern int q_c[64];
/* 定义总的有效功率和无功功率 */
extern long sum_p[3];
extern long sum_q[3];
/* FFT运算所需数组 */
extern int fftdata_ua[1024];
extern int fftdata_ub[1024];
extern int fftdata_uc[1024];
extern int fftdata_ia[1024];
extern int fftdata_ib[1024];
extern int fftdata_ic[1024];
/* FFT电压、电流值(复数形式) */
extern int fft_ua[128];
extern int fft_ub[128];
extern int fft_uc[128];
extern int fft_ia[128];
extern int fft_ib[128];
extern int fft_ic[128];
/* FFT实时数据输出(用于存储) */
extern long mag_ua[64];
extern long mag_ub[64];
extern long mag_uc[64];
extern long mag_ia[64];
extern long mag_ib[64];
extern long mag_ic[64];
/* 表示FFT运算的标志符 */
extern Uint16 fftflag;
/* 表示功率运算的标志符 */
extern Uint16 powerflag;
/* 表示总功率运算的标志符 */
extern Uint16 powersflag;
const int angleamend[128] = {\
/* 0.11 0.22 0.33 0.44 0.55 0.66 0.77 0.88 */
8192,16,8192,31,8192,47,8192,63,8192,79,8191,94,8191,110,8191,126,\
/* 0.99 1.10 1.21 1.32 1.43 1.54 1.65 1.76 */
8191,142,8190,157,8190,173,8190,189,8189,204,8189,220,8189,236,8188,252,\
/* 1.87 1.98 2.09 2.20 2.31 2.42 2.53 2.64 */
8188,267,8187,283,8187,299,8186,314,8185,330,8185,346,8184,362,8183,377,\
/* 2.75 2.86 2.97 3.08 3.19 3.30 3.41 3.52 */
8183,393,8182,409,8181,424,8180,440,8179,456,8178,472,8177,487,8177,503,\
/* 3.63 3.74 3.85 3.96 4.07 4.18 4.29 4.40 */
8176,519,8175,534,8174,550,8172,566,8171,581,8170,597,8169,613,8168,628,\
/* 4.51 4.62 4.73 4.84 4.95 5.06 5.17 5.28 */
8167,644,8165,660,8164,676,8163,691,8161,707,8160,723,8159,738,8157,754,\
/* 5.39 5.50 5.61 5.72 5.83 5.94 6.05 6.16 */
8156,770,8154,785,8153,801,8151,816,8150,832,8148,848,8146,863,8145,879,\
/* 6.27 6.38 6.49 6.60 6.71 6.82 6.93 7.04 */
8143,895,8141,910,8140,926,8138,942,8136,957,8134,973,8132,988,8130,1004};
/* Define window Co-efficient Array and place the
.constant section in ROM memory */
const long win[512] = HAMMING1024;
/* Create an instance of FFTRACQ module */
RFFT32_ACQ acq = FFTRACQ_DEFAULTS;
void FFT1024RINIT(void)
{
/* Initialize the ia acquisition module */
acq.buffptr = ipcb;
acq.tempptr = ipcb;
acq.size = 1024;
acq.count = 1024;
acq.acqflag = 1;
/* Initialize FFT module */
fft.ipcbptr = ipcb;
fft.magptr = mag;
fft.winptr = (long *)win;
fft.init(&fft);
/*---------------------------------------------------------------------------
Nothing running in the background at present
----------------------------------------------------------------------------*/
}
void FFT1024R(int datain[])
{
Uint16 i;
for(i=0;i<1024;i++)
{
acq.input = ((unsigned long)datain[i]) << 16;
acq.update(&acq);
}
//RFFT32_brev(data,ipcb,FFTLENGTH);
// RFFT32_brev(ipcb,ipcb,N); // Input samples in Real Part
fft.win(&fft);
// RFFT32_brev(ipcb,ipcb,N);
// RFFT32_brev(ipcb,ipcb,N); // Input after windowing
fft.calc(&fft);
fft.split(&fft);
fft.mag(&fft);
acq.acqflag=1; // Enable the next acquisition
}
void EpowerFFT(void)
{
Uint16 i,j,m;
if((fftflag == 1)&&(powerflag == 0))
{
FFT1024R(fftdata_ua);
m = 0;
for(i=4;i<260;i+=4)
{
mag_ua[m] = mag[i];
m ++;
}
j = 0;
for(i=8;i<520;i+=8)
{
fft_ua[j] = (int)(ipcb[i] >> 16);
j ++;
fft_ua[j] = (int)(ipcb[i + 1] >> 16);
j ++;
}
FFT1024R(fftdata_ub);
m = 0;
for(i=4;i<260;i+=4)
{
mag_ub[m] = mag[i];
m ++;
}
j = 0;
for(i=8;i<520;i+=8)
{
fft_ub[j] = (int)(ipcb[i] >> 16);
j ++;
fft_ub[j] = (int)(ipcb[i + 1] >> 16);
j ++;
}
FFT1024R(fftdata_uc);
m = 0;
for(i=4;i<260;i+=4)
{
mag_uc[m] = mag[i];
m ++;
}
j = 0;
for(i=8;i<520;i+=8)
{
fft_uc[j] = (int)(ipcb[i] >> 16);
j ++;
fft_uc[j] = (int)(ipcb[i + 1] >> 16);
j ++;
}
FFT1024R(fftdata_ia);
m = 0;
for(i=4;i<260;i+=4)
{
mag_ia[m] = mag[i];
m ++;
}
j = 0;
for(i=8;i<520;i+=8)
{
fft_ia[j] = (int)(ipcb[i] >> 16);
j ++;
fft_ia[j] = (int)(ipcb[i + 1] >> 16);
j ++;
}
FFT1024R(fftdata_ib);
m = 0;
for(i=4;i<260;i+=4)
{
mag_ib[m] = mag[i];
m ++;
}
j = 0;
for(i=8;i<520;i+=8)
{
fft_ib[j] = (int)(ipcb[i] >> 16);
j ++;
fft_ib[j] = (int)(ipcb[i + 1] >> 16);
j ++;
}
FFT1024R(fftdata_ic);
m = 0;
for(i=4;i<260;i+=4)
{
mag_ic[m] = mag[i];
m ++;
}
j = 0;
for(i=8;i<520;i+=8)
{
fft_ic[j] = (int)(ipcb[i] >> 16);
j ++;
fft_ic[j] = (int)(ipcb[i + 1] >> 16);
j ++;
}
fftflag = 0;
powerflag = 1;
}
}
void CurrentModify(void)
{
Uint16 i;
int a,b,e,f;
long c,d;
/* Angle Modify */
for(i=0;i<128;i+=2) // IA
{
a = fft_ia[i];
b = fft_ia[i +1];
c = a*angleamend[i];
d = b*angleamend[i + 1];
e = (int)(c >> 16);
f = (int)(d >> 16);
fft_ia[i] = e + f;
c = b*angleamend[i];
d = a*angleamend[i + 1];
e = (int)(c >> 16);
f = (int)(d >> 16);
fft_ia[i] = e - f;
}
for(i=0;i<128;i+=2) // IB
{
a = fft_ib[i];
b = fft_ib[i +1];
c = a*angleamend[i];
d = b*angleamend[i + 1];
e = (int)(c >> 16);
f = (int)(d >> 16);
fft_ib[i] = e + f;
c = b*angleamend[i];
d = a*angleamend[i + 1];
e = (int)(c >> 16);
f = (int)(d >> 16);
fft_ib[i] = e - f;
}
for(i=0;i<128;i+=2) // IC
{
a = fft_ic[i];
b = fft_ic[i +1];
c = a*angleamend[i];
d = b*angleamend[i + 1];
e = (int)(c >> 16);
f = (int)(d >> 16);
fft_ic[i] = e + f;
c = b*angleamend[i];
d = a*angleamend[i + 1];
e = (int)(c >> 16);
f = (int)(d >> 16);
fft_ic[i] = e - f;
}
/* Scope Modify */
}
/* 谐波功率计算程序 */
void PowerCompute(void)
{
long a,b,c,d;
Uint16 i,j;
if((powerflag == 1)&&(powersflag == 0))
{
CurrentModify();
j = 0;
for(i=0;i<128;i+=2)
{
a = fft_ua[i] * fft_ia[i];
b = fft_ua[i + 1] * fft_ia[i + 1];
c = fft_ua[i + 1] * fft_ia[i];
d = fft_ua[i] * fft_ia[i + 1];
p_a[j] = ((a + b) >> 16);
q_a[j] = ((c - d) >> 16);
j ++;
}
j = 0;
for(i=0;i<128;i+=2)
{
a = fft_ub[i] * fft_ib[i];
b = fft_ub[i + 1] * fft_ib[i + 1];
c = fft_ub[i + 1] * fft_ib[i];
d = fft_ub[i] * fft_ib[i + 1];
p_b[j] = ((a + b) >> 16);
q_b[j] = ((c - d) >> 16);
j += 2;
}
j = 0;
for(i=0;i<128;i+=2)
{
a = fft_uc[i] * fft_ic[i];
b = fft_uc[i + 1] * fft_ic[i + 1];
c = fft_uc[i + 1] * fft_ic[i];
d = fft_uc[i] * fft_ic[i + 1];
p_c[j] = ((a + b) >> 16);
q_c[j] = ((c - d) >> 16);
j += 2;
}
powerflag = 0;
powersflag = 1;
}
}
/* 总的有功功率、无功功率计算 */
void PowerSum(void)
{
Uint16 i;
if(powersflag == 1)
{
for(i=0;i<64;i++) sum_p[0] += p_a[i];
for(i=0;i<64;i++) sum_p[1] += p_b[i];
for(i=0;i<64;i++) sum_p[2] += p_c[i];
for(i=0;i<64;i++) sum_q[0] += q_a[i];
for(i=0;i<64;i++) sum_q[1] += q_a[i];
for(i=0;i<64;i++) sum_q[2] += q_a[i];
powersflag = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -