Matlab定点化

当要对于算法的硬件实现,使用Matlab进行定点化仿真非常重要,网上Matlab定点化仿真的资料比较少,下面是我总结的资料。
Matlab定点化三种方法:
1.使用round、floor等函数在每次运算后直接进行截断
各种截断方法:
ceil() 向上取整
fix() 向0取整
floor() 舍弃小数部分(向下取整)
round() 四舍五入取整
直接截断取整可能会出现高频噪声,最好使用四舍五入取整。

2.使用num2fixpt()函数进行截断
num2fixpt(19.875, sfix(8), 2^-2, 'Floor', 'on')  = 19.75
num2fixpt(19.875, sfix(8), 2^-3, 'Floor', 'on')  = 15.875
num2fixpt(19.875, sfix(9), 2^-3, 'Floor', 'on')  = 19.875

3.使用fi对象进行定点化:
(1)首先定义fimath对象和numerictype对象
fimath对象:定义运算模式和位数
numerictype对象:定义数据位数
numerictype中FractionLength可以大于WordLength-1,但是这样高位的小数位会被舍去,也可以用'Slope'属性指定。如:
F = fimath('CastBeforeSum', 0, 'OverflowMode', 'Saturate', ...
  'RoundMode', 'floor', 'ProductMode', 'SpecifyPrecision', 'SumMode', 'SpecifyPrecision', ...
  'ProductWordLength', 16, 'ProductFractionLength', 14, 'SumWordLength', 16, 'SumFractionLength', 14);
T = numerictype('WordLength', 16, 'FractionLength', 14);
(2)用fimath对象和numerictype对象定义浮点数的fi对象
如:fi( x, numerictype, fimath );
(3)利用定义好的fi对象进行运算
该方法对定点过程处理的细节定义的比较详细灵活,不需要每一步运算定点化一次,但是对很多函数不兼容,需要写一些基本函数
用double可以将fi对象变成普通的对象。
另外,还有专门CORDIC函数处理fi对象的运算问题。
isfimathlocal可以用来判断是否有local fimath对象。 使用isfi可以判断是否为fi对象。可以用F = a.fimath获得fimath对象,用T = a.numerictype获得numerictype对象。

为了确保运算过程不会出问题,比如需要检测定点运算过程中特有的溢出问题,方法如下:
使用fipref函数检测
如:
fipref('LoggingMode', 'on', 'DataTypeOverride', 'ForceOff');
......
fipref('LoggingMode', 'off');
可以检测运算过程溢出等问题,而溢出分为上溢和下溢:
上溢是数值太大,约化为最大值或变为负值等各种情况
下溢是数值接近0倍约为0


附注:
输出方法:
对于fi对象a,a.bin,a.dec和a.hex表示a的二进制,十进制和十六进制表示,还可以用a.int输出有符号数。
关于除法:
定点运算能不用除法就不用除法,除法容易出问题。对于fi对象的方法,它的小数点定标会发生改变,假设被除数和除数小数位一样,那么商的小数位长会变为0。如果被除数小数位更大,此时商才有小数位长,而当除数小数位更长时,商的小数位长(FractionLength)会变为负值。使用devide(numerictype, a, b)进行更精细的操作也许能避免这些错误,或者使用cordic函数。
关于cordic函数:
cordicangle(u)获得u的角度,范围在[-pi, pi]内,定点化时默认输出位长16位,小数位13。
cordicrotate(angle, u)将u旋转。
关于运算单元输出宽度:
累加器的输出和加法数量有关,对于等长的数宽W,加数为L,则最终宽度为W+log2(L)-1
滤波器定点化仿真:
使用filter函数对filter定点化的对象a和数据b直接处理,如:filter(a, b)
关于CIC滤波器等一些滤波器处理则比较复杂,使用的是dsp工具箱,在获得合适的CIC参数后,还要将数据处理成dsp对象,如:
hsr = dsp.SignalSource( ee.', length(ee) );  %变成工具箱能处理的数据对象
hcicint = dsp.CICInterpolator(l, 1, nsecs);
Tx = step( hcicint, step(hsr) );


运算精度控制:
使用digits和vpa函数可以控制Matlab运算的精度
其中digits指定了vpa处理变量的数值有效位数,该方法会大大降低运算速度,慎用

double 转化为双精度,一般的数值计算都是double型的
single 转化为单精度
eps可以得到与数轴上下一个数的数值差

为了让更方便理解Matlab定点化的使用方法,可以参考我下一篇文章:
Matlab定点化仿真的一个例子:使用CIC滤波器进行数字上变频的仿真

  • 24
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Matlab定点是将Matlab中的浮点数运算转换为定点数运算的过程。定点可以提高计算效率和减少计算资源的使用,尤其适用于嵌入式系统或数字信号处理应用中。根据引用和引用[2],可以通过使用Matlab中的HDL CODER工具将Matlab代码转换为Verilog或VHDL代码来实现定点。HDL CODER工具支持Fixed point类型,可以根据输入激励和所需的数据位宽自动调整小数位位宽,提供定点的建议。 在Matlab中,可以使用定点工具Fixed point designer来进行定点设计。根据引用,Fixed point designer的基本思想是根据提供的输入激励和所需的数据位宽来建议小数位位宽。因此,为了确保设计的正确性,输入激励应尽可能齐全。定点工具可以帮助用户定义定点数的位宽、小数位宽以及溢出、舍入等相关参数,从而实现精确的定点数运算。 总之,Matlab定点是将Matlab中的浮点数运算转换为定点数运算的过程。可以使用HDL CODER工具将Matlab代码转换为Verilog或VHDL代码,也可以使用Fixed point designer工具进行定点设计。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Matlab定点](https://blog.csdn.net/truecrab/article/details/79486431)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Matlab 定点 (fixed point designer)-入门1](https://blog.csdn.net/qq_38306698/article/details/82054531)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值