DSP中浮点转定点运算--定点数模拟浮点数运算及常见的策略_C 语言

4.定点数模拟浮点数运算及常见的策略

  相信大家到现在已经大致明白了浮点数转换成定点数运算的概貌。其实,原理讲起来很简单,真正应用到实际的项目中,可能会遇到各种各样的问题。具我的经验,常见的策略有如下几条:

1)除法转换为乘法或移位运算

我们知道,不管硬件平台如果变换,除法运算所需要的时钟周期都远远多于乘法运算和加减移位运算,尤其是在嵌入式应用中,“效率”显得尤为重要。以笔者的经验,其实,项目中的很大一部分除法运算是可以转换成乘法和移位运算,效率还是有很大提升空间的。

2)查表计算

有些运算表达式可能牵扯到很多头疼的数学公式,尤其是在嵌入式硬件平台上,出现这种公式很是头疼,因为硬件相关的软件平台提供的功能很有限,有的就没有很多“常见”的开方等数学公式。如果该类运算在项目中很少出现,而且其取值的个数也不多,那么就可以考虑对各种情况加以分析,把各种可能的结果制作成一个静态的表格(可以理解成数组),再加以简单的条件判断语句就可以解决该类问题。

3)级数展开

该问题的背景同上面的问题。对于一些数学公式,如果取值范围不好处理,就可以采用级数展开的方式。

4)分子分母同时变化

对于一些除法运算,为了保证精度,如果分子的扩大范围不够大的话,可以考虑缩小分母,也可以达到预期效果。具体的例子可以参考我的另一篇文章“解决了个困扰了2天的问题,定点运算问题”。

时间: 2024-09-20 15:02:35

DSP中浮点转定点运算--定点数模拟浮点数运算及常见的策略_C 语言的相关文章

DSP中浮点转定点运算--定点数的加减乘除运算_C 语言

3.定点数的加减乘除运算 简单的说,各种运算的原则就是先把待运算的数据放大一定的倍数,在运算的过程中使用的放大的数据,在最终需要输出结果的时候再调整回去. 举个例来说,有如下运算: 复制代码 代码如下: - // coefs1 = 0.023423; coefs2=0.2131 float coefs1,coefs2; int result; - result = 34* coefs1+72* coefs2; - 代码的意思是,该模块需要输出一个整型的结果,但计算的过程中有浮点的运算.如果在定点

DSP中浮点转定点运算--举例及编程中的心得_C 语言

5.举例及编程中的心得 5.1举例 "第3章  DSP芯片的定点运算.doc"这篇文章中给了一个很简单有能说明问题的例子,不想动大脑了,直接引用过来如下. 这是一个对语音信号(0.3kHz~3.4kHz)进行低通滤波的C语言程序,低通滤波的截止频率为800Hz,滤波器采用19点的有限冲击响应FIR滤波.语音信号的采样频率为8kHz,每个语音样值按16位整型数存放在insp.dat文件中. 例3.7  语音信号800Hz 19点FIR低通滤波C语言浮点程序 复制代码 代码如下: #inc

DSP中浮点转定点运算--浮点数的存储格式_C 语言

二:浮点数的存储格式 2.1 IEEE floating point standard 上面我们说了,浮点数的小数点是不固定的,如果每个人都按照自己的爱好存储在电脑里,那不就乱套了吗?那么怎么在计算机中存储这种类型的数字呢?象这类古老的问题前人早都为我们做好了相应的规范,无规矩不成方圆吗.我们平时所说的浮点数的存储规范,就是由IEEE指定的,具体的规范文件是:IEEE Standard 754 for Binary Floating-Point Arithmetic.大家可以很容易的从网络上下载

DSP中浮点转定点运算--浮点与定点概述_C 语言

一:浮点与定点概述  1.1相关定义说明 定点数:通俗的说,小数点固定的数.以人民币为例,我们日常经常说到的如123.45¥,789.34¥等等,默认的情况下,小数点后面有两位小数,即角,分.如果小数点在最高有效位的前面,则这样的数称为纯小数的定点数,如0.12345,0.78934等.如果小数点在最低有效位的后面,则这样的数称为纯整数的定点数,如12345,78934等. 浮点数:一般说来,小数点不固定的数.比较容易的理解方式是,考虑以下我们日常见到的科学记数法,拿我们上面的数字举例,如123

C语言中字符的输入输出以及计算字符个数的方法详解_C 语言

C语言字符输入与输出 标准库提供的输入/输出模型非常简单.无论文本从何处输入,输出到何处,其输入/输出都是按照字符流的方式处理.文本流是由多行字符构成的字符序列,而每行字符则由 0 个或多个字符组成,行末是一个换行符.标准库负责使每个输入/输出流都能够遵守这一模型.使用标准库的 C 语言程序员不必关心在程序之外这些行是如何表示的. 标准库提供了一次读/写一个字符的函数,其中最简单的是 getchar 和 putchar 两个函数.每次调用时,getchar 函数从文本流中读入下一个输入字符,并将

解析c++中参数对象与局部对象的析构顺序的详解_C 语言

下面是c++的源码: 复制代码 代码如下: class X  {public:   int i;   int j;   ~X() {} };void f(X x) {  X x1;  x.i = 1;  x.j = 2; }int main() {    f(X());} 下面是main函数的汇编码: 复制代码 代码如下: _main    PROC ; 15   : int main() {     push    ebp    mov    ebp, esp    sub    esp, 8

详解C++中基类与派生类的转换以及虚基类_C 语言

C++基类与派生类的转换 在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生类才是基类真正的

C++类中的常数据成员与静态数据成员之间的区别_C 语言

刚开始学习C++的类和对象的部分,对类中的常数据成员和静态数据成员的概念和用法经常混淆,所以今天整理一下,顺便说一下,今天是我的生日,祝我生日快乐,呵呵. 常数据成员常数据成员是指在类中定义的不能修改其值的一些数据成员,类似于我们以前学过的常变量,虽然是变量,也有自己的地址,但是一经赋初值,便不能再被修改. 适用于类中定义一些初始化之后不希望被修改的变量. 定义方法: 复制代码 代码如下: const 类型名 变量名; (1)类中的常数据成员只能通过构造函数的参数初始化表进行初始化. (2)常数

Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析_C 语言

本文以实例详细描述了Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect的定义及用法,具体如下所示: 1.NSRange: NSRange的原型为 typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; NSMakeRange的函数: NS_INLINEz是内联函数 typedef NSRange *NSRangePointer; NS_IN