Q格式问题
什么是Q格式数?
比如

_iq var = _IQ(0.1);
_iq multi = _IQmpy(1 * _IQ(1));

为什么有Q格式?
将小数(应该说是浮点数)化成整数,目的是为了加快运算速度,可以百度Q格式数的原理。

如何使用Q格式计算
既然是将小数化成整数,那么肯定是要乘上某个值,让小数变成整数

typedef long _iq; /* Fixed point data type: GLOBAL_Q format */
typedef   long    _iq30;
typedef   long    _iq29;
typedef   long    _iq28;
typedef   long    _iq27;
typedef   long    _iq26;
typedef   long    _iq25;
typedef   long    _iq24;
typedef   long    _iq23;
typedef   long    _iq22;
typedef   long    _iq21;
typedef   long    _iq20;
typedef   long    _iq19;
typedef   long    _iq18;
typedef   long    _iq17;
typedef   long    _iq16;
typedef   long    _iq15;
typedef   long    _iq14;
typedef   long    _iq13;
typedef   long    _iq12;
typedef   long    _iq11;
typedef   long    _iq10;
typedef   long    _iq9;
typedef   long    _iq8;
typedef   long    _iq7;
typedef   long    _iq6;
typedef   long    _iq5;
typedef   long    _iq4;
typedef   long    _iq3;
typedef   long    _iq2;
typedef   long    _iq1;#define   _IQ30(A)      (long) ((A) * 1073741824.0L)
#define   _IQ29(A)      (long) ((A) * 536870912.0L)
#define   _IQ28(A)      (long) ((A) * 268435456.0L)
#define   _IQ27(A)      (long) ((A) * 134217728.0L)
#define   _IQ26(A)      (long) ((A) * 67108864.0L)
#define   _IQ25(A)      (long) ((A) * 33554432.0L)
#define   _IQ24(A)      (long) ((A) * 16777216.0L)
#define   _IQ23(A)      (long) ((A) * 8388608.0L)
#define   _IQ22(A)      (long) ((A) * 4194304.0L)
#define   _IQ21(A)      (long) ((A) * 2097152.0L)
#define   _IQ20(A)      (long) ((A) * 1048576.0L)
#define   _IQ19(A)      (long) ((A) * 524288.0L)
#define   _IQ18(A)      (long) ((A) * 262144.0L)
#define   _IQ17(A)      (long) ((A) * 131072.0L)
#define   _IQ16(A)      (long) ((A) * 65536.0L)
#define   _IQ15(A)      (long) ((A) * 32768.0L)
#define   _IQ14(A)      (long) ((A) * 16384.0L)
#define   _IQ13(A)      (long) ((A) * 8192.0L)
#define   _IQ12(A)      (long) ((A) * 4096.0L)
#define   _IQ11(A)      (long) ((A) * 2048.0L)
#define   _IQ10(A)      (long) ((A) * 1024.0L)
#define   _IQ9(A)       (long) ((A) * 512.0L)
#define   _IQ8(A)       (long) ((A) * 256.0L)
#define   _IQ7(A)       (long) ((A) * 128.0L)
#define   _IQ6(A)       (long) ((A) * 64.0L)
#define   _IQ5(A)       (long) ((A) * 32.0L)
#define   _IQ4(A)       (long) ((A) * 16.0L)
#define   _IQ3(A)       (long) ((A) * 8.0L)
#define   _IQ2(A)       (long) ((A) * 4.0L)
#define   _IQ1(A)       (long) ((A) * 2.0L)

DSP上是乘上2的N次幂,总之就是将小数变成了整数。但是从手册上可以看出不同的定义有不同的范围

刚开始的时候有个地方非常困扰我,_iq,_iq1,_iq2…,明明定义的都是long为什么会有不同的范围呢?后来我想应该是他们都是long型的意思是他们呢都有64位,但是定点数的小数点是变化的(可以看看定点数的意义),_iq30就是小数点在30位。他们的计算都是整型在计算,但是表示的格式是小数。
举个例子来说明一下,先来一个24位Q格式的

_iq24 var = _IQ24(0.75)
//代表的意思是
var = (long)(0.75 * 16777216.0L) = 12582912;

再来一个15位Q格式的

_iq15 var = _IQ15(0.75)
//代表的意思是
var = (long)(0.75 * 32768.0L) = 24567;

我们看到,虽然不同位的Q格式得到的var不同,但是我们知道表示都是0.75。然后我们再来看看为什么同是long类型,但是却又不同的范围。从手册上可以看出24位Q格式的范围是-128~128,可是他是long类型的的啊,范围应该很大的啊,为什么整数部分这么小,用一个byte就可以表示了?其他的32-8 = 24位呢?其实仔细一看手册,我们发现还有精度的表示,没错,其余的24位表示了精度。看一个例子

0.75 * 1
->转化成24位Q二进制(只是为了形象)
0000 0000 . 1100 0000 0000 0000 0000 0000
0000 0001 . 0000 0000 0000 0000 0000 0000
->转化成24位Q格式数
0000 0000 1100 0000 0000 0000 0000 0000
0000 0001 0000 0000 0000 0000 0000 0000

上面很形象的展示了Q格式。小数点在第24位的左边,左边的是整数,右边的是小数,精度是2的 -24次幂。这就很简单了。
上面的写成代码就是下面

