您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > 用matlab做系统级adc仿真
用matlab做系统级的adc的仿真。整理人:袁小星2006-1-8目标:仿真10位,每级1.5位pipeline-adc的各项指标与最后性能的关系。步骤1.搭建简单的系统。作用工具:matlab-simulink.所用到的模块:1.ramp:用于产生从-1v到1v的线性输出。输入到adc系统中。2.zero-orderhold:用于进行对输入的采样保持,采样时间由adc所要工作的频率决定。3.lookup-1d:一维的查找表,设定不同的输入输出,可以做成adc和dac模块。4.sum:把两个数相加,实现实际中的信号相加减。或者用于数字补偿。5.gain:模拟余数的放大功能,或者用于数字量移位。6.xy-graph:用于查看adc的传输函数。整个系统的结构:1.9级相同的处理模块2.最后一级的比较(2位)3.数字矫正每一级处理模块的构成:1.包括模块:zero-orderhold,subadc(look-up),dac(lookup),sum,gain.2.两个查找表都需要进行对输入输出进行处理:解释如下最后的每一级电路都是要做出mask的,对外的接口有比较器的阈值,dac的输出,以及采样时间,每一级的增益。比如如果要求输入阈值为[-0.250.25](以矩阵的形式输入)。但是为了使查找表工作的更合理。subadc查找表对应的。输入输出为:输入[-realmax-0.25-0.250.250.25realmax]输出[001122].同样如果要求dac的输出为[-0.500.5],dac查找表对应的输入输出为输入[001122],输出[-0.5-0.5000.50.5].这就需要两个函数来做成接口,实现这种矩阵的扩展。参见(adc_glue,dac_glue).如图:3.然后把信号相加。最后一级的比较:也是用查找表来实现:输入[-realmax-0.5-0.5000.50.5realmax]输出[00112233]数字矫正:把每一级数字输出乘以一个特定常数后(比如最后一级处理模块数字输出乘2),后相加,就可以看输出波形了。最后的总体结构:步骤2:计算inl_dnl用到了提供的函数inl_dnl,但是得保证输入是正弦信号。然后试图改变各参数的值看最后inl_dnl的变化。测量dnl_inl,有两种方法,1种是固定采样的时间,但是输入波形的频率不断变化,如果要保持采样完整的周期,那么显然采的点就会增加也就是说对一个周期正玹信号,采样的点是变化的。这种情况下,对同一个adc来说,最后计算的inl_dnl会随着采样点的增多越来越小。从这种方法得出得结论是,当输入频率越小时,dnl_inl.表现的越好。2种是固定采样的时间,而且固定输入波形的频率,但是可以通过增加周期来增加点的数量(最好是奇数个周期,这样对以后做snr分析有用),这种情况下,在满足一定数量的点以后,inl_dnl,就不怎么发生变化了。也就是说,对同一个输入频率,采样足够多的点(满足概率分布的要求?)后,dnl_inl,就不怎么发生变化了。实际情况下,应该是第二种方法更具有参考价值,也就是说固定输入频率下,计算dnl_inl,但是这个固定频率应该取多少是个问题。还有就是应该取多少个点。一般来说,为了保持取得代码得完整性,这样的话做dnl_inl才有意义,这就要求采样频率不能是输入频率的周期倍,一般来说,要取一个比较合适的值,使能够在一定码数内,覆盖所有的1024个点(10bit)。对于本设计,采样周期为0.001s.相对的输入频率为12.505hz.(应该由数学上解释,从而算出比较理想的值),运行时间16.383s,保证采样的点数为16*1024.这样的值比较理想。计算snr时,如果不加窗函数,为了防止频谱泄漏,就需要计算得点数是2得整数倍,而且一般取得点数越多,越能反映实际情况,而且输入波形得频率相对于采样频率很小时,那样算出的snr是比较准的,比如,一般取16384个点,65个circle那么两个频率之比fin/fs=65/16384.这时用一个理想的10bit的adc算出的snr为61.8db.但是如果取650个circle,这时两个频率之比fin/fs=650/16384.同样算出的snr只有50多,显然理想的adc的snr为62db。而且,如果采样一半的点,算出的snr也是不准的。考虑更为精确的模型:1。考虑噪声的影响。由于每一级的都是采用了开关电容放大器的结构,那么在开关电容放大器的采样的时候,同时也会采得噪声,在hold期间放大后向下一级传播,由于整个的adc系统采用zero-orderhold,也就是说,不考虑采样阶段的情况,每一级的放大器只工作在保持放大阶段。那么噪声的模型就只需要一个随机的变量,在每一个保持期间,累加到放大器上。本系统中只考虑了主要的噪声来源,kt/c噪声。实现方法:用一个从0到1变化的随机变量被zero-orderhold采样保持然后和K*sqart(kt/c)相乘,输出和放大器的输入相加。所用模块:zero-orderhold:保持constant:可变的电容大小f(u):计算kt/crandon-number:产生高斯分布的数值product:实现乘法。如下图2。放大器的非理想因素:静态误差,由开环增益决定。动态误差,由有限的建立时间决定。以下讲述如何考虑动态误差。放大器的对输入信号的响应,由slewperiod,和settlingtime决定。前者由放大器的slewrate决定,后者由放大器的单位阶越响应决定。如果要在模型中考虑放大器的以上的动态特性,那么就需要改变一下模型。原因:从上面的模型可以看出,每一级的运算都是同时进行的,每一级之间没有时间的先后,只有运算的先后。也就是说,一个采样周期就可以比出10bit来。如果在放大器的模块中把原来的gain换成了传输函数,系统就自动的考虑了时间的先后,后一级自动对前一级延时一个采样周期。这时就要求数字的输出也延时后相加,第一级要加8个单位延时模块,最后要把得到数据减去最前面得9个数据,通过对测试程序的稍加改动,就可以实现,当然为了使采样数据是2得整数倍,需要采样得时间比原来长9个采样周期。经验证,这样做是可以的。
本文标题:用matlab做系统级adc仿真
链接地址:https://www.777doc.com/doc-4685433 .html