电子测量技术大作业.docx
《电子测量技术大作业.docx》由会员分享,可在线阅读,更多相关《电子测量技术大作业.docx(29页珍藏版)》请在冰点文库上搜索。
电子测量技术大作业
电子测量技术大作业
题目一测量数据误差处理
2-21参考例2-2-6的解题过程,用C语言或Matlab设计测量数据误差处理的通用程序,要求如下:
(1)提供测试数据输入、粗大误差判别准则选择等的人机界面;
图1测试数据误差处理的输入
(2)编写程序使用说明;
本题用的是C语言编写的数据误差处理的通用程序,调试编译借助了CodeBlocks软件。
运行exe文件后,只需输入所需测试数据的数目、各数值大小并选择误差处理方式与置信概率即可得出处理结果。
在程序的子函数中已经将ta值表、肖维纳准则表及格拉布斯准则表的所有数据存入,无需人工查表填入。
其他具体程序内容可见附录。
图2程序运行流程图
(3)通过实例来验证程序的正确性。
例2-2-6中的原始数据如下表1
表1测量电压原始数据
测量序号i
1
2
3
4
5
6
7
8
9
10
11
电压/U
2.72
2.75
2.65
2.71
2.62
2.45
2.62
2.70
2.67
2.73
2.74
由书上计算可得:
计算所得结果与图3显示结果近似相等,说明程序编译无误。
图3数据处理后的结果显示
题目二时域反射计
6-14在Multisim环境下,基于TektronixTDS204虚拟示波器设计一种时域反射计,给出电路原理图和实验仿真结果。
(本题设计以时域反射计测量阻抗为例)
(1)时域反射计简介
时域反射计(TDR)用来测量信号在通过某类传输环境传导时引起的反射,如电路板轨迹、电缆、连接器等等。
TDR仪器通过介质发送一个脉冲,把来自“未知”传输环境的反射与标准阻抗生成的反射进行比较。
TDR显示了在沿着一条传输线传播快速阶跃信号时返回的电压波形。
波形结果是入射阶跃和阶跃遇到阻抗偏差时产生的反射的组合。
(2)时域反射计原理
时域反射计TDR是最常用的测量传输线特征阻抗的仪器,它是利用时域反射的原理进行特性阻抗的测量。
图4TDR原理图
(3)时域反射计(TDR)组成
快沿信号发生器:
典型的发射信号的特征是:
幅度200mv,上升时间35ps,频率250kHz方波。
采样示波器:
通用的采样示波器;
探头系统:
连接被测件和TDR仪器。
(4)仿真与结果
图5时域反射计仿真电路
图6信号发生器设置选项
图7信号发生器上升沿时间设置
图8示波器仿真显示结果
在图8中,第一条黄线为终端开路(反射系数为1)时的结果;第二条蓝线为终端有负载阻抗时的结果;第三条为终端短路(反射系数为-1)时的结果。
图9TDR测试信号理论运行特征图
图10被测传输线特征阻抗的计算
附录
#include
#include
//求绝对值的函数,因为“abs”只适用于整数
floatAbs(floata)
{
if(a>0.0)
returna;
return-a;
}
//计算平均值的子函数
floatAverage(floata[],intn)
{
inti;
floatsum=0.0;
for(i=0;i<=n-1;i++)
{
sum+=a[i];
}
returnsum/n;
}
//计算方差的子函数
floatVariance(floata[],intn)
{
inti;
floatsum=0.0;
floatxi=Average(a,n);
for(i=0;i<=n-1;i++)
{
sum+=(a[i]-xi)*(a[i]-xi);
}
return(float)sqrt(sum/(n-1));
}
//删除数组中指定位置的子函数
voidDelete(floata[],intn,inti)
{
intj;
for(j=i;j<=n-2;j++)
{
a[j]=a[j+1];
}
}
//粗大误差处理1
//莱特检验法,出口参数为所剔除坏值的个数
intLaite(floata[],intn)
{
intt=0;//t用来装粗大误差的个数
inti;
intz;
intflag=1;
floataver;
floatvar;
while(flag)
{
z=n;
aver=Average(a,n);
var=Variance(a,n);
for(i=0;i<=n-1;i++)
{
if(Abs(a[i]-aver)>3*var)
{
printf("%f是坏值!
\n",a[i]);
Delete(a,n,i);
n--;
t++;
}
}
if(n==z)flag=0;
}
returnt;
}
//粗大误差处理2
//肖维纳准则
intXiaown(floata[],intn)
{
floatch[38]={0,0,0,0,0,1.65,1.73,1.79,1.86,1.92,1.96,2.00,2.04,2.07,
2.10,2.13,2.16,2.18,2.20,2.22,2.24,2.26,2.28,2.30,
2.32,2.33,2.34,2.35,2.37,2.38,2.39,2.45,2.50,2.58,
2.64,2.74,2.81,3.02
};//肖维纳准则表
intt=0;//t用来装粗大误差的个数
inti;
intz;
intflag=1;
floataver;
floatvar;
while(flag)
{
z=n;
aver=Average(a,n);
var=Variance(a,n);
for(i=0;i<=n-1;i++)
{
if(Abs(a[i]-aver)>ch[n]*var)
{
printf("%f是坏值!
\n",a[i]);
Delete(a,n,i);
n--;
t++;
}
}
if(z==n)flag=0;
}
returnt;
}
//粗大误差处理3
//格拉布斯准则\
//格拉布斯准则表1:
95%
floatGe95(intn)
{
floatGe[30]={0,0,0,1.15,1.46,1.67,1.82,1.94,2.03,
2.11,2.18,2.23,2.29,2.33,2.37,2.41,
2.44,2.47,2.50,2.53,2.56,2.58,2.60,
2.62,2.64,2.66
};
if(n<=25)returnGe[n];
switch(n)
{
case30:
return2.74;
case35:
return2.81;
case40:
return2.87;
case50:
return2.96;
case100:
return3.17;
default:
printf("输入n值错误!
!
!
");
return0.0;
}
}
//格拉布斯准则表2:
99%
floatGe99(intn)
{
floatGe[30]={0,0,0,1.16,1.49,1.75,1.94,2.10,2.22,
2.32,2.41,2.48,2.55,2.61,2.66,2.71,
2.75,2.79,2.82,2.85,2.88,2.91,2.94,
2.96,2.99,3.01
};
if(n<=25)returnGe[n];
switch(n)
{
case30:
return3.10;
case35:
return3.18;
case40:
return3.24;
case50:
return3.34;
case100:
return3.58;
default:
printf("输入n值错误!
!
!
");
return0.0;
}
}
//格拉布斯执行函数
intGlbs(floata[],intn,intm)
{
intt=0;//t用来装粗大误差的个数
inti;
intz;
floataver;
floatvar;
intflag=1,flag1=1,flag2=1;
while(flag)
{
if(m==1)
{
while(flag1)
{
z=n;
aver=Average(a,n);
var=Variance(a,n);
for(i=0;i<=n-1;i++)
{
if(Abs(a[i]-aver)>Ge95(n)*var)
{
printf("%f是坏值!
\n",a[i]);
Delete(a,n,i);
n--;
t++;
}
}
if(z==n)flag1=0;
}
flag=0;
returnt;
}
elseif(m==2)
{
while(flag2)
{
z=n;
aver=Average(a,n);
var=Variance(a,n);
for(i=0;i<=n-1;i++)
{
if(Abs(a[i]-aver)>Ge99(n)*var)
{
printf("%f是坏值!
\n",a[i]);
Delete(a,n,i);
n--;
t++;
}
if(z==n)flag2=0;
}
}
flag=0;
returnt;
}
else
{
printf("输入有错!
!
请重新输入:
\n");
}
}
}
//误差处理子函数
intWucha(floata[],intn,intx,intm)
{
intpa=1;
intt;
inti;
while(pa)
{
if(x==1)
{
pa=0;
t=Laite(a,n);
n=n-t;
printf("处理后的数据如下:
\n\t\t");
for(i=0;i<=n-1;i++)
{
printf("%f\t",a[i]);
}
returnn;
}
elseif(x==2)
{
pa=0;
t=Xiaown(a,n);
n=n-t;
printf("处理后的数据如下:
\n\t\t");
for(i=0;i<=n-1;i++)
{
printf("%f\t",a[i]);
}
returnn;
}
elseif(x==3)
{
pa=0;
t=Glbs(a,n,m);
n=n-t;
printf("处理后的数据如下:
\n\t\t");
for(i=0;i<=n-1;i++)
{
printf("%f\t",a[i]);
}
returnn;
}
elseprintf("输入错误,请重新输入!
\n");
}
}
//判断有无累进性误差的子函数
floatMax(floata[],intn)
{
inti;
floatf=Average(a,n);
floatx,y;
x=Abs(a[0]-f);
for(i=0;i<=n-1;i++)
{
if(Abs(a[i]-f)>=x)
{
x=Abs(a[i]-f);
}
}
returnx;
}
voidMlkf(floata[],intn)
{
inti;
floatsum1=0.0,sum2=0.0;
floatf=Average(a,n);
if(n%2==0)//偶数个
{
for(i=0;i<=n/2-1;i++)
sum1=sum1+(a[i]-f);
for(i=n/2;i<=n-1;i++)
sum2=sum2+(a[i]-f);
printf("\n");
if(Abs(sum1-sum2)>=Max(a,n))
printf("测量中存在累进性系统误差。
\n");
elseprintf("测量中不存在累进性系统误差。
\n");
}
if(n%2==1)//奇数个
{
for(i=0;i<=(n-1)/2-1;i++)
sum1=sum1+(a[i]-f);
for(i=(n+1)/2;i<=n-1;i++)
sum2=sum2+(a[i]-f);
printf("\n");
if(Abs(sum1-sum2)>=Max(a,n))
printf("测量中存在累进性系统误差。
\n");
elseprintf("测量中不存在累进性系统误差。
\n");
}
}
//判断有无周期性误差的子函数
voidZwc(floata[],intn)
{
floatsum=0.0;
inti;
floatf=Average(a,n);
for(i=0;i<=n-2;i++)
{
sum=sum+(a[i]-f)*(a[i+1]-f);
}
if(sum>sqrt(n-1)*Variance(a,n)*Variance(a,n))
printf("测量中存在周期性系统误差。
\n");
elseprintf("测量中不存在周期性系统误差。
\n");
}
//置信区间子函数
floatZhi05(intn)
{
floatz[15]={0,0,1.000,0.816,0.765,0.741,0.727,0.718,0.711,0.706,
0.703,0.700
};
if(n<=11)returnz[n];
switch(n)
{
case15:
return0.691;
case20:
return0.687;
case25:
return0.684;
case30:
return0.683;
case40:
return0.681;
case60:
return0.679;
case120:
return0.677;
case999:
//在这里把999作为无穷大!
return0.674;
default:
printf("输入n值错误!
!
!
");
return0.0;
}
}
floatZhi06(intn)
{
floatz[15]={0,0,1.376,1.061,0.978,0.941,0.920,0.906,0.896,
0.889,0.883,0.879
};
if(n<=11)returnz[n];
switch(n)
{
case15:
return0.866;
case20:
return0.860;
case25:
return0.856;
case30:
return0.854;
case40:
return0.851;
case60:
return0.848;
case120:
return0.845;
case999:
//在这里把999作为无穷大!
return0.842;
default:
printf("输入n值错误!
!
!
");
return0.0;
}
}
floatZhi07(intn)
{
floatz[15]={0,0,1.963,1.386,1.250,1.190,1.156,1.134,1.119,
1.108,1.100,1.093
};
if(n<=11)returnz[n];
switch(n)
{
case15:
return1.074;
case20:
return1.064;
case25:
return1.058;
case30:
return1.055;
case40:
return1.050;
case60:
return1.046;
case120:
return1.041;
case999:
//在这里把999作为无穷大!
return1.036;
default:
printf("输入n值错误!
!
!
");
return0.0;
}
}
floatZhi08(intn)
{
floatz[15]={0,0,3.078,1.886,1.638,1.553,1.476,1.440,1.415,
1.397,1.383,1.372
};
if(n<=11)returnz[n];
switch(n)
{
case15:
return1.341;
case20:
return1.325;
case25:
return1.316;
case30:
return1.310;
case40:
return1.303;
case60:
return1.296;
case120:
return1.289;
case999:
//在这里把999作为无穷大!
return1.282;
default:
printf("输入n值错误!
!
!
");
return0.0;
}
}
floatZhi09(intn)
{
floatz[15]={0,0,6.314,2.920,2.353,2.132,2.015,1.943,1.895,
1.860,1.833,1.812
};
if(n<=11)returnz[n];
switch(n)
{
case15:
return1,753;
case20:
return1.725;
case25:
return1.708;
case30:
return1.697;
case40:
return1.684;
case60:
return1.671;
case120:
return1.658;
case999:
//在这里把999作为无穷大!
return1.645;
default:
printf("输入n值错误!
!
!
");
return0.0;
}
}
floatZhi095(intn)
{
floatz[15]={0,0,12.706,4.303,3.182,2.776,2.571,2.447,2.365,
2.306,2.262,2.228
};
if(n<=11)returnz[n];
switch(n)
{
case15:
return2.131;
case20:
return2.086;
case25:
return2.060;
case30:
return2.042;
case40:
return2.021;
case60:
return2.000;
case120:
return1.980;
case999:
//在这里把999作为无穷大!
return1.960;
default:
printf("输入n值错误!
!
!
");
return0.0;
}
}
floatZhi098(intn)
{
floatz[15]={0,0,31.821,6.965,4.541,3.747,3.365,3.143,2.998,
2.896,2.821,2.764
};
if(n<=11)returnz[n];
switch(n)
{
case15:
return2.602;
case20:
return2.528;
case25:
return2.485;
case30:
return2.457;
case40:
return2.423;
case60:
return2.390;
case120:
return2.358;
case999:
//在这里把999作为无穷大!
return2.326;
default:
printf("输入n值错误!
!
!
");
return0.0;
}
}
floatZhi099(intn)
{
floatz[15]={0,0,63.657,9.925,5.841,4.604,4.032,3.707,3.499,
3.355,3.250,3.169
};
if(n<=11)returnz[n];
switch(n)
{
case15:
return2.947;
case20:
return2.845;
case25:
return2.787;
case30:
return2.750;
case40:
return2.704;
case60:
return2.660;
case120:
return2.617;
case999:
//在这里把999作为无穷大!
return2.576;
default:
printf("输入n值错误!
!
!
");
return0.0;
}
}
floatZhi0999(intn)
{
floatz[15]={0,0,636.619,31.598,12.924,8.610,6.859,5.959,5.405,
5.041,4.781,4.587
};
if(n<=11)returnz[n];
switch(n)
{
case15:
return4.073;
case20:
return3.850;
case25:
return3.725;
case30:
return3.646;
case40:
return3.551;
case60:
return3.460;
case120:
return3.373;
case999:
//在这里把999作为无穷大!
return3.291;
default:
printf("输入n值错误!
!
!
");