DSP定点数的计算规则和示例

这篇具有很好参考价值的文章主要介绍了DSP定点数的计算规则和示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. Q/S表示法的数值范围

2. 定点化加减法计算规则

2.1 防溢出处理

3. 定点化乘法计算规则

3.1 推算

4. 定点化除法计算规则

4.1 推算

5. 程序代码中如何确定Q值

6. 浮点转定点计算示例


1. Q/S表示法的数值范围

Q表示法

S表示法

数的范围

Q15

S0.15

-1≤X≤0.9999695

Q14

S1.14

-2≤X≤1.9999390

Q13

S2.13

-4≤X≤3.9998779

Q12

S3.12

-8≤X≤7.9997559

Q11

S4.11

-16≤X≤15.9995117

Q10

S5.10

-32≤X≤31.9990234

Q9

S6.9

-64≤X≤63.9980469

Q8

S7.8

-128≤X≤127.9960938

Q7

S8.7

-256≤X≤255.9921875

Q6

S9.6

-512≤X≤511.9804375

Q5

S10.5

-1024≤X≤1023.96875

Q4

S11.4

-2048≤X≤2047.9375

Q3

S12.3

-4096≤X≤4095.875

Q2

S13.2

-8192≤X≤8191.75

Q1

S14.1

-16384≤X≤16383.5

Q0

S15.0

-32768≤X≤32767

注:

DSP定点数的计算规则和示例,语音信号处理,算法

2. 定点化加减法计算规则

加减法,首先要做的是对标,也就是Q值相同才能进行加减法。

(1)加法

如果两个参与运算的加数Q值不同,则首先要进行小数点的调整,数学表达式推算:

DSP定点数的计算规则和示例,语音信号处理,算法

 故定点加法的伪代码描述如下:

Int x,y,z;

Long temp;

Temp=y<<(Qx-Qy);

Temp=x+temp;

If(Qx≥Qz)

z=(int)(temp>>( Qx- Qz))

else if(Qx≤Qz)

z=(int)(temp<<( Qz- Qx))

else

示例代码:

#include <stdio.h>
#include <stdlib.h>
#define Q15 32768.0
#define Q13 8192.0

int main()
{
	float x=0.5;
	float y=3.1; //结果3.6-->Q13

	short x_Qx=(short)(x*Q15+0.5);
	short y_Qx=(short)(y*Q13+0.5);
	short z_Q13;

//	printf("%d\n", x_Qx);
//	printf("%d\n", y_Qx);
	long temp;
	temp=y_Qx<<2;
	temp=temp+x_Qx; 
	z_Q13=(int)(temp>>2);
	printf("res:%f\n", z_Q13/Q13);

    return 0;
}

结果:res:3.599976

(2)减法

代码示例

#include <stdio.h>
#include <stdlib.h>
#define Q15 32768.0
#define Q13 8192.0

int main()
{
	float x=3.0;
	float y=3.1; //结果x-y=-0.1-->Q15

	short x_Qx=(short)(x*Q13+0.5);
	short y_Qx=(short)(y*Q13+0.5);
	short z_Q15;

//	printf("%d\n", x_Qx);
//	printf("%d\n", y_Qx);
	long temp;
	temp=x_Qx-y_Qx; //

	z_Q15=(int)(temp<<2);
	printf("res:%f\n", z_Q15/Q15);

    return 0;
}

结果:res:-0.099976

2.1 防溢出处理

整型数进行加减运算的时候,如果得到的结果超出范围:-32768≤X≤32767,即[8000H-7FFFH]

则称之为上溢或者下溢。

(1)下溢:

x=32766, y=3,x和y均从浮点数转换而来,假设它们是同一个Q值,进行加法操作后,结果为:32769,假设这里的数值都是16bit的,那么32769的补码就是:

1000000000000001

计算机将该值取出时,会把它当成一个负数(最高位符号位为1):除去符号位,其余位减1得到:0000 0000 0000 000

再取反,得到:1111 1111 1111 111,为-32767d

所以,若将该数加上1,并不是32770,而是-32766。

测试代码:

#include <stdio.h>

#include <stdlib.h>

int main()

{

short x=32766;

short y=3;

short z=x+y;

printf("z=%d\n", z);

    return 0;

}

结果:z=-32767

(2)上溢

设x=15000,y=20000,则求和后z=x+y=35000 > 32767,如果结果超出16bit的表示范围,则保留32bit的结果(转成32bit数进行运算)。

首先,进行定标(16bit):Qx=1, Qy=0, Qz=0

定点加法先定标,y向x对齐:long temp=y<<1=20000<<1=40000

