//根据输入量和定值计算32个采样点中出现干扰点的幅值
#include<iostream.h>
#include<math.h>
#define SQURT2 1.4142
#define PI 3.141593
//按32个采样点计算得出的实部和虚部需要乘的系数 基波
const double RE_32[32] = {0, 0.1951, 0.3827, 0.5556, 0.7072, 0.8315, 0.9239, 0.9808,
1, 0.9808, 0.9239, 0.8315, 0.7071, 0.5556, 0.3827, 0.1951, 0,
-0.1951, -0.3827,-0.5556, -0.7071, -0.8315, -0.9239, -0.9808, -1,
-0.9808, -0.9239, -0.8315, -0.7071, -0.5556, -0.3827, -0.1951}; //sin值
const double IM_32[32] = {1, 0.9808, 0.9239, 0.8315, 0.7071, 0.5556, 0.3827, 0.1951, 0,
-0.1951, -0.3827, -0.5556, -0.7071, -0.8315, -0.9239, -0.9808,
-1, -0.9808, -0.9239, -0.8315, -0.7071, -0.5556, -0.3827, -0.1951,
0, 0.1951, 0.3827, 0.5556, 0.7071, 0.8315, 0.9238, 0.9808}; //cos值
//算二次谐波
const int UI_RE_2[]={392,724,946,1024,946,724,392,0,
-392,-724,-946,-1024,-946,-724,-392,0,
392,724,946,1024,946,724,392,0,
-392,-724,-946,-1024,-946,-724,-392,0,
};
const int UI_IM_2[]={946,724,392,0,-392,-724,-946,-1024,
-946,-722,-392,0,392,724,946,1024,
946,724,392,0,-392,-724,-946,-1024,
-946,-724,-392,0,392,724,946,1024,
};
const double Id[] = {55, 51.668, 48.537, 45.597, 42.834, 40.239, 37.801, 35.511, 33.359,
31.338, 29.439, 27.656, 25.980, 24.406, 22.927, 21.538, 20.233, 19.007,
17.856, 16.774, 15.758, 14.803, 13.906, 13.064, 12.272, 11.529, 10.830,
10.174, 9.558, 8.879, 8.435, 7.923};
//计算的衰减波形为Id=I_VALUE*EXP(-t/Tjd) 输入I_VALUE 和 Tjd
void main()
{
double I_VALUE,Tjd;
cout<<"输入幅值和时间参数:"<<endl;
cin>>I_VALUE>>Tjd;
double sum_re=0;
double sum_im=0;
double sum_re0=0;
// double sum_im0=0;
double sum_re2=0;
double sum_im2=0;
double Cal_Value,Cal_Value2,Cal_Value0;
double Cal_Re[32],Cal_Re2[32],Cal_Re0[32]; //傅氏计算点乘以系数的值
double Cal_Im[32],Cal_Im2[32];
for(int i=0;i<32;i++)
{
Cal_Re[i] = 0;
Cal_Im[i] = 0;
Cal_Re2[i] = 0;
Cal_Im2[i] = 0;
Cal_Re0[i] = 0;
}
double *Re_Ptr, *Im_Ptr,*Re_Ptr2, *Im_Ptr2,*Re_Ptr0;
Re_Ptr = &Cal_Re[0];
Im_Ptr = &Cal_Im[0];
Re_Ptr2 = &Cal_Re2[0];
Im_Ptr2 = &Cal_Im2[0];
Re_Ptr0 = &Cal_Re0[0];
for(int j=0; j<32; j++)
{
*Re_Ptr2++ = I_VALUE*exp(-0.000625*j/Tjd)*UI_RE_2[j];
*Im_Ptr2++ = I_VALUE*exp(-0.000625*j/Tjd)*UI_IM_2[j];
sum_re2 += Cal_Re2[j];
sum_im2 += Cal_Im2[j];
*Re_Ptr++ = I_VALUE*exp(-0.000625*j/Tjd)*RE_32[j];
*Im_Ptr++ = I_VALUE*exp(-0.000625*j/Tjd)*IM_32[j];
sum_re += Cal_Re[j];
sum_im += Cal_Im[j];
*Re_Ptr0++ = I_VALUE*exp(-0.000625*j/Tjd);
sum_re0 += Cal_Re0[j];
}
sum_re2 = sum_re2/1024/16;
sum_im2 = sum_im2/1024/16;
sum_re = sum_re/16;
sum_im = sum_im/16;
sum_re0 = sum_re0/32;
Cal_Value2 = sqrt(sum_re2*sum_re2+sum_im2*sum_im2);
Cal_Value = sqrt(sum_re*sum_re+sum_im*sum_im);
cout<<"二次谐波有效值"<<Cal_Value2<<endl;
cout<<"基波分量"<<Cal_Value<<endl;
cout<<"直流分量"<<sum_re0<<endl;
cout<<sum_re<<endl;
cout<<sum_im<<endl;
}
/*void main()
{
//假定函数都是SIN函数 且初始角为0
double input_value,input_angl,set_value; //输入参数定义
double sum_re=0;
double sum_im=0;
double Cal_Value;
double Cal_Re[32]; //傅氏计算点乘以系数的值
double Cal_Im[32];
for(int i=0;i<32;i++)
{
Cal_Re[i] = 0;
Cal_Im[i] = 0;
}
double *Re_Ptr, *Im_Ptr;
Re_Ptr = &Cal_Re[0];
Im_Ptr = &Cal_Im[0];
for(int j=0; j<32; j++)
{
*Re_Ptr++ = Id[j]*UI_RE_2[j];
*Im_Ptr++ = Id[j]*UI_IM_2[j];
sum_re += Cal_Re[j];
sum_im += Cal_Im[j];
}
cout<<sum_re<<endl;
cout<<sum_im<<endl;
}*/
/*void main()
{
//假定函数都是SIN函数 且初始角为0
double sum_re=0;
double sum_im=0;
double Cal_Value;
double Cal_Re[32]; //傅氏计算点乘以系数的值
double Cal_Im[32];
for(int i=0;i<32;i++)
{
Cal_Re[i] = 0;
Cal_Im[i] = 0;
}
double *Re_Ptr, *Im_Ptr;
Re_Ptr = &Cal_Re[0];
Im_Ptr = &Cal_Im[0];
for(int j=0; j<32; j++)
{
*Re_Ptr++ = 55*exp(-0.0625*j)*UI_RE_2[j];
*Im_Ptr++ = 55*exp(-0.0625*j)*UI_IM_2[j];
sum_re += Cal_Re[j];
sum_im += Cal_Im[j];
}
sum_re = sum_re/1024/16;
sum_im = sum_im/1024/16;
Cal_Value = sqrt(sum_re*sum_re+sum_im*sum_im);
cout<<"有效值"<<Cal_Value<<endl;
cout<<sum_re<<endl;
cout<<sum_im<<endl;
}*/
/* Cal_Value = sqrt(sum_re*sum_re)/16;
cout<<"输入有效值为"<<'\t'<<Cal_Value<<endl;
//输出所有满足定值干扰点的值
double dSum_Re[32] = {0};
double over_fft = set_value*16;//=sum_re
double RoughDot[32];
for(int k=0;k<32;k++)
{
for(int i=0;i<32;i++)
{
if(i!=k)
dSum_Re[k] += Cal_Re[i];
}
if(RE_32[k]!=0)
RoughDot[k] = (over_fft - dSum_Re[k])/RE_32[k];
else RoughDot[k] = 0;
}
cout<<"对应0位置的坏点幅值为"<<RoughDot[0]<<endl;
cout<<"与原来值的差"<<fabs(RoughDot[0])<<endl;
cout<<"与右边点差值"<<fabs(RoughDot[0]-input_value*sin((2*PI*1)/32))<<endl;
for(int a=1;a<31;a++)
{
cout<<"对应"<<a<<"位置的坏点幅值为"<<RoughDot[a]<<endl;
cout<<"与原来值的差"<<fabs(RoughDot[a]-input_value*sin((2*PI*a)/32))<<endl;
cout<<"与左边点差值"<<fabs(RoughDot[a]-input_value*sin((2*PI*(a-1))/32))<<endl;
cout<<"与右边点差值"<<fabs(RoughDot[a]-input_value*sin((2*PI*(a+1))/32))<<endl;
}
cout<<"对应"<<31<<"位置的坏点幅值为"<<RoughDot[31]<<endl;
cout<<"与原来值的差"<<fabs(RoughDot[31]-input_value*sin((2*PI*31)/32))<<endl;
cout<<"与左边点差值"<<fabs(RoughDot[31]-input_value*sin((2*PI*30)/32))<<endl;*/