引言
采用微控制器 (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)。
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个循环。
请注意,这只包含压缩/解压缩算法。要实现录制和回放功能,还需要更多代码。
一周热门 更多>