您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > MATLAB定点仿真方法的学习笔记
2011-07-12byzony定点仿真方法的学习笔记(一)在用MATLAB工具对算法进行仿真时,数据的流动是以浮点形式进行的,浮点型又分单精度浮点型和双精度浮点型。浮点型数据的存储方式为符号位指数位尾数位单精度浮点型数据用32bit来存储数据,其中符号位1bit,指数位8bit,尾数位23bit。双精度浮点型数据则用64bit来存储数据,其中符号位1bit,指数位11bit,尾数位52bit。这样的数据存储方式能够保证一个数的精度。但是在考虑硬件实现的时候(如FPGA,定点DSP),数据的流动是以固定长度的二进制序列进行,因此,为了进一步的反映硬件实现中算法性能,我们需要对数据的类型做重新的定义,使得所表示的数据更符合硬件平台上的处理方式。做定点仿真实际就是对算法中的每一个数据进行量化,用规定字长的二进制序列表示一个数,使它接近实际值。为了方便对数据类型做定点转换,MATLAB提供了强大的Fixed-PointToolbox来帮助我们做这项工作。以下的所用内容只是个人对Fixed-PointToolbox学习的总结,如有任何疑问,请查找HELP中的相关内容,理解上如有错误,恳请斧正。先介绍几个对象给大家认识,也就是Object,个人认为定点的过程就是让数据在fi这个对象下进行工作。fi对象当你用fi这个函数对一个数据进行定点处理时,你就构造了一个fi对象(说白了也是一个数,你规定了这个数的数据类型)。你可以对这个对象进行运算。与一个数不同的是这个对象有很多的属性,在这里先把它们中常用的列出来,并对它们做一些简要说明,后面会用实例告诉大家怎么去理解这些属性。Data属性该属性可以让你了解一个fi对象在不同的数据形式下的具体值,如二进制(bin),八进制(oct),十进制(dec),十六进制(hex),双精度(double)等等。fimath属性该属性规定了fi对象在进行数据运算时,处理数据的习惯(数学运算,截位方式,溢出方式)。它是一个比较抽象意义上的属性,你可以用另一个对象对它进行定义。当你要定义fi对象的fimath属性时,你需要先定义一个fimath的对象,再用fimath对象定义fi对象的fimath属性。将在fimath对象中介绍。numerictype属性该属性包含了fi对象的所有数据类型信息。它是一个比较抽象意义上的属性,你可以用另一个对象对它进行定义。当你要定义fi对象的numerictype属性时,你需要先定义一个numerictype对象,再用numerictype对象定义fi对象的fimath属性。将在numerictype对象中介绍。fimath对象该对象的常用属性如下:CastBeforeSum属性在两个操作数进行加法之前,是否将操作数影射成“和”的数据类型。“0”表示“否”,“1”表示“是”。例如,若两个操作数(对象)是18bit,定义“和”为12bit,若该属性为“0”,则两个操作数先进行“加”操作,然后对“和”截位得到12bit输出,若该属性为“1”,则两个操作数先截位成12bit,然后再进行“加”操作。2011-07-12byzonyOverflowMode属性若有溢出,溢出值按两种方式处理。saturate方式:若数据发生上溢出,则该数据用能表示的最大数替代,发生下溢出,则该数据用能表示的最小值替代。例如两个4bit有符号数,5和4,二进制分别表示为0101和0100,5+4=9,而4bit能表示的有符号数的范围为-8到7,所以发生上溢出,此时5+4所得结果为7。wrap方式:若有符号数据发生溢出,则进位将取代符号位,所表示的数据将以二进制补码表示,若无符号数据发生溢出,则进位将被舍弃。例如两个4bit有符号数5和4,二进制分别表示为0101和0100,5+4=9,而4bit能表示的有符号数的范围为-8到7,所以发生上溢出。wrap方式下处理溢出,0101和0100做加法,次高位的进位加到符号位,得到结果为1001,表示为-7。若两个3bit无符号数5和4,二进制分别表示为101和100,做加法后出现溢出,则进位舍弃,得到001,表示为1。RoundMode属性对数据进行截位的方式,硬件实现时是直接截断,不考虑四舍五入,通常为fix。MaxProductWordLength属性当ProductMode属性为FullPrecision时,此属性有效,如果计算的积超过此属性定义的值,会出错。MaxSumWordLength属性当ProductMode属性为FullPrecision时,此属性有效,如果计算的和超过此属性定义的值,会出错。ProductMode属性做定点时,我们需要指定积的运算结果的字长,以及小数位的字长,此项通常为SpecifyPrecision,此时,ProductWordLength和ProductFractionLength有效。ProductWordLength属性指定积的运算结果的字长。ProductFractionLength属性指定积的小数位的字长。SumMode属性做定点时,我们需要指定和的运算结果的字长,以及小数位的字长,此项通常为SpecifyPrecision,此时,SumWordLength和SumFractionLength有效。SumWordLength属性指定和的运算结果的字长。SumFractionLength属性指定和的运算结果的字长。numerictype对象常用属性有Scaling属性默认为:Fixed-point:binarypointscaling。定点数据类型,量化由WordLength和FractionLength规定。WordLength属性规定二进制序列的长度,用来表示指定数。FractionLength属性规定二进制序列小数部分的长度,用来表示指定数的小数位。2011-07-12byzonySinged属性是否为有符号数。默认为有符号。实例:首先用numerictype和fimath两个构造函数生成两个对象。对一个指定的数据进行定点操作:生成一个fi对象。可以看到a的值经过fi量化以后与实际值0.6有细微的偏差,这是因为用12bit的字长,其中11bit表示小数的二进制数,所能表示的值是尽可能的贴近实际值。可以显示出a的二进制形式,还可以显示十六进制(a.hex),双精度(a.double)等等。这就体现了fi对象的Data属性。再定义另一个fi对象2011-07-12byzony当对a,b两个对象执行加法操作时:最后的输出c字长为10bit,其中9bit表示小数位。这就体现了fimath属性中的乘法操作的子属性。当对a,b两个对象执行乘法操作时:2011-07-12byzony最后的输出d字长为15bit,其中14bit表示小数位。这就体现了fimath属性中的加法操作的子属性。定点的过程就是利用fi对运算过程中的每一个环节的数据进行定点处理,使得数据的流动更加符合实际硬中的处理方式。定点仿真方法的学习笔记(二)算法中经常会遇到FIR数字滤波器,浮点仿真时,已知滤波器的系数即可对数据进行滤波。定点仿真则非那么简单,需要对滤波器进行浮点到定点的转化。首先我们来看一个定点滤波器的结构。2011-07-12byzony上图是一个转置直接型结构的FIR滤波器,数据流动的如图所示。从图中可以看出各个点的数据格式都需要进行规定以符合硬件习惯,当滤波器的抽头系数很多时,人为地规定每个点的数据格式,是一个复杂而繁重的工作。我们可以定义一个滤波器对象(filterobject),通过配置此对象的属性来完成滤波器的浮点到定点的转化。我们以上图所示的转置直接型FIR滤波器为例。首先得到一个FIR滤波器的系数(具体用法参见helpFilterDesignToolbox)以微分器为例得到一个微分器。做滤波器定点转化首先要构造一个滤波器对象(filterobject)浮点到定点的转化就是配置这个滤波器对象dfilt.dffirt的属性,下面列出它常用的一些属性:Arithmetic设置为fixed,表示你有权限修改其他滤波器的属性来定制你需要的定点滤波器。CoeffAutoScale默认为ture,当设置为false时,你可以通过设置NumFracLength属性来指定滤波器系数的小数部分的字长。CoeffWordLength指定滤波器系数的字长。NumFracLength指定滤波器系数小数部分的字长。2011-07-12byzonyInputWordLength指定滤波器输入数据的字长。InputFracLength指定滤波器输入数据小数部分的字长。FilterInternals默认为FullPrecision,表示该滤波器的输出以及滤波过程中内部乘法器、累加器的输出字长、小数部分字长都保持最好精度;SpecifyPrecision,表示该滤波器的输出以及滤波过程中乘法器、累加器的输出字长、小数位字长都以指定属性为依据。ProductWordLength指定内部乘法器输出字长。ProductFracLength指定内部乘法器输出小数部分字长。AccumWordLength指定内部累加器输出字长。AccumFracLength指定内部累加器输出小数部分字长。OutputWordLength指定滤波器输出字长。OutputWordLength指定滤波器输出小数部分字长。RoundMode同fimath属性。OverflowMode同fimath属性。配置定点滤波器的属性需要做两个工作:1)量化滤波器系数。2)分析滤波器的动态范围,防止滤波过程中发生溢出。滤波器系数的量化直接通过分析滤波器系数的范围,配置合适的【字长,小数部分字长】。通过fvtool可以看到量化以后的滤波器幅频响应与浮点的比较2011-07-12byzony可以看出系数量化后的滤波器幅频响应与浮点相差很大,所以应该适当提高系数的字长对细节进行放大00.10.20.30.40.50.60.70.80.9-50-40-30-20-10010NormalizedFrequency(×πrad/sample)Magnitude(dB)MagnitudeResponse(dB)Filter#1:QuantizedFilter#1:Reference00.10.20.30.40.50.60.70.80.9-50-40-30-20-10010NormalizedFrequency(×πrad/sample)Magnitude(dB)MagnitudeResponse(dB)Filter#1:QuantizedFilter#1:Reference2011-07-12byzony观察量化后的滤波器和浮点滤波器的幅频响应相差很小,已经可以符合要求。在实际中,可以根据工程经验对字长进行设置。最后可以查看滤波器对象的其他属性动态范围的分析则首先需要确定滤波器的输入数据的范围,固定内部各点的乘法器、累加器的输出字长,然后设计一个最差情况下的输入数据,并针对该最差输入数据,检查滤波器是否发生溢出。若滤波器输入数据的范围为[-1.9,1.9],则设计的最差情况下的输入数据为打开数据记录模式对数据进行滤波关闭数据记录模式0.33480.33480.33480.33480.33480.33480.4340.4350.4360.4370.4380.4390.440.4410.442NormalizedFrequency(×πrad/sample)Magnitude(dB)MagnitudeResponse(dB)Filter#1:QuantizedFilter#1:Reference2011-07-12byzony输出报告得到报告如下:从报告中可以看出,Input项发生了溢出,这是因为输入数据字长与小数部分字长的比例不合适,需要做调整,若内部发生溢出,则需要对滤波器内部各点的乘法器、累加器输出的小数部分字长长度做调整。自动调整内部各点的字
本文标题:MATLAB定点仿真方法的学习笔记
链接地址:https://www.777doc.com/doc-1791660 .html