历史上的今天
返回首页

历史上的今天

今天是:2024年11月27日(星期三)

正在发生

2020年11月27日 | 基于MSP430的语音与音频压缩/解压缩技术

2020-11-27 来源:elecfans

  引言

  采用微控制器 (MCU) 来实施语音记录器比较简单。许多 MCU 均采用集成模数 (A/D) 转换器。扩音器将捕获到的声音提供给放大器,然后再馈送给 A/D 转换器的模拟输入。

可将录制的声音存储在闪存或 RAM 等存储器中,按下按钮就能触发 MCU 以播放录制到的声音,其原理是将存储的数据先提供给数模 (D/A) 转换器,然后再提供给音频功率放大器。


  利用 MSP430 很容易实现这种语音记录器。MSP430 微控制器利用集成外设来实现片上模拟信号链。此外,MSP430 的 CPU 处理能力非常强大,足以执行录制声音的压缩。


  压缩与解压缩算法

  举例来说,实现语音记录器的最简单办法就是将 A/D 转换器转换结果(如 12 位采样)直接存储在闪存中。音频数据大多数时间都不使用整个 A/D 转换器范围,也就是说,冗余数据也存储在闪存中。压缩算法可去除这些冗余信息,从而减小所存储数据的容量。


  自适应差分脉冲代码调制 (ADPCM) 就是此种类型的压缩算法。ADPCM 算法存在各种类型,但都使用量化器差分编码与量化器中自适应量化阶步长方案。在进一步讨论 IMA ADPCM 算法用于相关代码之前,我们首要来简单介绍一下差分 PCM 编码。


  差分脉冲代码调制 (DPCM)

  DPCM 通过使用当前采样与前一个采样的差值来对模拟音频输入信号进行编码。图 1 显示了DPCM 编码器与解码器的结构图。在本例中,我们用信号估算 Se(n) 而非前一个输入来决定信号差值 d(n),从而确保了编码器使用的信息与解码器相同。如果编码器使用的是上一个输入采样的话,那么就会造成量化的累积错误,从而使重建信号与原始输入信号不同。通过采用如图 1 所示的信号估算,我们能避免重建信号 Sr(n) 与原始输入信号出现差异。重建信号 Sr(n) 是预测器 (predictor) 的输入,其决定了下一个信号估算 Se(n+1)。

  图 2 显示了一小段录制音频流,并通过两个示意图给出了模拟音频输入采样(PCM 值)与连续采样(DPCM 值)间差值的比较。

  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 位 SAR A/D 转换器,作为一种硬件乘法器模块,它能高效支持数字滤波器,此外 MSP430F169 还包括 1 个集成 12 位 D/A 转换器模块。图4给出了 MSP430F169 信号链电路图。


  上述配置也适合采用外部串行闪存的情况,从而可以满足音频数据的存储需求。外部闪存可通过 MSP430 的 I2C 或 SPI 接口来连接。MSP430F169 DMA 模块可自动将接收到的数据传输给 RAM,从而大幅降低了 CPU 的负载。


  MSP430FG4618 片上信号链解决方案

  我们用 MSP430FG4618 可以实现另一种片上信号链解决方案。MSP430F169 可支持 60 KB 的集成闪存,而 MSP430FG4618 则可支持 116 KB 的闪存。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 压缩算法的实际质量了。请注意,通过提高音频采样率和音频采样大小(解析度),我们可以进一步提高音频质量。


  使用相关代码

  相关代码中包含了两个软件项目,这两个版本都基于第三部分中所介绍的内容,也都采用 IMA ADPCM 算法。


  ADPCM函数的使用非常简单。首先,必须在应用代码中包含ADPCM.h首标文件。该首标文件定义了ADPCM.c文件的ADPCM函数。在每次音频数据的录制或重放工作之前,必须调用 ADPCM_Init() 函数。该函数定义了信号估算(Se)的起始值以及用作量化器步长调节的步长指针。编码器和解码器通过设置可实现同步。调用ADPCM_Encoder (int value)函数就能进行编码,每个音频采样调用 ADPCM_Decoder() 函数就能进行回放。以下代码段显示了如何完成上述工作。


  #include "ADPCM.h"
  void main(void)
  { // 应用软件初始化
  while(1) // 主循环
     { // 应用软件
     if (P1IN & 0x01)
      record();
     if (P1IN & 0x02)
       play();
   }
  }
  void record(void)
  { // 初始化后,以便 A/D 转换器、定时器、放大器等的录制
   ADPCM_Init(); // 须在开始录制之前完成
   // 开始录制
  }
  void play(void)
  { //初始化后,以便 A/D 转换器、定时器、放大器等的录制
   ADPCM_Init(); //须在开始录制之前完成
   // 开始回放
  }

  接下来,我们用 IAR Embedded Workbench KickStart version 3.42A 来测量 ADPCM 函数执行的次数。测量时,采用的是默认优化设置。

  ADPCM_Encoder() 函数调用需要114~126个循环。

  ADPCM_Decoder() 函数调用需要99~109个循环。

  请注意,这只包含压缩/解压缩算法。要实现录制和回放功能,还需要更多代码。


  参考文献:

  1. MSP430x4xx 系列用户指南 (SLAU056)

  2. MSP430F169 产品说明书 (SLAS368)

  3. MSP430FG4618 产品说明书 (SLAS508)

  4. 基于 TMS32010 的 32kbps ADPCM (SPRA131)

  5. 基于 MSP430F13x 的低成本 12 位语音编解码器设计 (SLAA131)

  6. MSP430FG4618/F2013试验板用户指南(SLAU213)