进行加法:temp=temp+(x<<1);//相当于两个加数同时左移

最后,结果:temp=temp>>1; //Qx>Qz

测试代码:

#include <stdio.h>

#include <stdlib.h>

int main()

{

short x=15000, y=20000;

int temp, z;

temp=(y<<1);

temp=(x<<1)+temp;

z=temp>>1;

printf("z=%d\n", z);

    return 0;

}

结果:z=35000

结果超范围,则两个加数同时左移,最后同时右移,结果不在用16bit来存储,而是32bit。伪代码如下:

Int x,y;

Long temp, z;

Temp=y<<(Qx-Qy); //假设Qx>Qy,y向x对标,y就要左移操作(上文数学表达式推算)。

Temp=x+temp;

If(Qx≥Qz)

z=(int)(temp>>( Qx- Qz))

else if(Qx≤Qz)

z=(int)(temp<<( Qz- Qx))

else

另一种做法是,保持16bit的运算(虽然对结果进行了检查):

#include <stdio.h>

#include <stdlib.h>

#include <stdint.h>

int16_t Q16_add_sat(int16_t a, int16_t b)

{

    int16_t result;

    int32_t tmp;

    tmp = (int32_t)a + (int32_t)b;

    if (tmp > 0x7FFF)

        tmp = 0x7FFF;

    if (tmp < -1 * 0x8000)

        tmp = -1 * 0x8000;

    result = (int16_t)tmp;

    return result;

}

int main()

{

short x=15000, y=20000;

// int temp, z;

// temp=(y<<1);

// temp=(x<<1)+temp;

// z=temp>>1;

// printf("z=%d\n", z);

printf("z=%d\n", q_add_sat(x,y));

    return 0;

}

结果:z=32767,精度严重恶化。

修改如下:

int32_t Q16_add_sat(int16_t a, int16_t b)

{

    int32_t result;

    result = (a<<1) + (b<<1);

    result = (result>>1);

    return result;

}

int main()

{

short x=15000, y=20000;

// int temp, z;

// temp=(y<<1);

// temp=(x<<1)+temp;

// z=temp>>1;

// printf("z=%d\n", z);

printf("z=%d\n", Q16_add_sat(x,y));

    return 0;

}

3. 定点化乘法计算规则

3.1 推算

DSP定点数的计算规则和示例,语音信号处理,算法

 所以,定点乘法伪代码如下:

Int x,y,z;

Long temp;

Temp=long(x);

z=(temp*y)>>();

测试代码:

#include <stdio.h>

#include <stdlib.h>

#include <stdint.h>

#define Q10 1024.0

#define Q9 512.0

#define Q5 32.0

int main()

{

float x=18.4, y=36.8;

long temp;

short x_Q16=x*Q10;

short y_Q16=y*Q9;

short res;

temp=x_Q16*y_Q16;

res=temp>>(10+9-5);

printf("res=%d, %f\n", res, res/32.0);

    return 0;

}

结果:res=21666, 677.062500

4. 定点化除法计算规则

4.1 推算

DSP定点数的计算规则和示例,语音信号处理,算法

 测试代码:

#include <stdio.h>

#include <stdlib.h>

#include <stdint.h>

#define Q15 32768.0

#define Q10 1024.0

#define Q9 512.0

#define Q5 32.0

int main()

{

float x=18.4, y=36.8;

long temp;

short x_Q16=x*Q10;

short y_Q16=y*Q9;

short res; //Q15

temp=(x_Q16<<(15-10+9));

res=temp/y_Q16;

printf("res=%d, %f\n", res, res/Q15);

    return 0;

}

结果:res=16384, 0.500000

5. 程序代码中如何确定Q值

DSP定点数的计算规则和示例,语音信号处理,算法

6. 浮点转定点计算示例

示例1:混合计算

计算1.78x0.6+2.43

DSP定点数的计算规则和示例,语音信号处理,算法

DSP定点数的计算规则和示例,语音信号处理,算法

代码:

#include <stdio.h>

#include <stdlib.h>

#define Q13_a (0.35*8192.0)

#define Q13_b (2.7*8192.0)

#define Q13_c (1.43*8192.0)

void main()

{

int a,b,c,d,f;

long result;

a=(int)Q13_a;

b=(int)Q13_b;

c=(int)Q13_c;

result=(long)(a*b);

d=(result>>13);

f=d+c;

printf("result:%f\n", f/8192.0);

}

示例2:汉明窗的计算

示例3:FIR低通滤波实现文章来源地址https://www.toymoban.com/news/detail-626660.html

