//rms_calc_64.c
#include "p30f6014a.h"
#include "math.h"
#define NN 64
#define PI 3.1415926
unsigned long Vs1[NN];
extern signed long sqrt_int(signed long x);
void sample_data_simulate(unsigned long VS[])
{
int i;
for(i=0;i<NN;i++)
{
VS[i]=2000*(1+sin(i*2*PI/64.0));
}
}
///
float rms_calc(unsigned long Va[])
{
signed long temp=0;
signed long v_temp[NN];
int i;
float v_rms;
for(i=0;i<NN;i++){temp=temp+Va[i];}
temp=temp/NN;
for(i=0;i<NN;i++) {v_temp[i]=Va[i]-temp;}//cut off dc offset
temp=0;
for(i=0;i<64;i++){temp=temp+v_temp[i]*v_temp[i];}
//VL_2nd=sqrt_int(temp)/19;//定标
v_rms=sqrt_int(temp/NN);//定
Nop();
return(v_rms);
}
/
void sample_calc_test(void)
{
float V_rms=0;
sample_data_simulate(Vs1);
Nop();
V_rms=rms_calc(Vs1);
Nop();
}
//---------------------------------------------------------
signed long sqrt_int(signed long x)
{
signed long temp=0;
signed char i;
for(i=15;i>=0;i--)
{
temp=temp|(((signed long)1)<<i);
if((temp*temp)>x)
{temp=temp&(~(((signed long)1)<<i));}
}
return (temp);
}
//---------------------------------------------------------