数字音频压限器设计与实现

出处:陈潜 发布于:2012-10-18 09:51:50

  摘 要: 分析了音频压限器的算法, 对起控时间和释放时间这两个参数的处理进行了说明, 并使用MATLAB 软件和DSP 硬件对压限算法进行了验证。 以DSP 芯片TMS320VC5501 和微控制器STC89LE58RD+ 为构建系统平台, 给出了硬件和软件设计。 使用同一音源对音频压限器进行了测试, 将测试结果和MATLAB 结果进行了对比, 两者平均误差0.38%, 验证了设计方案的正确性, 满足音频压限器高要求, 为高音频压限器的设计提供了一种新的思路。

  1 引言

  音频压限器是一种用于压缩或限制节目信号的动态范围, 避免过激失真的音频信号处理设备[3]. 压限算法基本原理见《基于ADSP-21262 的数字压限器设计》[2], 该论文采用的压缩系数使用泰勒级数展开式和分段的方法来求得, 其误差为0.6dB, 经过后级设备的放大, 误差也将同时被放大, 将不能满足音频压限器的音质要求。 起控时间和释放时间是压缩算法中两个为重要的参数, 如何实时实现起控时间和释放时间的调控是音频压限器设计必须重点考虑的问题。

  为减少误差, 本文尝试将压缩系数使用C 标准库的pow 函数直接求得。 由于使用pow 函数的优点是其高, 但是pow 函数的执行时间比较长, 因此在整个算法实现中必须考虑时间的因素。 算法的DSP 实现中, 每10ms 处理数据, 处理函数必须在10ms 内完成, 否则将影响下的数据处理。 在DSP 算法编写完成以后, 将对算法的执行时间经行测算, 以保证在10ms 内完成。

  为了实时实现起控时间和释放时间的调控, 本文引入增益系数K, 通过调节K 来满足起控时间和释放时间调节, 根据不同的参数设置给出MATLAB仿真结果。 然后选用TI 公司的DSP 芯片TMS320VC5501 作为实现压限器算法的, 又利用音频解码器TLV320AIC23B-Q1 可以和TMS320VC5501 进行无缝连接, 将采样数据无间断传送给后者, 并让后者处理。

  以此来构建硬件平台。 , 对压限器进行了测试, 测试结果和MATLAB仿真结果进行了对比, 验证了本设计方案的正确性。

  2 压限算法

  2.1 压限器原理及其参数

  如图1 所示, 当输入信号电平(dB)超过阈值电平(dB)时, 对信号电平按压缩比进行压缩。 当压缩比为2:1 时, 输出电平为输入电平的一半。 同理, 压缩比为4: 1时, 输出电平为输入电平的四分之一。 当压缩比大于8:1 时, 此时压缩器可以称为限幅器。

图1 压限器算法示意图

图1 压限器算法示意图

  压限器有四个参数: 阈值电平(threshold)、压缩比(compression rate)、起控时间(attack time)和释放(releasetime)。 阈值电平用于决定是否对信号进行压缩。 压缩比是输入信号与输出信号的分贝数之比。 起控时间是当信号电平超过阈值电平时, 压限器开始进入压缩状态所需的时间。 释放时间是当信号电平低于阈值电平后, 压限器从压缩状态退出所需要的时间。

  2.2 有效值

  当音频信号电平大于阈值电压时, 压限器才开始工作。 因此, 先求出信号当前的有效值。 求有效值时,需对信号进行加窗, 窗口大小为10ms[2], 即每10ms 求有效值并判断该信号电平是否超过阈值电平, 如超过则进行压限处理。 有效值使用均方根来近似表达,其公式如下:

  其中, x(i)为音频信号采样值, 由于音源信号的采样频率为44.1kHz, 因此, 10ms 时间共441 个采样值。

  2.3 增益系数

  从1.1 节可知, 输入电平与输出电平之间的关系是在采用db 表示的前提下建立的, 接着, 将这种关系转换成信号在幅值上的关系。

  如图1 所示, 建立如下方程:

  可得压缩系数:

b =x -a

  其中, x=RMST/RMSX, a = 1-1/R, R 是压缩比, R >=1.

  这里将K =1 b 称为增益系数, 可得到输出信号与输入信号在幅值上的关系式:

  RMSY = RMSX *K , 其中0< K<1.

  2.4 起控和释放处理

  当压限器未工作时, 可将压限器的增益系数视为1,即单位增益。 当压限器工作时, 其增益为K. 根据2.1 节对起控时间和释放时间的阐述, 可以这样做: 在起控时间段内将信号增益由单位增益逐步下降至K, 在释放时间段内将信号增益由K 逐步上升至单位增益。

  使用MATLAB 7.0 软件进行算法仿真。 原始信号为:

  阈值电平0dB, 压缩比3: 1, 起控时间和释放时间都为10ms. 图2 为分别显示了原始信号和处理过后的信号,从中可以明显看到0.03s 至0.04s 为起控过程, 增益逐渐减小, 0.06s 至0.07s 为释放时间, 增益逐渐增大, 恢复至单位增益。

图2 MATLAB 仿真

图2 MATLAB 仿真。

  图3 是在不同参数情况下压限器的效果。 两者的阈值电平均为0dB. 上半图, 起控时间20ms, 释放时间30ms, 压缩比3: 1. 下半图, 起控时间10ms, 释放时间20ms, 压缩比6: 1.

图3 不同参数的压限器效果

图3 不同参数的压限器效果

  2.5 音频测试

图4 音乐信号仿真

图4 音乐信号仿真。