到了这里,关于DSP定点数的计算规则和示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数字信号处理课程设计】基于MATLAB实现语音信号的采集与处理(偏重滤波)

    目录 一、目标与任务 二、原理介绍 2.1 录音原理 2.2 滤波器的设计原理及设计方法 2.3 IIR 数字滤波器设计原理 2.4 双线性变换法 三、GUI界面设计与实现 四、基于MATLAB仿真 4.1实验过程 4.2 结果分析 五、总结 5.1 函数用法总结 5.2 心得体会 六、参考文献 这个项目在我的B站上有专

    2024年01月18日
    浏览(42)
  • 基于matlab的语音信号处理

    摘要 利用所学习的数字信号处理知识,设计了一个有趣的音效处理系统,首先设计了几种不同的滤波器对声音进行滤波处理,分析了时域和频域的变化,比较了经过滤波处理后的声音与原来的声音有何变化。同时设计实现了语音的倒放,变速播放,回响,音调转换等处理效果

    2024年02月08日
    浏览(32)
  • 语音识别入门第二节:语音信号处理及特征提取

    目录 数字信号处理基础 基础知识 傅里叶分析 常用特征提取 特征提取流程 Fbank MFCC 模拟信号到数字信号转化(ADC) :在科学和工程中,遇到的大多数信号都是连续的模拟信号,而计算机只能处理离散的信号,因此,必须对这些连续的模拟信号进行转化,通过采样和量化,转

    2024年02月10日
    浏览(32)
  • 【VPX630】青翼 基于KU115 FPGA+C6678 DSP的6U VPX通用超宽带实时信号处理平台

    板卡概述 VPX630是一款基于6U VPX总线架构的高速信号处理平台,该平台采用一片Xilinx的Kintex UltraScale系列FPGA(XCKU115)作为主处理器,完成复杂的数据采集、回放以及实时信号处理算法。采用一片带有ARM内核的高性能嵌入式处理器ZU9EG作为协处理器来实现通讯和管理功能。 该平

    2024年02月06日
    浏览(33)
  • 利用matlab时频域语音信号的分析与处理

    鱼弦:CSDN内容合伙人、CSDN新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 利用Matlab进行时频域语音信号的分析与处理:原理详解 时频域分析是对信号在时间和频率两个维度上进行分析的方法。在语音信号处理

    2024年02月06日
    浏览(34)
  • c++通过自然语言处理技术分析语音信号音高

            对于语音信号的音高分析,可以使用基频提取技术。基频是指一个声音周期的重复率,也就是一个声音波形中最长的周期。 通常情况下,人的声音基频范围是85Hz到255Hz。根据语音信号的基频可以推断出其音高。         C++中可以使用数字信号处理库或语音处理

    2024年02月14日
    浏览(48)
  • 毕业设计-基于MATLAB的含噪语音信号降噪处理系统

    目录 前言 课题背景和意义 实现技术思路 一、设计思路 二、IIR 数字滤波器的设计原理 三、语音信号的采集、 含噪语音信号的分析处理 四、总结 实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边

    2024年02月07日
    浏览(44)
  • 语音信号处理基础知识之频谱、相位谱、幅度谱、功率谱及语谱图

    一段音频信号在时域上,可以用一个实数向量来表示。这个数组的大小=采样率*音频时长。举个例子:一段采样率为8000,长15.6s的音频在matlab中表示为: 15.6x8000=124800大小的实数向量 下面是利用matlab读取.wav文件和.pcm文件的两种方法 从上图可以看出,音频信号在matlab中就是用一

    2024年02月05日
    浏览(84)
  • 【老生谈算法】基于matlab时域频域处理的语音信号变声处理系统设计与算法原理(论文+程序源码+GUI图形用户界面)——变声算法

    大家好,今天给大家介绍基于matlab的语音信号变声处理系统设计与算法原理(论文+程序源码)。 运用matlab软件实现对声音的变声处理,利用离散付里叶变换进行频谱分析;设计数字滤波器组;通过时域和频域方法做出各种音效效果,实现变速(慢放、快放),变调(频谱左

    2024年02月04日
    浏览(46)
  • 图像处理 信号处理板 设计原理图:367-基于zynq XC7Z100 FMC接口通用计算平台

    基于zynq XC7Z100 FMC接口通用计算平台   板卡由SoC XC7Z100-2FFG900I芯片来完成卡主控及数字信号处理,XC7Z100内部集成了两个ARM Cortex-A9核和一个kintex 7的FPGA,通过PL端FPGA扩展FMC、光纤、IO等接口,PS端ARM扩展网络、USB、RS232等接口。板卡适应于图像处理、震动、通信、雷达等前端信号

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包