推荐阅读

史海拾趣

Belkin公司的发展小趣事

在发展过程中,贝尔金也通过收购其他公司来增强自身实力。例如,2013年贝尔金正式完成对Linksys的收购,这一举措进一步丰富了其产品线,并加强了在网络设备领域的竞争力。此外,贝尔金还通过不断整合内部资源,优化生产流程,提高产品质量和效率。

爱普特半导体(APTSEMI)公司的发展小趣事

爱普特半导体的产品因其卓越的性能和稳定的质量,赢得了众多大型企业的青睐。公司与小米、美的、阿里、LG等多家知名企业建立了战略合作关系。这些合作不仅为爱普特带来了稳定的订单和市场份额,还提升了公司的品牌影响力和行业地位。通过与这些企业的深度合作,爱普特不断吸收行业最新技术和管理经验,推动了自身技术水平和市场竞争力的提升。

ENSIGN公司的发展小趣事

ENSIGN在资本市场上的表现也备受关注。近年来,ENSIGN的股价稳步上涨,市值不断扩大。多家投资机构对ENSIGN的前景表示乐观,并上调了其目标股价。ENSIGN凭借其稳健的财务表现、强大的研发能力和广阔的市场前景,吸引了众多投资者的关注。

这些故事概述了ENSIGN在电子行业中的发展历程和多元化战略。通过不断创新和拓展业务领域,ENSIGN逐渐成为了电子行业中备受瞩目的企业之一。

Cambridge Electronic Industries Ltd公司的发展小趣事

随着公司实力的增强和产品线的丰富,CEI开始积极寻求市场拓展的机会。公司不仅在国内市场取得了显著的成绩,还开始拓展国际市场。CEI与国际电子巨头建立了紧密的合作关系,共同研发新产品,分享技术和市场资源。这些合作不仅提升了CEI的技术水平和市场竞争力,也为其带来了更广阔的发展空间。

DAPAudio公司的发展小趣事

随着数字化和智能化的快速发展,音频处理行业也面临着巨大的变革。DAPAudio积极应对这一变革,不断推出适应市场需求的新产品和技术。通过与科技公司、高校和研究机构的合作,DAPAudio在人工智能、物联网等新兴领域取得了重要突破,为公司未来的发展奠定了坚实的基础。

