您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于MSP430的语音与音频压缩
基于MSP430的语音与音频压缩/解压缩技术[复制链接]wrr891208版主串个门加好友打招呼发消息电梯直达楼主发表于2012-4-115:45:00|只看该作者|倒序浏览引言采用微控制器(MCU)来实施语音记录器比较简单。许多MCU均采用集成模数(A/D)转换器。扩音器将捕获到的声音提供给放大器,然后再馈送给A/D转换器的模拟输入。可将录制的声音存储在闪存或RAM等存储器中,按下按钮就能触发MCU以播放录制到的声音,其原理是将存储的数据先提供给数模(D/A)转换器,然后再提供给音频功率放大器。利用MSP430很容易实现这种语音记录器。MSP430微控制器利用集成外设来实现片上模拟信号链。此外,MSP430的CPU处理能力非常强大,足以执行录制声音的压缩。压缩与解压缩算法举例来说,实现语音记录器的最简单办法就是将A/D转换器转换结果(如12位采样)直接存储在闪存中。音频数据大多数时间都不使用整个A/D转换器范围,也就是说,冗余数据也存储在闪存中。压缩算法可去除这些冗余信息,从而减小所存储数据的容量。自适应差分脉冲代码调制(ADPCM)就是此种类型的压缩算法。ADPCM算法存在各种类型,但都使用量化器差分编码与量化器中自适应量化阶步长方案。在进一步讨论IMAADPCM算法用于相关代码之前,我们首要来简单介绍一下差分PCM编码。差分脉冲代码调制(DPCM)DPCM通过使用当前采样与前一个采样的差值来对模拟音频输入信号进行编码。图1显示了DPCM编码器与解码器的结构图。在本例中,我们用信号估算Se(n)而非前一个输入来决定信号差值d(n),从而确保了编码器使用的信息与解码器相同。如果编码器使用的是上一个输入采样的话,那么就会造成量化的累积错误,从而使重建信号与原始输入信号不同。通过采用如图1所示的信号估算,我们能避免重建信号Sr(n)与原始输入信号出现差异。重建信号Sr(n)是预测器(predictor)的输入,其决定了下一个信号估算Se(n+1)。PCM值的范围在26到203之间,总共177个步长。编码的DPCM值范围在-44至46之间,总共90个步长。尽管量化器步长仅为1,但这种DPCM编码已经实现了输入数据的压缩功能。只需选择较大的量化器步长即可将编码DPCM值的范围进一步缩小。适应差分脉冲编码调制(ADPCM)ADPCM是DPCM的一个变体,编码器步长会有差异。语音输入信号的强度差异体现在不同的扬声器器上,也体现在语音输入信号的语音和非语音部分上。量化器步长对每个采样都进行适应调节,确保高低输入信号强度都能实现同样的编码效率。图3显示了采用步长调节技术的修订版DPCM结构图。ADPCM编码器通过解码ADPCM代码进行信号估算(Se),这就是说,解码器是ADPCM编码器的一部分,因此已经编码的音频数据流只能用解码器进行重放,这样解码器就必须对编码器加以跟踪。最初的编码器和解码器信号估算等级以及步长大小调节等级必须在开始编码或解码前就加以定义,否则,编码或解码的值就会超过范围。MSP430片上信号链MSP430系列微控制器支持多种片上外设。为了实现完整的片上信号链解决方案,MSP430至少必须提供1个A/D转换器模拟输入和1个D/A转换器。下面我们将介绍两种MSP430解决方案。MSP430F169片上信号链解决方案MSP430F169包括1个集成12位SARA/D转换器,作为一种硬件乘法器模块,它能高效支持数字滤波器,此外MSP430F169还包括1个集成12位D/A转换器模块。图4给出了MSP430F169信号链电路图。上述配置也适合采用外部串行闪存的情况,从而可以满足音频数据的存储需求。外部闪存可通过MSP430的I2C或SPI接口来连接。MSP430F169DMA模块可自动将接收到的数据传输给RAM,从而大幅降低了CPU的负载。MSP430FG4618片上信号链解决方案我们用MSP430FG4618可以实现另一种片上信号链解决方案。MSP430F169可支持60KB的集成闪存,而MSP430FG4618则可支持116KB的闪存。MSP430FG4618的另一优势在于,它还集成了运算放大器模块。运算放大器可用于放大扩音器的输入及数模转换器的模拟输出。图5显示了MSP430FG4618信号链电路图。具体配置采用的是TI推出的MSP430FG4618/F2013试验板。该评估板可与相关代码示例配合使用。扩音器的输出信号非常小,必须放大。MSP430的运算放大器可用于不同的运算模式。如果用于PGA模式,那么最大只能放大到15倍,对扩音器放大器来说还不够。因此,需要通过外部组件来加大增益。图5中的运算放大器OA0即用于通用放大器模式。放大器共有8种设置方式,可以使增益-带宽乘积和转换率等性能与电流消耗达到最佳平衡。图中的所有放大器OA0、OA1及OA2均采用了高性能模式(快速模式)。如欲了解有关运算放大器使用的更多详情,敬请参见MSP430FG4618/F2013试验板用户指南。利用通用串行通信接口(USCI)可将音频数据存储到外部闪存中。我们也可通过I2C总线或SPI总线与外部存储器相连。MSP430性能相关代码文件中有一些*.wav文件示例,可表明解码ADPCM数据的质量。我们可在PC上用媒体播放器等软件来比较这些文件,这样就能体验ADPCM压缩算法的实际质量了。请注意,通过提高音频采样率和音频采样大小(解析度),我们可以进一步提高音频质量。使用相关代码相关代码中包含了两个软件项目,这两个版本都基于第三部分中所介绍的内容,也都采用IMAADPCM算法。ADPCM函数的使用非常简单。首先,必须在应用代码中包含ADPCM.h首标文件。该首标文件定义了ADPCM.c文件的ADPCM函数。在每次音频数据的录制或重放工作之前,必须调用ADPCM_Init()函数。该函数定义了信号估算(Se)的起始值以及用作量化器步长调节的步长指针。编码器和解码器通过设置可实现同步。调用ADPCM_Encoder(intvalue)函数就能进行编码,每个音频采样调用ADPCM_Decoder()函数就能进行回放。以下代码段显示了如何完成上述工作。#includeADPCM.hvoidmain(void){//应用软件初始化while(1)//主循环{//应用软件if(P1IN&0x01)record();if(P1IN&0x02)play();}}voidrecord(void){//初始化后,以便A/D转换器、定时器、放大器等的录制ADPCM_Init();//须在开始录制之前完成//开始录制}voidplay(void){//初始化后,以便A/D转换器、定时器、放大器等的录制ADPCM_Init();//须在开始录制之前完成//开始回放}接下来,我们用IAREmbeddedWorkbenchKickStartversion3.42A来测量ADPCM函数执行的次数。测量时,采用的是默认优化设置。ADPCM_Encoder()函数调用需要114~126个循环。ADPCM_Decoder()函数调用需要99~109个循环。请注意,这只包含压缩/解压缩算法。要实现录制和回放功能,还需要更多代码。
本文标题:基于MSP430的语音与音频压缩
链接地址:https://www.777doc.com/doc-2534612 .html