(_IQ24(0.75) * _IQ24(1)) >> 48

或者

_IQ24mpy(_IQ24(0.75) * _IQ24(1)) >> 24

上面用了一个函数_IQ24mpy。库里是这样写的

#define   _IQmpy(A,B)    __IQmpy(A,B,GLOBAL_Q)
#define   _IQ30mpy(A,B)  __IQmpy(A,B,30)

这个函数一开始也让我觉得奇怪。后来测试了一下,表示的意思就是

(A * B) >> GLOBAL_Q

单片机学习:Q格式数相关推荐

  1. DSP数的表示:定点小数Q 格式表示和加法

    DSP数的表示:定点小数Q 格式表示和加法 DSP数的表示:定点小数Q 格式表示和加法 在低开销DSP上表示小数 Q格式 小数点位置选择 Q格式举例 符号扩展 Q格式加法 使用保护位(guard bi ...

  2. 一文教你搞懂C语言的Q格式使用

    用过DSP的应该都知道Q格式吧: 1 前言 Q格式是二进制的定点数格式,相对于浮点数,Q格式指定了相应的小数位数和整数位数,在没有浮点运算的平台上,可以更快地对浮点数据进行处理,以及应用在需要恒定分辨 ...

  3. C语言居然还有Q格式这种用法?

    ID:小麦大叔 作者:菜刀和小麦 用过DSP的应该都知道Q格式吧: 1 前言 Q格式是二进制的定点数格式,相对于浮点数,Q格式指定了相应的小数位数和整数位数,在没有浮点运算的平台上,可以更快地对浮点数 ...

  4. DSP应用学习:定点DSP的小数运算方法—Q格式

    一.定点DSP做小数运算思路梳理: 1.由于定点DSP适用于做整数的加减乘除运算,在做小数的加减乘除等运算时效率极低,因此在做含小数数据运算时需要将小数转换为Q格式的整数,从而将问题转变为整数的加减乘 ...

  5. 【小白】【大学】一名嵌入式软件开发小白的单片机学习历程、心路历程、经验分享

    我的嵌入式学习之路 我为什么写这篇文章 先简单介绍一下我自己 与每一个技术小白共勉 这篇文章写给谁 我的学习经验分享 我的成长之路 我的单片机学习历程分享 51系列单片机学习历程 预备知识:(可以查百 ...

  6. ESP32 单片机学习笔记 - 06 - (以太网)Ethernet转Wifi

    ESP32 单片机学习笔记 - 06 - (以太网)Ethernet转Wifi 暂停了半个多月的学习,去调车了.现在课设开始了,赶紧回来把一开始的"以太网"目标学完.但是却发现,好 ...

  7. AutoLeaders控制组—51单片机学习笔记

    文章目录 AutoLeaders控制组-51单片机学习笔记 1.1单片机及开发板介绍 单片机介绍 单片机应用领域 STC89C52单片机 内部结构 开发板介绍 2.1点亮一个Led 新建工程 编程 认 ...

  8. stm32正常运行流程图_STM32单片机学习笔记(超详细整理143个问题,学习必看)...

    原标题:STM32单片机学习笔记(超详细整理143个问题,学习必看) 1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2.Stm32f ...

  9. ESP32 单片机学习笔记 - 03 - MCPWM脉冲输出/PCNT脉冲计数

    ESP32 单片机学习笔记 - 03 - MCPWM脉冲输出/PCNT脉冲计数 前言,继续上一篇的内容.因为上一篇刚好实验了iic和spi,形成一对.接下来讲pwm另起一篇. 目录 ESP32 单片机 ...

最新文章

  1. 项目Beta冲刺(团队3/7)
  2. 提升Visual Studio 2012的响应能力
  3. ipad/iphone启动界面Default.png
  4. 除了中国,原来还有这么多国家采用十二生肖的啊~| 今日最佳
  5. mysql5.7.18压缩包下载_Windows安装MySQL5.7教程
  6. Qt中的Q_OBJECT
  7. Android开发之InstanceState详解
  8. java面试题2018带答案_java面试题及答案下载
  9. 快速掌握——LCD1602液晶显示(多组实验,附带源程序)
  10. 【Allegro学习笔记】表面贴装封装设计过程——0603封装
  11. 新闻叙事与文学影视叙事的区别
  12. opencv 显示无边框
  13. 4G工业路由器防静电保护
  14. QT 单个窗口实现多页面切换
  15. word中使用mathtype编辑公式并添加序号
  16. 三相有功无功电流检测方法
  17. 20165334 学习基础与c语言学习心得
  18. 三星服务器内存条型号区分,三星内存铭牌详解|三星内存条标签内存参数详解...
  19. 华为怎么退出子用户_华为游戏中心怎么退出账号的具体步骤
  20. 洛谷排行榜JAVA实现

热门文章

  1. 杨元庆:设备是联想的命根 手机是物联网基础
  2. 使用vite创建单页应用
  3. 标题优化,防止修改标题降权,关键词堆砌,引流词
  4. linux下C编程详解
  5. 2023山西财经大学计算机考研信息汇总
  6. 结构体所占内存的字节数——内存对齐
  7. Spring boot 解析mp4格式视频交给前端进行播放
  8. 北京Linux运维培训怎么选?
  9. CSS3简单魔方动画效果
  10. 【微信小程序】图库——(后台接口篇)