Adaptive Filtering 功能详解及代码实现
扫描二维码
随时随地手机看文章
摘 要
Texas instruments 推出的超低功耗miniDSP 音频Codec 集成了miniDSP 内核,可在耗电极低的工作状态下为电池供电的便携式产品提供高性能的语音及音乐处理能力。AdaptiveFiltering 是miniDSP 的一项重要功能。本文详细介绍了该功能的使用方法及注意事项,并给出了示例代码以供参考。
1 miniDSP Codec 简介
德州仪器半导体公司(Texas Instruments)推出的内嵌miniDSP 的音频编解码器(简称miniDSP Codec)在普通音频编解码器的基础上提供了强大、灵活的低功耗DSP 引擎来满足消费类电子应用中对音质、音效的需求。
miniDSP 的内核是完全可编程的,支持许多录音和回放的专用算法。例如:多段均衡(Multi-Band Equalization)、动态噪声消除(Dynamic Noise Filter)、回声消除(Echo Cancellation)等。miniDSP Codec 具有非常优秀的电源管理功能,在提供强大的音效处理能力的同时兼顾了低功耗特性,非常适合电池供电的便携式产品应用,例如智能手机,多媒体播放器,导航仪,电子相框等。
TLV320AIC3254(简称AIC3254)是miniDSP Codec 的典型器件,本文将基于该器件展开分析。其他miniDSP Codec 均具有类似的架构、功能及使用方法。请用户参考相应产品的器件手册获得详细信息。
1.1 miniDSP Codec 架构
以AIC3254 为例,该miniDSP Codec 集成了两个miniDSP 内核,如图1 所示,miniDSP-A 位于ADC 信号路径上,主要负责ADC 采样后的数字音频流处理。miniDSP-D 位于DAC 路径上,主要负责I2S 总线输入的数字音频流处理。miniDSP-A 和miniDSP-D 之间有互联的内部数据总线可用于数据交换及共享代码空间。
图 1. miniDSP 音频Codec 内部简化框图
除了Audio Codec 以外,某些ADC、DAC 也拥有miniDSP 内核,本文介绍的部分内容也适用于该类器件。请参考相应器件的手册获得详细信息。
1.2 miniDSP 内存架构及寄存器地址
miniDSP-A 和D 分别有自己独立的内存空间。每个DSP 的内存分为指令内存(Instruction RAM)、数据内存(Data RAM)和系数内存(Coefficient RAM)三类。
• 指令内存用于存储miniDSP 的运行指令及程序。
• 数据内存用来暂存miniDSP 运行时的运算结果等临时数据。
• 系数内存用来存储miniDSP 音效、增益等控件的参数数据。
指令内存和系数内存均可通过映射的I2C 或SPI 地址来进行读写。Codec 上电时主控芯片需要通过I2C 或SPI 接口将miniDSP 程序下载到指令内存和系数内存以供运行。以TLV320AIC3254 为例,指令内存、系数内存的寄存器映射地址及功能如表1 所示:
表 1. TLV320AIC3254 内存架构及寄存器地址
从寄存器映射地址可发现,miniDSP-A 和 miniDSP-D 的系数内存控件均被等分成两块:Buffer-A和Buffer-B。当Adaptive Filtering 功能关闭时,Buffer-A 和Buffer-B 是一个整体,连续的存储空间。当Adaptive Filtering 功能开启时,两个Buffer 的内容是完全同步并相互备份的。这种内存架构是Adaptive Filtering 功能的基础。
注 意:
当用户不需要Adaptive Filtering 功能时,建议关闭该功能。系数内存(Coefficent
RAM)将不会划分Buffer-A 和Buffer-B。能提供多一倍的系数内存给用户使用。
2 Adaptive Filtering
2.1 功能概述
Adaptive Filtering 是一种在miniDSP 运行时的滤波器、音效控件、混音比例等参数的实时切换功能。启动该功能后主控芯片可以通过控制端口对系数内存内的参数数据进行实时更新。
当miniDSP Codec 运行在non-Adaptive Filtering 模式下,系数内存中的滤波器、音效控件、混音比例等参数将被锁定,无法实时更改。这种模式适用于不需要实时调节参数的场合。miniDSP 的代码将在启动时一次性被下载并执行,运行过程中不会进行任何miniDSP 系数内存参数的修改。
当Adaptive Filtering 功能启动后,系数内存将启用缓存(Buffer-A 和Buffer-B)设置。允许用户在miniDSP 工作时实时修改系数内存中的参数设置,从而满足用户实时调节音效等参数的需求。例如,启用了Adaptive Filtering 模式后,用户可在听歌过程中将EQ 均衡器从流行(POP)转换为古典(Classic)模式,该效果实时产生作用无需中断播放。
2.2 Adaptive Filtering 控制寄存器
Adaptive Filtering 功能是通过特定寄存器来控制和实现的,以AIC3254 的miniDSP-A 为例,表2列出了miniDSP-A 的Adaptive Filtering 控制寄存器的含义。用户可通过D2 位开启或关闭miniDSP-A 的Adaptive Filtering 功能。D1 位用来指示miniDSP 运行时哪一个Buffer 被锁定,用户可读取该位来确认Buffer 使用的状态。D0 位用来控制Buffer 的切换,向D0 位写入1 后miniDSP-A 会切换到新的Buffer 进行工作,并向控制端口释放原先使用的Buffer。切换完毕后D0的值会自动清零,用户可通过循环读取D0 的值来判断Buffer 的切换是否已经完成。
表 2. AIC3254 miniDSP-A Adaptive Filtering 控制寄存器(P8_R1)
注 意:
每个支持Adaptive Filtering 功能的miniDSP 都有自己的Adaptive Filtering 控制寄存器,miniDSP-A 和miniDSP-D 的Adaptive Filtering 功能是独立运行的。
2.3 系数内存(Coefficient Memory)存取规范[!--empirenews.page--]
在介绍Adaptive Filtering 的具体流程前,首先需要了解系数内存存取的规范。
在non-Adaptive Filtering 模式下,系数内存在miniDSP 停止运行时可通过控制端口(I2C/SPI)直接存取。在miniDSP 工作时,系数内存将被锁定只有miniDSP 能够存取。表3 给出了该模式下的存取规范供参考:
表 3. 在non-Adaptive Filtering 模式下系数内存的存取规范
当启动了Adaptive Filtering 模式,系数内存将分为Buffer-A 和Buffer-B 两块,两块内存内容完全一致,相互备份。miniDSP 工作时将锁定Buffer-A 或者Buffer-B 其中的一个,从中获取参数信息。控制端口(I2C 或SPI)只可以读写未锁定的另一块Buffer。表4 给出了该模式下的存取规范供参考:
表 4. Adaptive Filtering 模式下系数内存的存取规范
为了简化Buffer 切换的操作,在miniDSP 运行时,控制端口访问系数内存的地址均映射到未锁定的Buffer 内。例如控制端口向锁定Buffer-A 某地址写入的参数将直接更新未锁定Buffer-B 内的镜像参数。这个设置允许用户在切换Buffer 后无需修改写入地址即可向释放出来的Buffer 内存更新参数。注意在miniDSP 停止运行的时候,Buffer-A 和Buffer-B 的页面地址均恢复正常模式,用户需使用它们各自的地址进行参数更新。
2.4 Adaptive Filtering 控制流程
本节详细介绍了如何使用Adaptive Filtering 功能来进行系数内存内参数的更新操作。附录A 给出了推荐的Adaptive Filtering 更新参数操作时序图供参考。
2.4.1 miniDSP 停止时的参数更新流程
如2.3 节所示,在miniDSP 停止运行时,控制端口可以存取所有的系数内存地址(Buffer-A 和 Buffer-B)。则该模式下参数更新的流程为:
1. 通过控制接口直接向Buffer-A 写入新参数。
2. 切换到Buffer-B 所在页面,向Buffer-B 写入同样参数。使Buffer-A 和Buffer-B 保持同步。
以AIC3254 为例,若需要更新的参数在miniDSP-A 的Buffer-A 内,其地址为p8_r44,新参数值为0xAB。则更新流程为:
1. 向p8_r44 写入新参数0xAB。
2. 向p26_r44 写入新参数0xAB。(p26_r44 是p8_r44 的镜像寄存器)
2.4.2 miniDSP 运行时的参数更新流程
miniDSP 运行时,系数内存的其中一个Buffer 被miniDSP 锁定,控制端口无法直接修改该Buffer内的参数。用户需要先更新未锁定Buffer 内的参数,然后通知miniDSP 切换Buffer 来使用新的参数。切换后原先被锁定的Buffer 将被释放,用户需要对它更新相同的参数以确保两块Buffer 的参数同步。
在miniDSP 运行时,系数内存参数更新的流程如下:
1. 通过控制端口向目标寄存器更新参数。
2. 向Adaptive Filtering 寄存器写入Buffer 切换命令。
3. 回读Adaptive Filtering 寄存器状态位,判断Buffer 切换是否完成。
4. 确认切换完成后,再次向目标寄存器更新参数确保Buffer-A 和Buffer-B 参数同步。
以AIC3254 为例,若需要更新的参数在miniDSP-A 的Buffer-A 内,其地址为p8_r44,新参数值为0xAB。则更新流程为:
1. 向p8_r44 写入新参数0xAB。
2. 将p8_r1_d0,Adaptive Filtering 寄存器的D0 位置1,执行Buffer 切换操作。
3. 回读p8_r1_d0,Adaptive Filtering 寄存器状态位,判断Buffer 切换是否完成。
4. 确认切换完成后,再次向目标寄存器p8_r44 更新参数0xAB,确保Buffer-A 和Buffer-B参数同步。
3 总结
本文详细介绍了miniDSP Codec 的Adaptive Filtering 功能的使用方法,并以AIC3254 为例给出了详细的操作步骤和示例代码。在实际使用中,用户需要注意准确的获取并判断miniDSP 工作状态,选择正确的操作流程来完成参数的切换和更新。
4 参考文献
1. TLV320AIC3254, Ultra Low Power Stereo Audio Codec With Embedded miniDSP-Data sheet (SLAS549)
2. Design and Configuration Guide for the TLV320AIC3204 & TLV320AIC3254 Audio Codec (SLAA404C)
3. Coefficient RAM Access Mechanisms (SLAA425A)