当前位置:首页 > 读后感 > 音频处理软件手机版 嵌入式音频处理基础(二)
 

音频处理软件手机版 嵌入式音频处理基础(二)

发布时间:2019-01-06 03:56:06 影响了:

  在本文的第2部分中,我们首先对动态范围与精度的论题进行探讨,然后再对数据格式进行深入的讨论,因为数据格式是与音频处理相关的。         动态范围与精度
  
  您也许已经见到过dB的规范,这是在目前市场上用于描述各种产品而随处可见的。表1列出了几种产品以及它们的信号质量,以dB为单位。
  那么,这些数值究竟代表什么意思呢?让我们从确定一些定义来开始。把图1作为对下列基本规范的“仿制数据手册(cheatsheet)”的一个参考信号。
  人耳的动态范围(最响的信号电平与最安静的信号电平之比值)约为120dB。在存在噪声的系统中,动态范围被描述为最大信号电平与本底噪声之间的比值。这就是说,
  动态范围(dB)=峰值电平(dB)一本底噪声(dB)纯模拟系统中的本底噪声来自系统本身的电特性。建立在模拟系统之上的数字音频信号也会从ADC和DAC中获得噪声,而且还可以从模拟数据采样过程所产生的量化误差中获得噪声。
  
  另一个重要的术语是信噪比(SNR)。在模拟系统中,信噪比的意思是标称信号对于本底噪声的比值,其中的“线电平”是标称工作电平。对于专业设备,标称电平通常为1.228 Vrms,这可以转换为+4 dBu。余量是标称电平与峰值电平之间的差值,峰值电平指开始出现信号失真的电平。数字系统中的SNR定义有些不同,即SNR被定义为动态范围。
  现在,有了对动态范围的理解,我们就可以开始讨论动态范围在实际中有怎样的用途。不做冗长的推导,让我们简单介绍一下什么是6 dB规则。这个规则是动态范围与计算字长之间关系的关键所在。完整的公式推导在式1中说明,但这里使用了简便的表示法,意思是每增加1位的精度,将使动态范围增加6 dB。应该注意,这个6 dB的规则并没有考虑到音频设计中的模拟子系统,所以,输入端和输出端的传感器的非理想性必须另作考虑。
  动态范围(dB)=6.02n+1.76≈6n dB
  其中n=精度位的数目
  式1:6dB规则
  “6 dB规则”指出,使用的位数越多,我们能获得的系统质量就越高。但实际上,只有少数几个真正可用的选择。大多数适用于嵌入式媒体处理的器件有三种字长形式:16位、24位和32位。表2总结了这三类处理器的动态范围。
  
  由于我们在讨论6 dB规则,所以有必要对语音信号中常被使用的非线性量化方法进行一些讨论。电话质量的线性PCM编码需要12位的精度。但是,我们的耳朵对小幅度时音频信号变化的敏感度要超过大幅度时。因此,电话通讯中使用的线性PCM采样方法的位数用得过多。A律和“律压扩标准中使用的对数量化只用8位精度就达到了12位PCM的质量等级。为了使我们的生活更加方便,有些处理器厂商已经把A律和μ律压扩标准做到了器件的串行端口中。这使处理器内核无需进行对数计算。
  在查看了表2之后,我们又一次回想起人耳的动态范围约为120 dB。基于这个原因,16位数据的表示法对于高质量音频并不是太合适。因此,供应商引入了对16位系统的动态范围进行扩展的24位处理器。这些24位的系统从C编译器的观点来看有点不标准,所以近年来的许多音频设计使用了32位的处理方式。
  选择了正确的处理器并不是万事大吉了,因为一个音频系统的总体质量是由“达到最低质量”元件的等级所决定的。除了处理器外,整个系统还包括像话筒和扬声器这样的一些模拟元件,以及使信号在模拟域与数字域之间变换的转换器。模拟域超出了这次讨论的范围,而音频转换器则涉及到了数字域。
  
  假设您想使用AD1871进行音频采样。转换器的数据手册中把它解释为一个24位的转换器,但它的动态范围不是144 dB,而是105 dB。其原因是转换器不是一个完美无缺的系统,而供应商只给出了有用的动态范围。
  如果您真的想把AD1871与24位处理器相连,那么,您整个系统的SNR将为105dB。本底噪声将达到144dB-105dB=39dB。图2是这一情况的图形表示。但是,在数字音频系统中还有另一个组件我们还没有讨论:处理器内核内的计算。
  使数据经过处理器的计算单元会潜在地引入各种误差。其中之一就是量化误差。这种误差可以在一连串导致数据值被截取或舍入(向上或向下)的计算中产生。例如,一个16位处理器可以对一个16位数据组成的向量作加法,然后把结果存入一个扩展字长的累加器中。但是,当累加器中的数值最终被写入到一个16位数据寄存器中时,其中的有些位会被截去。
  可以看一下图3,看看计算误差是如何影响到实际系统的。‘对于一个理想的16位A/D转换器(图3a),信噪比应该是16×6=96 dB。如果不存在量化误差,那么,16位计算足以把SNR保持在96 dB。而24位和32位系统将分别把8位和16位置于本底噪声以下的动态范围中。从本质上看,这些额外的数位是被浪费掉了。
  但是,所有的数字音频系统都确实要引入舍入和截取误差。如果我们可以量化这个误差,如确定为18dB(或3位),那么很清楚,16位计算对于维持96dB的系统SNR是不够的(图3b)。解释这一点的另一个方法是,有效的本底噪声被提高了18dB,因而总的SNR就降低到了96dB-18dB=78dB。这导致的结论是,在本底噪声以下的额外数位有助于解决量化中出现的麻烦事。
  
  音频的数据格式
  
  在处理器内部有许多种表示数据的方法。音频处理中使用的两种主要的处理器架构是定点与浮点。定点处理器设计成用整数和分数进行运算,通常固有地支持16位、24位或32位的数据。浮点处理器提供非常好的性能,并固有地支持32位或64位的浮点数据类型。但是,这些浮点处理器一般成本比较高,而且比相应的定点处理器消耗更多的功率,因而所有的实际系统都必须在质量和工程成本之间寻求一个平衡点。
  
  定点运算
  
  执行定点运算的处理器一般对信号使用二进制补码表示法。定点格式可以表示有符号和无符号的整数和分数。在定点处理器上使用有符号的分数格式是在数字信号处理中最常见的。整数与分数格式的差别在于二进制小数点的位置。对于整数,二进制小数点是在最低位的右边;而对于分数,通常把它们的小数点放在符号位的右边。图4a表示了整数和分数的格式。
  虽然定点的规则简化了数值操作且节省了存储器,但同时也存在动态范围和精度之间的折衷。在需要保持很高分辨率同时又要使用很大数值范围的应用场合,就需要使用一个可以根据幅值和指数而移动的小数点。
  
  浮点运算
  
  ・使用浮点格式就可以在同一系统中表示 非常大和非常小的数。浮点数与有理数的科学记数法十分相似。浮点数是用尾数和指数描述的。尾数确定了精度,而指数控制着动态范围。
  有一个标准管理着数字机的浮点运算。这个标准叫IEEE- 754(图4a);对于32位浮点数可以归纳如下。第31位(MSB,最高位)是符号位,它的O表示符号为正,它的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表示了从常用的浮点和定点类型可以达到的最小数和最大数。
  
  在16位架构上的仿真
  
  正如我们在前面解释的,16位处理并不能为高质量音频提供足够的SNR,但这并不是说您不应该选用16位处理器作为音频系统。例如,用一个32位的浮点机把一个算法编写成保持原来32位数据风格的程序,是比较容易的;但一个16位处理器也可以通过非常低成本的仿真而保持32位的完整性。图5示出了为一个嵌入式算法选择数据类型时的一些可能性。
  在本节的余下部分,我们将描述如何在一个16位定点机上实现浮点和32位扩展精度定点格式的功能。
  
  在定点处理器上的浮点仿真
  
  在大多数的16位定点处理器上,IEEE-754浮点功能是通过对C/C++或汇编语言的库调用而提供的。这些库通过使用定点乘法和运算逻辑而对所需的浮点处理进行仿真。这种仿真需要额外的处理周期来完成。但是,当定点处理器内核的时钟进入到500 MHz-1GHz范围时,在对符合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×R1进行仿真的时候,我们需要下面的操作:
  *四次16位乘法以产生四个32位结果
  1.R1.L×R0.L
  2.R1.L×R0.H
  3.R1.H×R0.L
  4.R1.H×R0.H
  *三次操作以保持在最终结果中数位的位置(符号>>表示右移)。由于我们正在做分数运算,所以结果是1.63(1.31×1.31=2.62,带有一个冗余的符号位)。在大多数情况下,这个结果可以截取到1.31,以便装入一个32位数据寄存器。因此,乘法的结果应该以符号位为基准,或者以最大有效位为基准。这样,那些最右边的最小有效位可以在截取操作时被安全地截取。
  1.(R1.L×R0.L)>>32
  2.(R1.L×R0.H)>>16
  3.(R1.H×R0.L)>>16
  一个32位乘法的最终表达式
  ((R1.L×R0.L)>>32+(R1.L×R0.H)>>16)+((R1.H×R0.L)>>16+R1.H×R0.H)
  在Blackfin架构中,这些指令可以并行执行,以实现在三个周期内完成一次32位乘法的有效速率。
  
  31位-精确仿真
  
  我们可以把最高要求31位精度的定点乘法的计算时间减少到2个周期。这个技术对于音频系统特别有吸引力,因为音频系统通常至少需要24位的表示法,而32位的精度也许有些过分。使用“6 dB规则”,31位的精确仿真仍然保持了大约186 dB的动态范围,即使考虑了所有的量化效应之后,这仍然具有非常充裕的余量。
  从图6中的乘法框图来看,很明显的一点是,最小有效位半字的乘法R1.L×R0.L对最终的结果没有太大的贡献。事实上,如果把结果截取为1.31,那么这个乘法只影响到1.31结果的最低位。对于许多应用来说,由这一位引起的精度损失是通过减少一次16位乘法、一次移位和一次加法以加速32位乘法而得以平衡的。
  31位精确乘法的表达式为
  ((R1.L×R0.H)+(R1.H×R0.L))>>16+(R1.H×R0.H)
  在Blackfin架构中,这些指令可以并行执行,以实现在2个周期内完成一次32位乘法的有效速率。
  所以,这是音频处理中使用的数据格式的“独家新闻”。在本文的最后一部分,我们将介绍开发嵌入式音频应用的一些策略,主要聚焦于常用算法中的数据传输和构建模块。

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3