新闻中心

EEPW首页 > 消费电子 > 设计应用 > 嵌入式音频处理基础(二)

嵌入式音频处理基础(二)

作者:David Katz, Rick Gentile和Tomasz Lukasiak ADI公司时间:2008-09-18来源:电子产品世界收藏

定点运算

本文引用地址:http://www.eepw.com.cn/article/88167.htm

  执行定点运算的一般对信号使用二进制补码表示法。定点格式可以表示有符号和无符号的整数和分数。在定点上使用有符号的分数格式是在数字信号处理中最常见的。整数与分数格式的差别在于二进制小数点的位置。对于整数,二进制小数点是在最低位的右边;而对于分数,通常把它们的小数点放在符号位的右边 。图4a表示了整数和分数的格式。


图4(a)分数和整数格式  (b)IEEE 754 32位单精度浮点格式

  虽然定点的规则简化了数值操作且节省了存储器,但同时也存在动态范围和精度之间的折衷。在需要保持很高分辨率同时又要使用很大数值范围的应用场合,就需要使用一个可以根据幅值和指数而移动的小数点。

浮点运算

  使用浮点格式就可以在同一系统中表示非常大和非常小的数。浮点数与有理数的科学记数法十分相似。浮点数是用尾数和指数描述的。尾数确定了精度,而指数控制着动态范围。

  有一个标准管理着数字机的浮点运算。这个标准叫IEEE-754(图4a);对于32位浮点数可以归纳如下。第31位(MSB,最高位)是符号位,它的0表示符号为正,它的1表示符号为负。从第30位到第23位是表示2的整次幂的指数字段(exp_field),并以127作为偏移量。最后,第22位到第0位表示分数的尾数(mantissa)。隐藏位一般是指在小数点的左边有一个1。

  32位的IEEE浮点数的值可以用下面的等式来表示:

  (-1)sign_bit × (1.mantissa) * 2(exp _field-127)

  依靠8位的指数和23位的尾数,IEEE-754达到了动态范围和精度之间的一个平衡。而且,IEEE浮点库还包括了对于像??、0和NaN(不是一个数)等附加特性的支持

  表3表示了从常用的浮点和定点类型可以达到的最小数和最大数。

 

表3  各种数据格式的动态范围比较

在16位架构上的仿真

  正如我们在前面解释的,16位处理并不能为高质量提供足够的SNR,但这并不是说您不应该选用16位作为系统。例如,用一个32位的浮点机把一个算法编写成保持原来32位数据风格的程序,是比较容易的;但一个16位处理器也可以通过非常低成本的仿真而保持32位的完整性。图5示出了为一个算法选择数据类型时的一些可能性。

 


图5  根据一个应用的目标,可以有许多满足系统要求的数据类型

  在本节的余下部分,我们将描述如何在一个16位定点机上实现浮点和32位扩展精度定点格式的功能。

在定点处理器上的浮点仿真

  在大多数的16位定点处理器上,IEEE-754浮点功能是通过对C/C++或汇编语言的库调用而提供的。这些库通过使用定点乘法和运算逻辑而对所需的浮点处理进行仿真。这种仿真需要额外的处理周期来完成。但是,当定点处理器内核的时钟进入到500 MHz - 1 GHz范围时,在对符合IEEE-754的浮点运算进行仿真时需要的额外周期就不那么重要了。

  为了降低计算的复杂性,可以使用IEEE-754的“松弛”版。这意味着浮点运算并不会实现像?和NaN这样一些标准特性。

  进一步的优化是对尾数和指数使用一个更为本机化的类型。举个例子,ADI公司的Blackfin定点处理器架构具有一个由十六个16位寄存器组成的寄存器组,而这个寄存器组还可以用作8个32位寄存器。在这种配置下,每个内核时钟周期内,两个32位寄存器可以从全部四个半寄存器中获取操作数。为了优化Blackfin寄存器组的使用,可以使用一种双字的格式。这样,一个字(16位)被保留为用作指数,而另一个字(16位)则保留给分数部分使用。

双精度定点仿真

  对于许多应用来说,16位定点数据是不够的,如果使用仿真浮点运算,那么计算量又太大。对于这些应用,扩展精度定点仿真也许足以满足系统的要求。使用一个高速定点处理器将确保有效降低所需的计算量。中两个常用的扩展精度格式是32位和31位定点表示。

32位-精确仿真

  32位运算是16位定点处理器的自然软件扩展。对于那些32位寄存器组可以分为16位的两半而进行存取的处理器来说,这些两半的寄存器可以合起来用于表示一个32位定点数。Blackfin处理器的硬件结构允许单周期32位加法和减法。

  例如,当一个32位乘法采用累加器迭代操作时(像我们马上就要讨论的有些算法情况),我们只需用3个周期内的16位乘法就可以实现32位的精度。两个32位操作数(R0和R1)中的每一个都可以分为16位的两半(R0.H / R0.L和R1.H / R1.L)。

  从图6可以容易看出,在使用16位乘法器的指令组合来对32位乘法R0 x R1进行仿真的时候,我们需要下面的操作:

 


图6  用16位操作实现32位乘法

  * 四次16位乘法以产生四个32位结果

  1. R1.L x R0.L
  2. R1.L x R0.H
  3. R1.H x R0.L
  4. R1.H x R0.H

  * 三次操作以保持在最终结果中数位的位置(符号>>表示右移)。由于我们正在做分数运算,所以结果是1.63(1.31 x 1.31 = 2.62,带有一个冗余的符号位)。在大多数情况下,这个结果可以截取到1.31,以便装入一个32位数据寄存器。因此,乘法的结果应该以符号位为基准,或者以最大有效位为基准。这样,那些最右边的最小有效位可以在截取操作时被安全地截取。

  1. (R1.L x R0.L) >> 32
  2. (R1.L x R0.H) >> 16
  3. (R1.H x R0.L) >> 16
  一个32位乘法的最终表达式
  ((R1.L x R0.L) >> 32 + (R1.L x R0.H) >> 16) + ((R1.H x R0.L) >> 16 + R1.H x R0.H)

  在Blackfin架构中,这些指令可以并行执行,以实现在三个周期内完成一次32位乘法的有效速率。

31位-精确仿真

  我们可以把最高要求31位精度的定点乘法的计算时间减少到2个周期。这个技术对于音频系统特别有吸引力,因为音频系统通常至少需要24位的表示法,而32位的精度也许有些过分。使用“6 dB规则”,31位的精确仿真仍然保持了大约186 dB的动态范围,即使考虑了所有的量化效应之后,这仍然具有非常充裕的余量。

  从图6中的乘法框图来看,很明显的一点是,最小有效位半字的乘法R1.L x R0.L对最终的结果没有太大的贡献。事实上,如果把结果截取为1.31,那么这个乘法只影响到1.31结果的最低位。对于许多应用来说,由这一位引起的精度损失是通过减少一次16位乘法、一次移位和一次加法以加速32位乘法而得以平衡的。

  31位精确乘法的表达式为
  ((R1.L x R0.H) + (R1.H x R0.L) ) >> 16 + (R1.H x R0.H)

  在Blackfin架构中,这些指令可以并行执行,以实现在2个周期内完成一次32位乘法的有效速率。

  所以,这是音频处理中使用的数据格式的“独家新闻”。在本文的最后一部分,我们将介绍开发音频应用的一些策略,主要聚焦于常用算法中的数据传输和构建模块。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