图5 未压缩和压缩状态下的均方根。

图5 未压缩和压缩状态下的均方根。

  使用音乐对压限器算法进行了测试。 音源采样频率44.1kHz, 单声道。 压限器参数: 阈值电平-4dB, 压缩比4: 1, 起控时间10ms, 释放时间100ms. 结合图4和图5, 可以观察到在0.65 秒和1.7 秒附近, 音频信号的幅值变化。 通过试听, 可以感觉到在这两个时间点附近的鼓声强度被削弱, 造成低频下潜深度减少。 因此, 可以的看出本文提出的算法是正确和有效的。

  3 系统硬件设计

  系统组成框图如图6 所示。 微控制器选用STC89LE58RD+. 首先, 使用它模拟I2C 总线来对音频解码芯片进行设置, 并且将4 个参数值保存至E2PROM; 同时将这些参数通过HPI 接口传送至DSP芯片, DSP 芯片将调用这4 个参数值对音频数据进行压限处理。 DSP 芯片使用TMS320VC5501. 它是主频为300MHz 的定点数字信号处理器, 有6 路DMA、2路McBSP 和1 个8 位的HPI 接口等。 DSP 芯片通过McBSP 和音频编解码器进行双向数据通信。 音频编解码器采用TLV320AIC23B-Q1. ; 支持I2C 和SPI 接口,通过该接口可以配置该芯片的内部寄存器; 支持McBSP 接口, 以此实现与DSP 芯片(带McBSP)的无缝连接。 该芯片将音源信号(模拟量)通过A/D 转换成数字信号并通过McBSP 传送至DSP 芯片, DSP 芯片将数据处理完以后, 通过McBSP 传送回音频编解码器, 再通过D/A 输出。

图6 系统组成框图

图6 系统组成框图

  4 系统软件设计

  DSP 以及单片机软件流程图如图7、8 所示。

图7 DSP 软件流程图

图7 DSP 软件流程图。

图8 单片机软件流程图

图8 单片机软件流程图。

  4.1 主要功能初始化

  在初始化TLV320AIC23B-Q1 中, 使用DSP 数据格式, 器件工作在主模式; 输入数据长度16 位; 设置ADC 和DAC 采样频率为44.1kHz(外部晶振频率13.9344MHz); 打开ADC 高通滤波。

  在初始化TMS320VC5501 中, 主要对McBPS 和DMA 进行配置。 McBSP 0 的接受或者发送数据格式配置为: 单相帧, 每帧2 个字, 字长16 位, 无数据压缩。

  DMA 通道0 负责从McBSP0 的数据接受缓冲器(DDR1)中搬移数据至DARAM的指定区域。 配置如下:

  使能frame 和half 中断; 数据源选择为Peripherals, 数据目的地址为DARAM; 数据格式: 每个元素16 位,每帧1764 个元素, 每个块1 个帧; 源地址采用固定模式, 目的地址采用自动后增量模式; 通道0 的发送由McBSP 0 接收事件触发, 即DDR1 每收到数据就启动DMA 传输。 当半个块的数据传输完成时触发半帧中断, 整个块传输完成时触发全帧中断。

  DMA 通道1 负责从DARAM 的指定区域搬移数据至McBSP0 的数据发送缓冲器(DXR1)。 配置如下:

  数据源选择为DARAM, 数据目的地为Peripherals; 数据格式和DMA通道0 相同; 源地址采用自动后增量模式, 目的地址采用固定模式; 通道1 的发送由McBSP0 发送事件触发。

  4.2 数据流流向

  在DARAM 中开辟一个长7056 字节的缓冲区, 起始地址为0x5000. A区为接收缓冲区, 地址从0x5000 到0x5DC8; B区为发送缓冲区, 地址从0x5DC8 到0x6B90.

  每个区共1764 个字, 用来存放两次10ms 的音频数据,每音频数据大小为882 个字, 左右声道各441 个字。

  数据流开始时, DMA 通道0 从A 区起始地址开始存放数据, 当数据存放至地址0X56E3 后, 即10ms 音频数据传送完成, 立刻触发半帧中断, 在中断程序中调用压限算法对前882 个字的数据进行处理, 处理完毕将数据放入B 区的前882 个字节, 此时DMA 通道1 自动从B 区起始地址发送数据至McBSP0. 在执行半帧中断 的时候, A 区后882 个字节的数据仍在填充, 当数据填充至0X5DC7(此时半帧中断程序必须已经返回, 也就是说中断服务程序必须在10ms 内完成)将触发全帧中断, 在中断程序中调用压限算法对后882 个字的数据进行处理, 之后再将处理过的数据放入B 区的后882 个字节,由DMA 通道1 自动发送。 如此循环下去。

图9 数据缓冲区示意图

图9 数据缓冲区示意图。

  5 结语

  当起控时间为10ms 时, 由于pow函数仅在该时间内调用, 同时该时间段需对每个点进行计算, 因此其执行时间是长的。 使用CCS 的clock 功能测量出压限算法需要执行2078187 条指令, 经计算共需6.92ms,小于10ms. 接着, 用1.5 节中的音源对压限器进行了测试, 将数据测试结果, 即均方根和MATLAB 的进行了比较。 结果平均误差仅为0.38%, 误差非常小。 经过试听, 其效果和MATLAB 的一致。

  本文给出了音频压限器的算法, 通过MATLAB对算法进行仿真, 同时利用DSP 平台实现了算法。 经过数据对比和试听, 证明了压限器设计的正确性, 具有一定的使用价值。

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!