电子测量大作业

更新时间:2023-12-01 23:56:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《电子测量》大作业

姓名:黄睿的 对付 学号:的飞的

班级:的的

题目一:参考例2-2-6的解题过程,用C语言或MATLAB设计测量数据处理的通用程序,要求如下:

(1)提供测试数据输入、粗大误差判别准则等的人机界面; (2)编写程序使用说明;

(3)通过实例来验证程序的正确性。 程序使用说明:

1.

本次程序,我采用的是C语言,用户可一次性输入不超过15个数,并提供4中选择:(1)求出平均值;(2)标准偏差估计值;(3)检查有无异常数据并重新计算平均值和标准偏差估计值:(4)输出经剔除异常数据之后的数据;

在检查异常数据时,我采用了格拉布斯准则,这里仅给出当置信概率为95%时各个g值,最多可容纳20个数。

2.

(1) 界面如下:

图1-1 数据输入界面

此时,我们可以输入1,2,3,4来进行不同的操作,输入0直接退出,演示如下:

图1-2 计算平均值和标准偏差估计值

由上图可知,输入1时,平均值average=2.669,输入2时,标准偏差估计值the standard deviation=0.086。

再进行异常数据检测,并重新计算平均值和标准偏差估计值,以及输出剔除异常数据后的数据元素,其结果如下:

图1-3 处理数据

由此可见,剔除了2.45,重新计算了平均值和标准偏差估计值average=2.691,the standard deviation=0.048。

心得体会:本次编写程序,让我对数据处理的相关要求有了更加深刻的理解,求平均值,求标准偏差估计值,以及异常数据的处理,在写代码的同时,我不断查阅课本,通过实例测试,来验证程序的正确性。同时提高了我的编程能力,在写代码的过程中遇到了很多问题,起初是g值没有进行初始化,导致了平均值的结果为无穷大,经过调试后进行修改;后来是进行异常数据剔除后,平均值计算不正确,这些问题经调试后被我一一修改,这使我意识到调试程序的重要性。

总而言之,本次作业让我受益匪浅,在今后的学习中,我更加努力。

题目二:5-11在multisim环境下,参考图5-3-1,设计一种基于DDFS的正弦信号源,给出原理图和仿真实验结果。

原理:DDFS-Direct Digital Frequency Synthesizer 直接数字频率合成。在时钟脉冲的控制下,相位累加器输出线性递增的相位吗,相位吗作为地址信息来寻址波形寄存器,讲波形寄存器中存放的正弦波形样点数据输出,然后经过模数变换器得到对应的阶梯波形,最后经过低通滤波器对解题波进行平滑,得到正弦波形。波形储存器中也可以存放其他波形,实现任意波形产生的功能。频率控制字K在时钟的控制下控制每次相位累加器累计的相位增量,从而实现对输出信号频率的控制。

图2-1 总体结构图

实验思路:由于不知道是否有可记忆是的芯片,故使用简单的数电所学的芯片进行仿真,首先产生三角波,再通过对波形进行减法运算产生书中波形存储器输出的波形,然后使用低通滤波器滤去高频分量,留下来的便是正弦波。 具体的电路图:

(1)进行步长为1,范围为0~10的加减法电路图

图2-2 加减法电路图

如图所示,74283用来进行加法运算,下面的两个74161用来控制频率控制字K的大小,加减计数范围为0~10,当第一个计数器计数到10以后,由逻辑关系,把第一个计数器清零,同时第二个74161计数一次,当第二个74161的低位输出为零的时候,控制

74283加法,当输出为1的时候控制74283进行减法运算,实现了从74273输出的数字从0递增到10,再递减到0的过程(输出的正弦频率为时钟信号的20分之一) (2)数模转换部分:

图2-3 数模转换图

(3)把数字信号通过数模转换转换成模拟信号,即产生了三角波

仿真结果图如下所示:

图2-4 仿真结果图

但是此时的三角波是含有直流分量的,需要通过运放进行减法运算

(4)去除直流分量

使用运算放大器去除其直流分量

图2-5 去除直流分量电路图

如上图所示,通过运算放大器的减法电路去除其中的直流分量,通过调节电位器选择合适的减少的电压的数值。 仿真结果:

图2-6 仿真结果图

(5)滤波电路

图2-7 滤波电路图

如上图所示,此滤波器是低通滤波器,通过几次测试,当Rf=10kΩ,C=1uf的时候滤波效果最好

