?? main.c
字號:
#include "include.h"
#include <math.h>
#if FFT_SAMPLE
int hd_u[3][(FFT_N/2)-2]; /* 三相電壓2-15次諧波畸變率*/
int hd_i[3][(FFT_N/2)-2]; /* 三相電流2-15次諧波畸變率*/
int thd_u[3]; /* 三相電壓諧波總畸變率 */
int thd_i[3]; /* 三相電流諧波總畸變率 */
int thd_u_even[3]; /* 三相電壓偶次諧波畸變率 */
int thd_u_odd[3]; /* 三相電壓奇次諧波畸變率 */
int thd_i_even[3]; /* 三相電流偶次諧波畸變率 */
int thd_i_odd[3]; /* 三相電流奇次諧波畸變率 */
int k_i[3]; /* 電流K因子 */
int k_u[3]; /* 電壓K因子 */
/* 2005.9.16為了解決局部變量太多導致堆棧溢出的問題,
把fft模塊定義的局部變量定義為全局變量 */
double ur[FFT_N/2], ui[FFT_N/2], ir[FFT_N/2], ii[FFT_N/2]; /*電壓電流的實部和虛部*/
complex k[FFT_N]; /*fft算法模塊輸入輸出值*/
double u_even_sum, u_odd_sum, u_total_sum, i_even_sum, i_odd_sum, i_total_sum;/*電壓電流畸變率計算中間值*/
double k_sum_u, sum_u, k_sum_i, sum_i; /*K因子計算中間值*/
#endif
const int demo_u_sample[64] =
{
0,527,609,823,945,1126,1249,1402,
1511,1635,1720,1817,1878,1938,1964,1995,
1990,1981,1944,1902,1826,1755,1650,1545,
1413,1284,1131,980,805,647,453,301,
0,-301,-453,-647,-805,-980,-1131,-1284,
-1413,-1545,-1650,-1755,-1826,-1902,-1944,-1981,
-1990,-1995,-1964,-1938,-1878,-1817,-1720,-1635,
-1511,-1402,-1249,-1126,-945,-823,-609,-527
};
const int demo_i_sample[64] =
{
0,851,821,1053,1114,1289,1362,1506,
1572,1691,1744,1832,1862,1920,1924,1951,
1928,1925,1874,1842,1766,1700,1600,1507,
1380,1274,1122,1001,830,699,507,401,
0,-401,-507,-699,-830,-1001,-1122,-1274,
-1380,-1507,-1600,-1700,-1766,-1842,-1874,-1925,
-1928,-1951,-1924,-1920,-1862,-1832,-1744,-1691,
-1572,-1506,-1362,-1289,-1114,-1053,-821,-851
};
void fft_calc();
void main()
{
while(1)
{
fft_calc();
}
}
void fft_calc()
{
unsigned char i,j,l;
for( i = 0; i < 3;i ++ )
{
l = 64 / FFT_N;
for (j=0;j<FFT_N;j++) /* 輸入的電流電壓實序列,組成一個復序列*/
{
k[j].r = demo_u_sample[j*l];
k[j].i = demo_i_sample[j*l];
}
fft( FFT_N,&k );
/* 根據傅立葉計算公式,計算結果除以N/2*/
for (j=1;j<(FFT_N/2);j++)
{
ur[j] = (k[j].r+k[FFT_N-j].r)/FFT_N;
ui[j] = (k[j].i-k[FFT_N-j].i)/FFT_N;
ir[j] = (k[j].i+k[FFT_N-j].i)/FFT_N;
ii[j] = (k[FFT_N-j].r-k[j].r)/FFT_N;
}
/* 只需要對(N/2-1)次以下的諧波進行分析 */
/* 幅值X(k)=sqrt(ak^2+bk^2) */
for( j = 1; j <(FFT_N/2); j ++ )
{
k[j].r=fSqrt(ur[j]*ur[j]+ui[j]*ui[j]);
k[j].i=fSqrt(ir[j]*ir[j]+ii[j]*ii[j]);
/* 計算諧波有效值時幅值除以根號2 */
k[j].r = k[j].r * 0.7071068;
k[j].i = k[j].i * 0.7071068;
}
/* ********計算諧波畸變率和K因子*************/
u_even_sum = u_odd_sum = u_total_sum = 0;
i_even_sum = i_odd_sum = i_total_sum = 0;
for ( j = 2; j < (FFT_N/2); j ++ )
{
u_total_sum += k[j].r * k[j].r;
i_total_sum += k[j].i * k[j].i ;
if( (j-1) % 2 == 0)
{
u_odd_sum += k[j].r * k[j].r ;
i_odd_sum += k[j].i * k[j].i ;
}
if( j % 2 == 0)
{
u_even_sum += k[j].r * k[j].r ;
i_even_sum += k[j].i * k[j].i ;
}
hd_u[i][j-2] = k[j].r * 10000L / k[1].r ; /*各次諧波畸變率*/
hd_i[i][j-2] = k[j].i * 10000L / k[1].i;
}
k_sum_u= sum_u = k_sum_i= sum_i = 0;
for ( j = 1; j < (FFT_N/2); j ++ )
{
k_sum_u += k[j].r * k[j].r * j * j;
sum_u += k[j].r * k[j].r;
k_sum_i += k[j].i * k[j].i * j * j;
sum_i += k[j].i * k[j].i;
}
/* 諧波畸變率單位%,保留1位小數*/
thd_u[i] = fSqrt( u_total_sum ) * 10000L / k[1].r;
thd_u_odd[i] = fSqrt( u_odd_sum ) * 10000L / k[1].r;
thd_u_even[i] = fSqrt( u_even_sum ) * 10000L / k[1].r;
thd_i[i] = fSqrt( i_total_sum ) * 10000L / k[1].i;
thd_i_odd[i] = fSqrt( i_odd_sum ) * 10000L /k[1].i;
thd_i_even[i] = fSqrt( i_even_sum ) * 10000L / k[1].i;
/* 計算K因子,保留1位小數*/
k_i[i] = ( k_sum_i / sum_i ) * 100L;
k_u[i] = ( k_sum_u / sum_u )* 100L;
/**********諧波畸變率和K因子計算結束*********/
#if 0 /* 不需要計算基波及諧波的幅值 */
for ( j = 2; j < (FFT_N/2); j ++ )
{
/* 電壓保留兩位小數,電流保留3位小數*/
/* 計算結果為一次側的值*/
k[j].r = (k[j].r * 19250L / 10000L) * volts_scale;
k[j].i = (k[j].i * 10728L / 10000L) * amps_scale;
}
#endif
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -