2011-07-12 by zony
定点仿真方法的学习笔记(一)
在用 MATLAB 工具对算法进行仿真时,数据的流动是以浮点形式进行的,浮点型又分单
精度浮点型和双精度浮点型。浮点型数据的存储方式为
符号位
指数位
尾数位
单精度浮点型数据用 32 bit 来存储数据,其中符号位 1 bit,指数位 8 bit,尾数位
23 bit。双精度浮点型数据则用 64 bit 来存储数据,其中符号位 1 bit,指数位 11 bit,
尾数位 52 bit。
这样的数据存储方式能够保证一个数的精度。但是在考虑硬件实现的时候(如 FPGA,
定点 DSP),数据的流动是以固定长度的二进制序列进行,因此,为了进一步的反映硬件实
现中算法性能,我们需要对数据的类型做重新的定义,使得所表示的数据更符合硬件平台上
的处理方式。
做定点仿真实际就是对算法中的每一个数据进行量化,用规定字长的二进制序列表示一
个数,使它接近实际值。为了方便对数据类型做定点转换,MATLAB 提供了强大的 Fixed-Point
Toolbox 来帮助我们做这项工作。以下的所用内容只是个人对 Fixed-Point Toolbox 学习
的总结,如有任何疑问,请查找 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”表示“是”。例如,若两个操作数(对象)是 18 bit,定义“和”为 12 bit,若
该属性为“0”,则两个操作数先进行“加”操作,然后对“和”截位得到 12 bit 输出,
若该属性为“1”,则两个操作数先截位成 12 bit,然后再进行“加”操作。
2011-07-12 by zony
OverflowMode 属性
若有溢出,溢出值按两种方式处理。
saturate 方式:若数据发生上溢出,则该数据用能表示的最大数替代, 发生下溢
出,则该数据用能表示的最小值替代。例如两个 4 bit 有符号数,5 和 4,二进制分别
表示为 0101 和 0100,5+4=9,而 4bit 能表示的有符号数的范围为 -8 到 7,所以发生
上溢出,此时 5+4 所得结果为 7。
wrap 方式:若有符号数据发生溢出,则进位将取代符号位,所表示的数据将以二进
制补码表示,若无符号数据发生溢出,则进位将被舍弃。例如两个 4 bit 有符号数 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: binary point scaling。定点数据类型,量化由
WordLength 和 FractionLength 规定。
WordLength 属性
规定二进制序列的长度,用来表示指定数。
FractionLength 属性
规定二进制序列小数部分的长度,用来表示指定数的小数位。
2011-07-12 by zony
Singed 属性
是否为有符号数。默认为有符号。
实例:
首先用 numerictype 和 fimath 两个构造函数生成两个对象。
对一个指定的数据进行定点操作:
生成一个 fi 对象。可以看到 a 的值经过 fi 量化以后与实际值 0.6 有细微的偏差,这
是因为用 12bit 的字长,其中 11bit 表示小数的二进制数,所能表示的值是尽可能的贴近实
际值。
可以显示出 a 的二进制形式,还可以显示十六进制(a.hex),双精度 (a.double)等等。
这就体现了 fi 对象的 Data 属性。
再定义另一个 fi 对象
当对 a,b 两个对象执行加法操作时:
2011-07-12 by zony
最后的输出 c 字长为 10bit,其中 9bit 表示小数位。这就体现了 fimath 属性中的乘法
操作的子属性。
当对 a,b 两个对象执行乘法操作时:
2011-07-12 by zony
最后的输出 d 字长为 15bit,其中 14bit 表示小数位。这就体现了 fimath 属性中的加
法操作的子属性。
定点的过程就是利用 fi 对运算过程中的每一个环节的数据进行定点处理,使得数据的
流动更加符合实际硬中的处理方式。
定点仿真方法的学习笔记(二)
算法中经常会遇到 FIR 数字滤波器,浮点仿真时,已知滤波器的系数即可对数据进行滤
波。定点仿真则非那么简单,需要对滤波器进行浮点到定点的转化。首先我们来看一个定点
滤波器的结构。
2011-07-12 by zony
上图是一个转置直接型结构的 FIR 滤波器,数据流动的如图所示。从图中可以看出各个
点的数据格式都需要进行规定以符合硬件习惯,当滤波器的抽头系数很多时,人为地规定每
个点的数据格式,是一个复杂而繁重的工作。我们可以定义一个滤波器对象(filter object),
通过配置此对象的属性来完成滤波器的浮点到定点的转化。
我们以上图所示的转置直接型 FIR 滤波器为例。
首先得到一个FIR滤波器的系数(具体用法参见 help Filter Design Toolbox)
以微分器为例
得到一个微分器。
做滤波器定点转化首先要构造一个滤波器对象(filter object)
浮点到定点的转化就是配置这个滤波器对象dfilt.dffirt的属性,下面列出它常用的一
些属性:
Arithmetic
设置为 fixed,表示你有权限修改其他滤波器的属性来定制你需要的定点滤波器。
CoeffAutoScale
默认为 ture,当设置为 false 时,你可以通过设置NumFracLength属性来指定滤
波器系数的小数部分的字长。
CoeffWordLength
指定滤波器系数的字长。
NumFracLength
指定滤波器系数小数部分的字长。
2011-07-12 by zony
InputWordLength
指定滤波器输入数据的字长。
InputFracLength
指定滤波器输入数据小数部分的字长。
FilterInternals
默认为 FullPrecision,表示该滤波器的输出以及滤波过程中内部乘法器、累加器
的输出字长、小数部分字长都保持最好精度;SpecifyPrecision,表示该滤波器的输出
以及滤波过程中乘法器、累加器的输出字长、小数位字长都以指定属性为依据。
ProductWordLength
指定内部乘法器输出字长。
ProductFracLength
指定内部乘法器输出小数部分字长。
AccumWordLength
指定内部累加器输出字长。
AccumFracLength
指定内部累加器输出小数部分字长。
OutputWordLength
指定滤波器输出字长。
OutputWordLength
指定滤波器输出小数部分字长。
RoundMode
同 fimath 属性。
OverflowMode
同 fimath 属性。
配置定点滤波器的属性需要做两个工作:1)量化滤波器系数。2)分析滤波器的动态范
围,防止滤波过程中发生溢出。
滤波器系数的量化直接通过分析滤波器系数的范围,配置合适的【字长,小数部分字长】。
通过fvtool可以看到量化以后的滤波器幅频响应与浮点的比较
2011-07-12 by zony
Filter #1: Quantized
Filter #1: Reference
Magnitude Response (dB)
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
Normalized Frequency (×π rad/sample)
10
0
-10
-20
-30
-40
-50
0
)
B
d
(
e
d
u
t
i
n
g
a
M
可以看出系数量化后的滤波器幅频响应与浮点相差很大,所以应该适当提高系数的字长
Magnitude Response (dB)
Filter #1: Quantized
Filter #1: Reference
)
B
d
(
e
d
u
t
i
n
g
a
M
10
0
-10
-20
-30
-40
-50
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
Normalized Frequency (×π rad/sample)
对细节进行放大