电力行业三次谐波计算
公司有机会接触了一下谐波的判断计算方法,这里简单讲一下。其实我们直接在网上找一些FFT运算的C函数,便可以计算各次谐波,但是当我们只需要某些阶次的谐波时,那么运用FFT的话,就会浪费很多时间,这里我们讲的是 直接用C语言实现某一次的谐波含量计算(三次)。
我用的硬件是DSP2812,为保证采样后计算过程不被打断,计算与判断均放在中断中。
一般而言,如果需要计算采样电流的谐波含量的话,那么肯定会有采样平率和计算周期这些等等的说法。因为基波电流是50HZ,一般而言采样频率必须是被采样电流的频率的两倍以上,才能保证被采样信号的不失真。
在这里,我们一个周波采样256个采样点,即采样频率为12800HZ。
算法原理:
而利用滑窗迭代进行改进得到:
为加快计算时间,我们用先要建立一个正炫函数表,然后用查表的方法去得到我么需要的sin函数的256个值。我们下面都用函数来模拟采样数值。
float sinnwt3 =0,cosnwt3 =0;
float ASlidewindow[256];
unsigned char nwt3temp=0 ,DFTslidecount=0;
float An=0 ,Bn ,CurrentDiffA=0,LoadCurrentA=0 ,HaCurrent=0 ;
中断计算程序原理如下:
nwt3temp = (DFTslidecount* 3)&0xff; //nwt3temp 为整型,初始化为0,乘以3是因为计算的是三次谐波,与上0xff,是因为我们只采样256个点,DFTslidecount为计算次数,指向当前采样值存放在ASlidewindow数组中的当前位置。
cosnwt3 = DFTCosTable[nwt3temp]; //DFTCosTable【】是我们提前准备好的COS函数值表,这里直接查表得到我们想要的值,为加快计算速度。
sinnwt3 = DFTSinTable[nwt3temp]; //同上
LoadCurrentA = 60*sqrt(2)*sin(2*PI*(DFTslidecount&0xff)/256)+10*sqrt(2)*sin(2*PI*(DFTslidecount&0xff)*3/256); //采样,用函数模拟,可见50HZ基波电流有效值为60A,三次谐波电流有效值为10A
CurrentDiffA = LoadCurrentA - *(ASlidewindow + DFTslidecount) ; //CurrentDiffA 意为当前采样值
//LoadCurrentA 为当前DFTslidecount指向的位置的采样值
An += CurrentDiffA* cosnwt3/128; //迭代法 已减去了当前位置的采样值,替换了新的采样值
Bn += CurrentDiffA* sinnwt3/128; //同上
*(ASlidewindow + DFTslidecount) = LoadCurrentA; //迭代法 ,替换新的采样值
HaCurrent = (sqrt(PhaseAAn3temp*PhaseAAn3temp+PhaseABn3temp*PhaseABn3temp))/sqrt(2); //计算三次谐波含量,此时已经是有效值,计算结果为10,正好和LoadCurrentA 的函数模拟采样能对应的上。
DFTslidecount++;
注意:在计算之前,要先准备ASlidewindow数组256个采样初始值,或者舍弃掉前面256个计算值,因为第一次进入中断时,ASlidewindow数组中并没有初始值。
到此,整个程序的计算原理只是将以上两张图片中所阐述的DFT滑窗迭代发计算谐波用代码翻译出来。完毕。