栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

一.定点DSP做小数运算思路梳理:
1.由于定点DSP适用于做整数的加减乘除运算,在做小数的加减乘除等运算时效率极低,因此在做含小数数据运算时需要将小数转换为Q格式的整数,从而将问题转变为整数的加减乘除运算。
2.将小数转换为Q格式的本质就是将小数通过左移运算乘2的Q次幂把小数转换为整数(乘2的幂是因为乘2的移位运算效率最高)
3.总结:将小数通过左移n位变为整数进行运算,运算完毕,右移相同n位,变回为对应小数。(浮沉)

二.实现

1.浮点数与Q格式的相互转换(C语言实现)

a.一般方法

(1)浮点数转换为Q格式

int FtoQ (float a , unsigned char q)
{
    int temp;
    temp = a * (1 << q);//借位数上去
    return temp;
}

(2)Q格式转换为浮点数

float QtoF(int a , unsigned char q)
{
    float temp;
    temp = a >> q;//欠多少位还回去多少位
    return temp;
} 

b.防止溢出的方法,Q15/Q31类型可以有效防止乘除法运算时溢出(但是加减法不能防止溢出),但还有一个常用且简洁的方法∶把数据全部转化成小数,再用Q15格式表示。具体实现方法参见:

5 DSP Q格式 - 道客巴巴

2.Q格式四则运算(C语言实现)

核心思路:

Q的本质:升高的2次幂阶数(迟早要还回来)

  • 加减法:必须相同的Q格式的数据才能相加减,不同Q格式的数据必先通过移位至相同的Q格式后才能相加减。

  • 乘法:不同Q格式的数据向乘,相当于Q值相加。

  • 除法:不同Q格式的数据向乘,相当于Q值相减。

  • 定点左移:相当于Q值相加。

  • 定点右移:相当于Q值相减。

a.输入均为Q格式数据,输出为Q格式结果

(1)加法

int q_add32(int a,int b)
{
    return (a + b);
}

 (2)减法

int q_sub32(int a,int b)
{
    return (a - b);
}

  (3)乘法

int q_mul32(int a , int b , unsigned char q)
{
    int result;
    result= ((long long int)a * b) >> q;
    return result;
}

  (4)除法

int q_div(int a , int b , unsigned char q)
{
    int result;
    result = ((long long int)a << q) / b;
    return result;
}

b.推广型乘除运算,输入输出Q值不同(应用不多,一般情况都是统一q值,但这样写有利于加深理解)

 (1)乘法

int q_mul32(int a , int b , unsigned char a_q , unsigned char b_q , unsigned char r_q)
{
    int result;
    result = ((long long int)a * b) >> (a_q + b_q - r_q);
    return result;
}

(2)除法

int q_div(int a , int b , unsigned char a_q , unsigned char b_q , unsigned char r_q)
{
    int result;
    result = ((long long int)a << (r_q - a_q  + b_q)) / b;
    return result;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290348.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号