仿真结果(clk=1khz、正弦频率为50hz):

图2-8 仿真结果图

clk=10khz(正弦频率为500hz)

图2-9 仿真结果图

(6)实验总电路图如下图所示:

图2-10 总体电路图

感想:知道有这个大作业后,看了所有的例题,觉得并不是很好做,感觉做正弦信号这个题目还是最容易和最近所学的数电知识结合在一起的,有一点想法,于是就顺着这个想法往下做下去,期间虽然遇到很多问题,但是慢慢的都解决了,但是感觉做出来的还是不够好,要想信号不失真得改变低通滤波器的Rf与C才行,不能随着频率的改变而自动改变滤波器的截频,仍然有待改善。

附录:作业一程序

//************************************************************************************** // 文件名: //

// 描述: 用户可一次性输入不超过15个数,并提供4中选择:(1)求出平均值;(2)标准偏差估计值;(3)检查有无异常数据 // 数据之后的数据; //

//**************************************************************************************

//**************************************************************************************

//Revision History //------------------ //

//01 ****-**-** 10:07 Park // Create the file.

//************************************************************************************** #include #include

/***************************************************** 函数名称:averg

传入参数:一系列数组元素a[i] 返回参数:这些数据的平均值 函数功能:求平均值

***************************************************/ double avrg(double a[],int n)

并重新计算平均值和标准偏差估计值:(4)输出经剔除异常

测量数据误差处理.c

{ }

/***************************************************** 函数名称:StDev

传入参数:一系列数组元素a[i] 返回参数:标准偏差估计值 函数功能:求标准偏差估计值

***************************************************/ double StDev(double a[],int n) { }

//**************************************************************************************

//******************************* Copyright (c) ***************************************

//** ** //**

判断是否存在异常数据 **

int i;

double sum=0,result; for(i=0;i

sum=sum+pow((a[i]-avrg(a,n)),2);

int i; double sum=0; for(i=0;i

sum+=a[i];

return sum/n;

result=sqrt(sum/(n-1)); return result;

//**函数说明:利用格拉布斯准则,这里仅给出当置信概率为95%时各个g值,最多可容纳20个数 **

//** **

//** **

//** **

//** **

//**************************************************************************************

//**************************************************************************************

/***************************************************** 函数名称:table

传入参数:待处理的数据个数n 返回参数:对应的g值 函数功能:通过查表找出g值

***************************************************/ double table(int n) {

switch(n) {

case 3:

return 1.15;break;

case 4:

return 1.15;break;

case 5:

return 1.67;break;

case 6:

return 1.82;break;

case 7:

}

}

return 1.94;break;

case 8:

return 2.03;break;

case 9:

return 2.11;break;

case 10:

return 2.18;break;

case 11:

return 2.23;break;

case 12:

return 2.29;break;

case 13:

return 2.33;break;

case 14:

return 2.37;break;

case 15:

return 2.41;break;

/***************************************************** 函数名称:abnml_data

传入参数:数组元素a[],数组长度n 返回参数:

函数功能:检查有无异常数据,若存在异常数据,则删除异常数据并重新返回数据个数 ***************************************************/ int abnml_data(double a[],int n) {

int i,j;

// }

double g; g=table(n); for(i=0;i

data={avrg(a,n),StDev(a,n)};

if(fabs(a[i]-avrg(a,n))>g*StDev(a,n)) { }

for(j=i;j

a[j]=a[j+1];

int main(void) {

double data[15],check[15]; int i,num_1,num_2,choice;

printf(\请输入一个小于等于15的数:\\n\scanf(\

printf(\请输入%d个数:\\n\for(i=0;i

num_2=abnml_data(check,num_1); for(i=1;i<=4;i++)

scanf(\check[i]=data[i];

{

printf(\求平均数:\\n\

printf(\求出标准偏差估计值:\\n\

printf(\检查有无异常数据并重新计算平均值和标准偏差估计值:

\\n\

printf(\输出经处理之后的数:\\n\printf(\

printf(\scanf(\

//如果输入0,则提前结束for循环 if(choice==0)

break;

switch(choice) {

case 1:printf(\average=%.3f\\n\

case 2:printf(\deviation=%.3f\\n\

case 3:

{

printf(\solved=%.3f\\n\

printf(\solved=%.3f\\n\

}

}

} break;

case 4:for(i=1;i

printf(\

}

printf(\printf(\return 0;

本文来源:https://www.bwwdw.com/article/4kvt.html

Top