通常计算机上的加法运算是循环的,例如 0x0001 +

0x7fff = 0x8000,

其中0x7fff是short类型的最大正值,0x8000是最小负值。假设我们是把两个声音相加,由于结果的符号反转,将出现不连续,如果我们把上面的

数当做Q15定点小数来看的话,本来是正1(0x7fff),由于加了个很小的数(0x0001),结果却变为了负1(0x8000)。

此DSP芯片都支持饱和加法,当结果超出范围的时候,就取范围的上下限为结果:0x0001

+ 0x7fff =

0x7fff。例如在5510芯片中,为了使用饱和加法只需要把状态位:SATA或SATD设为1即可(SATA和SATD的具体含义请参考手册)。这种

位操作只能在汇编下进行,因此为了方便C语言编程,编译器提供了伪函数_sadd和_ssub。使用这些伪函数的时候,编译器会自动添加设置和清除饱和位

的语句,例如:

a=_sadd(a,b)可能会编译成

BSET ST3_SATA ;设置饱和位

ADD T0, T1

BCLR ST3_SATA ;清除饱和位

当几个_sadd连续使用的时候,编译器只设置和清除一次饱和位。但是当几个_sadd调用中间还有一般的加法的话,就会设置和清除好几次饱和位了。

例如

c= _sadd(c,b); // 设置并清除一次

c= a+c;

c= _sadd(c,b); // 再设置并清除一次

果在一个循环中有多次这样的交叉调用的话,饱和位将被设置和清除很多次,这样显然是浪费DSP资源的。因此尽量把饱和加减的调用集中,为了减少设置清除饱

和位的次数,一些不需要饱和运算的加减也可以使用饱和运算。如果可以把整个函数都改写为饱和加减运算的话,那么干脆在函数最前面添加asm("

BSET

ST3_SATA");手工设置饱和位,这样程序中可以直接是用加减号运算。

c语言 饱和加法,[转载]优化饱和加法运算相关推荐

  1. C语言矩阵运算器,实现矩阵加法、减法、乘法、转置和退出。

    C语言矩阵运算器,实现矩阵加法.减法.乘法.转置和退出. C语言矩阵运算器,实现矩阵加法.减法.乘法.转置和退出.-C文档类资源-CSDN下载C语言矩阵运算器,实现矩阵加法.减法.乘法.转置和退出.更 ...

  2. AES中加法、乘法、xtime运算详述

    AES中加法.乘法.xtime运算详述 注意:文中数字均为2进制或16进制,不要与10进制混淆. AES中的运算为面向字节的运算,有加法和乘法两种. AES中的运算包含面向字节(8位)或4字节(双字, ...

  3. R语言optimize函数一维优化实战

    R语言optimize函数一维优化实战 目录 R语言optimize函数一维优化实战 #基础语法 #优化用户自定义的函数

  4. c语言十万以内超级素数,用C语言求素数的优化

    用C语言求素数的优化 这个程序运行了8个小时,求一亿以内的素数和超级素数. 大家帮忙看看,我求一亿以内的素数和超级素数.从下午5:30开始,一直到零晨0点30才结束.我的电脑配置也可以.INTER E ...

  5. 055B ENMTools教程-基于R语言对MaxEnt模型优化-MaxEnt调参教程--更新日期2021-9

    055B-1 视频附带资料下载和密码:软件-数据-文献下载-持续更新 055B-2 ENMTools软件下载安装 055B-3 R软件和工具包安装 055B-4 生物气候因子的精度说明与选择方法(理论 ...

  6. 99加法口诀表java_加法口诀表

    加法口诀表 加法口诀表 程序填空,不要改变与输入输出有关的语句. 输入一个正整数repeat (0 (将加数.被加数.和放入一个二维数组中, 再输出该数组) 例:括号内是说明 输入: 1 (repea ...

  7. C语言求一万以内的超级素数,用C语言求素数的优化.doc

    用C语言求素数的优化 用C语言求素数的优化 这个程序运行了8个小时,求一亿以内的素数和超级素数. 大家帮忙看看,我求一亿以内的素数和超级素数.从下午5:30开始,一直到零晨0点30才结束.我的电脑配置 ...

  8. ENMTools教程-基于R语言对MaxEnt模型优化-MaxEnt调参教程介绍

    MaxEnt3.4.4软件下载网盘: http://lucky-boy.ys168.com (如有侵权请联系删除) 055B-1 视频附带资料:软件-数据-文献下载-持续更新 055B-2 ENMTo ...

  9. 51单片机c语言内存使用,51单片机C语言编程之内存优化

    原标题:51单片机C语言编程之内存优化 最常见的是以下两种 ① 超过变量128后必须使用compact模式编译 实际的情况是只要内存占用量不超过 256.0 就可以用 small 模式编译 ② 128 ...

  10. c语言中字符减减自符意思,C语言中的自加自减运算

    [摘 要]C语言中运算符十分丰富,自加运算和自减运算是c语言的教学中的重点和难点,但我们只要在教学中抓住运算的基本定义,通过经典题型分析和适度深入解析,就不难达到熟练应用之目的. [关键词]运算的定义 ...

最新文章

  1. linux系统源码安装教程,linux之源码包安装步骤
  2. linux 某个文件打不开了,linux操作系统下,exe文件为什么打不开?
  3. 信息安全系统设计基础第一周学习总结
  4. 在idea中使用构造方法
  5. JAX-RS客户端WebClient的使用教程
  6. 对几种二叉树的简单理解
  7. 四种为HttpClient添加默认请求报头的解决方案
  8. 智能路由器-OpenWRT 系列三 (OpenWRT安装LuCI网络配置)
  9. 【转】TCP/IP协议——ARP详解
  10. niginx之虚拟主机和域名解析
  11. 前端学习之路之CSS (三)
  12. 寻找创业方向的3个方法
  13. kong 网关教程入门
  14. bootstrap table的属性sidePagination设置不当导致数据不显示
  15. 注册表更改计算机语言为韩语,Windows10韩语语言包(Win10系统语言修改助手)V1.0 官方版...
  16. JAVA拉取Hive的数据导入到MySQL中
  17. 多个USB视频捕捉的连接问题
  18. 大家之言 | 谈“网络安全终身教育”
  19. 系统分析师-2022年上半年必考知识点
  20. 计算机应用基础前言,大学计算机基础

热门文章

  1. jabref java_Jabref安装及使用教程
  2. iTunes只能装C盘吗_为什么电脑软件喜欢默认安装在C盘呢?
  3. 阿里云 域名 服务条款
  4. 蔡氏电路matlab仿真实代码验,基于蔡氏电路的MATLAB仿真
  5. 若干思考:从如何确定投资者是风险偏好者、风险中性者还是风险规避者 到 上学真的无用吗的思考?
  6. 技术选型Rust——事后分析
  7. greenplum segment down 实例
  8. ansible进阶(五)-handlers-任务发生更改时触发操作
  9. python_PEP 8: E703 statement ends with a semicolon
  10. 日志:每个软件工程师应该知道的实时数据的统一抽象概念