Amveco Toroidal Power Products公司的发展小趣事

Amveco Toroidal Power Products公司成立于XXXX年,初始阶段主要专注于环形变压器的研发与生产。创始人凭借对环形变压器技术的深入了解和市场需求的敏锐洞察,带领团队克服了初创期的种种困难,成功开发出了具有高效能、低噪音特点的环形变压器产品,并赢得了客户的初步认可。随着市场口碑的逐渐积累,公司的业务规模开始稳步扩大。

问答坊 | AI 解惑

高手请进:proteus一仿真就卡死

proteus一仿真就卡死 我的电路在proteus一仿真就卡死,卡死时,最下面那个框里显示如下这段字母:SIMULATE:Running PROSPICE.DLL[C:\\DOCUME~1\\syb\\LOCALS~1\\Temp\\LISA1101.SDF] 请问这是为什么?如何解决,谢谢!…

查看全部问答>

【转】史上最全的AVR单片机学习笔记

本帖最后由 paulhyde 于 2014-9-15 03:20 编辑 史上最全的AVR单片机学习笔记,希望对于AVR的初学者有所帮助! 实验44:基于TC1的ICP频率计(ATmega16) 实验42:L298电机驱动程序(M16+12V直流电机) 实验41:TLC5615驱动程序(M16+MAX7219+8位数 ...…

查看全部问答>

转发我们的热招的职位(资深设计engineer/manager)-有兴趣的进来看下!!

公司信息 Headquartered in Sunnyvale, California, Silicon Storage Technology, Inc (SST) was founded in 1989 and got listed on the NASDAQ in 1995. SST designs, manufactures and markets a diversified range of memory and non-memory p ...…

查看全部问答>

施耐德ats46软启动器故障解决方法

问题:  施耐德ats46 110kw软启动器故障为:启动完成后,继电器R2不动作。{指启动10秒以后} 具体为:负载为110kw电机;软启动器的参数设置为:电机额定电流200A;电机限幅电流400A;加速力矩斜坡10秒其余参数全部为工厂设置。 &n ...…

查看全部问答>

快疯了,100分eVC测试

开发板上有几个跳线,我写了一个测试的程序,却出问题了,大家帮忙看看... 跳线驱动部分内容: BOOL Addr_Init() {    //地址映射 } BOOL WINAPI  DllEntry(HANDLE hInstDll,DWORD dwReason,LPVOID lpvReserved) ...…

查看全部问答>

几道计算机原理的选择题,请大虾帮忙做一下,特基础

希望大家能在给出正确答案的同时给出详细的解释,即解释出每个选项为什么对了后错了,辛苦啦 1.下列是有关计算机中指令和数据存放位置的叙述,其中正确的是()。 A. 指令存放在内存中,数据存放在外存中 B. 指令和数据任何时候都存放在内存中 ...…

查看全部问答>

请问有人测过AT91RF40008的功耗么

看它的DATASHEET上写的功耗是0.83mW/MHz,有用过的人测过这个功耗值可靠么?…

查看全部问答>

在evc4.0开发环境,多边形外环和内环填充的问题

我有1个问题请教,在evc4.0开发环境,那位做过多边形外环和内环填充的项目,我用polypolygon这个函数,可是他不支持evc,在vc下面好用。 我要达到的效果外环里面的内环不被填充,可是在evc4.0下内环也被填充了。请问是这个函数polypolygon不支持ev ...…

查看全部问答>

【求助】请问这是什么原因?

我用经典的串口的测试程序,在线仿真时发送和接收都正常。但是如果只用外部电源供电,不接仿真器,单片机发给pc的数据就接收不到了。如果这时再把仿真器连上,这是只是连上,不开IAR编译器,工作又正常了。我做板子的时候因为考虑到用外部电源供电 ...…

查看全部问答>