单片机学习:Q格式数
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格式数相关推荐
- DSP数的表示:定点小数Q 格式表示和加法
DSP数的表示:定点小数Q 格式表示和加法 DSP数的表示:定点小数Q 格式表示和加法 在低开销DSP上表示小数 Q格式 小数点位置选择 Q格式举例 符号扩展 Q格式加法 使用保护位(guard bi ...
- 一文教你搞懂C语言的Q格式使用
用过DSP的应该都知道Q格式吧: 1 前言 Q格式是二进制的定点数格式,相对于浮点数,Q格式指定了相应的小数位数和整数位数,在没有浮点运算的平台上,可以更快地对浮点数据进行处理,以及应用在需要恒定分辨 ...
- C语言居然还有Q格式这种用法?
ID:小麦大叔 作者:菜刀和小麦 用过DSP的应该都知道Q格式吧: 1 前言 Q格式是二进制的定点数格式,相对于浮点数,Q格式指定了相应的小数位数和整数位数,在没有浮点运算的平台上,可以更快地对浮点数 ...
- DSP应用学习:定点DSP的小数运算方法—Q格式
一.定点DSP做小数运算思路梳理: 1.由于定点DSP适用于做整数的加减乘除运算,在做小数的加减乘除等运算时效率极低,因此在做含小数数据运算时需要将小数转换为Q格式的整数,从而将问题转变为整数的加减乘 ...
- 【小白】【大学】一名嵌入式软件开发小白的单片机学习历程、心路历程、经验分享
我的嵌入式学习之路 我为什么写这篇文章 先简单介绍一下我自己 与每一个技术小白共勉 这篇文章写给谁 我的学习经验分享 我的成长之路 我的单片机学习历程分享 51系列单片机学习历程 预备知识:(可以查百 ...
- ESP32 单片机学习笔记 - 06 - (以太网)Ethernet转Wifi
ESP32 单片机学习笔记 - 06 - (以太网)Ethernet转Wifi 暂停了半个多月的学习,去调车了.现在课设开始了,赶紧回来把一开始的"以太网"目标学完.但是却发现,好 ...
- AutoLeaders控制组—51单片机学习笔记
文章目录 AutoLeaders控制组-51单片机学习笔记 1.1单片机及开发板介绍 单片机介绍 单片机应用领域 STC89C52单片机 内部结构 开发板介绍 2.1点亮一个Led 新建工程 编程 认 ...
- stm32正常运行流程图_STM32单片机学习笔记(超详细整理143个问题,学习必看)...
原标题:STM32单片机学习笔记(超详细整理143个问题,学习必看) 1.AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备 2.Stm32f ...
- ESP32 单片机学习笔记 - 03 - MCPWM脉冲输出/PCNT脉冲计数
ESP32 单片机学习笔记 - 03 - MCPWM脉冲输出/PCNT脉冲计数 前言,继续上一篇的内容.因为上一篇刚好实验了iic和spi,形成一对.接下来讲pwm另起一篇. 目录 ESP32 单片机 ...
最新文章
- 项目Beta冲刺(团队3/7)
- 提升Visual Studio 2012的响应能力
- ipad/iphone启动界面Default.png
- 除了中国,原来还有这么多国家采用十二生肖的啊~| 今日最佳
- mysql5.7.18压缩包下载_Windows安装MySQL5.7教程
- Qt中的Q_OBJECT
- Android开发之InstanceState详解
- java面试题2018带答案_java面试题及答案下载
- 快速掌握——LCD1602液晶显示(多组实验,附带源程序)
- 【Allegro学习笔记】表面贴装封装设计过程——0603封装
- 新闻叙事与文学影视叙事的区别
- opencv 显示无边框
- 4G工业路由器防静电保护
- QT 单个窗口实现多页面切换
- word中使用mathtype编辑公式并添加序号
- 三相有功无功电流检测方法
- 20165334 学习基础与c语言学习心得
- 三星服务器内存条型号区分,三星内存铭牌详解|三星内存条标签内存参数详解...
- 华为怎么退出子用户_华为游戏中心怎么退出账号的具体步骤
- 洛谷排行榜JAVA实现