使用可视音频设计高效、实时的音频系统

描述

作者:Paul Beckmann and Vincent Fung

VisualAudio 设计和开发环境是用于设计和开发音频系统的新软件工具。其实时架构特别适合音频产品开发的挑战。本文简要介绍了 VisualAudio,然后介绍了它的框架、音频模块以及在音频产品开发中的应用。

音频产品开发挑战

如今,音频系统开发人员面临着设计复杂音频系统(尤其是家庭音频/视频接收器 (AVR) 和汽车信息娱乐系统)的需求日益增加,既要快速且经济高效。为什么?

正常使用的离散音频通道数量已从 2 个增加到 4 个,再到 5.1 个,最近又增加到 7.1 个。

不同且有时相互竞争的多声道音频格式的数量一直在迅速增加,其中包括杜比定向逻辑、杜比数字、DTS 5.1、杜比数字环绕 EX™ 和 DTS-ES。

产品必须与数字网络接口,例如面向媒体的系统传输 (MOST) 总线,这需要网络堆栈、内容加密和解密以及采样率转换 — 所有这些都在音频处理器内完成。

消费者已经开始期待在顶级和主流产品中具有复杂的后处理功能,例如空间化、自动均衡和低音管理。

为了应对这些因素,开发人员正在转向数字信号处理器(DSP),因为它们的可编程性允许针对特定的市场利基和应用定制系统。ADI公司的SHARC处理器系列特别适合这项任务,因为它具有大容量内部存储器、浮点精度和高性能计算单元等特性。最近发布的第三代SHARC处理器更进一步,集成了专门为促进音频产品设计而引入的附加功能。这些特性包括硬件采样率转换器、加密和解密、复杂的数字音频接口以及包含多个音频解码器的片上ROM。

DSP用户面临的历史挑战是开发能够充分利用处理器时钟周期和有效利用内存的软件。汇编语言中手工编码音频信号处理算法的长期使用和费力的方法变得越来越不可行。当大部分所需工作用于创建标准的“清单”和“me-too”功能,而不是专注于通过增值功能区分产品时,尤其如此。需要一种更好的方法来开发音频产品软件。

为了满足这一需求,ADI开发了一种图形环境VisualAudio,作为设计和开发使用SHARC处理器系列的音频系统的辅助工具。VisualAudio 为音频系统开发人员提供了大多数软件构建块,以及直观的图形界面(如图 1 所示),用于设计、开发、调谐和测试音频系统。

dsp

图1.可视音频图形界面屏幕示例。

VisualAudio 包括一个基于 PC 的图形用户界面(GUI,图形工具)、一个 DSP 内核(框架)和一个可扩展的音频算法库(音频模块)。与ADI公司合作VisualDSP++™ 集成开发和调试环境 (IDDE),VisualAudio 生成产品就绪代码,该代码针对速度、每秒数百万条指令 (MIPS) 和内存使用进行了优化。通过简化开发复杂数字信号处理软件的过程,VisualAudio 降低了开发成本、风险和时间。因此,音频系统开发人员能够通过将其音频产品与竞争对手区分开来专注于增加价值。

VisualAudio 的核心是处理音频 I/O 和后处理的实时软件架构。为了可行,生成的DSP代码必须在MIPS和存储器方面高效,并且足够灵活,以处理各种音频产品类别。下面介绍了 VisualAudio 实时架构,首先是框架,然后是音频处理模块。

A. 框架

该框架是DSP代码的一部分,用于处理系统初始化,音频I / O,比特流检测1、实例化和调用音频解码器以及与主机通信。VisualAudio为其用户提供了AVR和汽车音频系统框架的示例。通过编写特定于平台的驱动程序,VisualAudio 用户可以自定义框架的许多方面,以满足特定的产品要求。在某些情况下,如果需要内部更改以获得最佳性能,ADI还将向VisualAudio用户提供框架源代码。

音频产品具有控制框架设计的特定要求。每个音频产品都有两个主要功能:(1) 实时音频处理,以及 (2) 控制此处理。这两个功能的时间尺度大不相同。实时处理(完成所有内部操作)必须以采样率进行,否则输出音频中将出现不可接受的爆裂声和咔嗒声。控制功能可以以更慢的速率发生,10 Hz 到 100 Hz,但仍然可以接受。因此,MIPS的大部分使用发生在实时处理中,而大部分软件复杂性则发生在控制功能中。为了简化产品设计和开发,VisualAudio将实时和控制功能分离到单独的线程中。效率是通过手动优化的实时音频处理模块实现的,而控制代码的复杂性则通过允许开发人员用 C 语言编写并在单独的线程中运行来管理。

传统上,采用了两种不同的音频处理方法。在流处理中,音频样本在到达时一次处理一个,而在块处理中,缓冲多个音频样本,然后作为一个组进行处理。每种方法都有独特的优点和缺点。流处理在数据存储方面是有效的,因为不需要缓冲音频数据。流处理的主要限制是不能容忍多个函数调用的开销。这强制音频处理代码以内联方式编写,通常使用汇编语言。这样的代码很难模块化和维护。

块处理需要额外的缓冲内存来存储 I/O 和暂存内存。典型的模块大小在 32 到 256 个样本的范围内。由于一次处理多个样本,因此函数调用的开销将分摊到大量样本中。这导致了MIPS高效的实现 - 以牺牲额外的内存为代价 - 但这是首选,因为可以采用结构化编程方法。块处理也非常适合生成音频块的音频解码器。例如,杜比数字和 DTS 解码器都会在 256 个样本块中生成音频。

块处理,VisualAudio使用的方法,有几个额外的优点。VisualAudio 中的所有音频 I/O 都使用直接内存访问 (DMA) 进行双缓冲和管理。处理器每个块接收一次中断,而不是每个样本一次,因此与流处理相比,中断开销要少得多。此外,通过利用 SHARC 处理器的链式 DMA 功能,双缓冲由 DMA 控制器管理,从而显著增加了处理音频输入/输出 (I/O) 中断时的允许延迟。

VisualAudio 框架以块的形式将音频传送到后处理网络。对块大小施加了某些限制。首先,由于某些音频模块的单指令多数据 (SIMD) 行为,它必须是偶数。其次,最小块大小为 8 个样本,这是由于某些音频模块中的流水线。最后,在具有音频解码器的系统中,后处理块大小必须是解码器块大小的一个因素。例如,对于杜比数字,可能的块大小为 16、32、64、128、256 和 <> 个样本。

音频I/O和缓冲可以在VisualAudio汽车框架的例子中看到,如图2所示。音频来自 MOST 网络或 A/D 转换器,并分为多个流。主要的娱乐流由DVD播放器生成,其他单声道流由远程信息处理系统或编钟产生。DVD 数据首先经过数字传输复制检测 (DTCP) 解密,然后馈送到比特流检测器。比特流检测器的输出被打包成块;当完整的数据帧可用时,将执行音频解码器。DVD 播放器生成自己的采样率,这与后处理使用的采样率不同。因此,音频解码器的输出必须通过异步采样速率转换器。该模块将所有输入数据流转换为固定的输出采样率。此时,音频后处理以 32 个样本的固定块大小执行。作为最后一步,音频通道被馈送到D/A转换器或返回到MOST网络。

dsp

图2.视觉音频汽车框架内的音频流

汽车框架包含多个音频解码器,一次只有一个处于活动状态。为了减少解码器内存要求,VisualAudio 管理在所有可能的解码器之间共享的解码器内存池。解码器的输出被馈送到后处理网络;这驱动了D/A转换器。

VisualAudio 使用简单的中断驱动内核来管理多个线程。例如,示例汽车框架总共包含六个线程。从最高优先级到最低优先级,它们是:

主机通信 — 通常通过 SPI 与主机交换消息。消息在 DSP 用户控制代码中缓冲和解释(如下所述)。

音频传输中断 — 由串行端口中断触发。管理到 DAC 的输出 DMA,并格式化要返回到 MOST 网络的数据。在用户中断 0 中触发音频处理。

音频接收中断 - 将音频分成不同的流。执行 DTCP 解密并将编码的数据打包到帧中。适当时,触发用户中断 1 中的音频解码器。

音频处理(用户中断 0)— 对包含 32 个样本的模块执行后处理。大部分处理在此线程中发生。

音频解码器(用户中断 1)— 执行音频解码功能。

DSP 用户控制代码 (UCC) — 在没有活动中断时运行,并充当应用程序的主循环。用户产品的控制功能发生在此线程中。

示例 AVR 框架中的典型线程活动如图 3 所示。每个水平切片代表一个不同的线程。音频 I/O、解码器和后处理定期运行,UCC 以最低优先级运行。请注意,当处理器忙于音频处理时,UCC 可能不会运行几毫秒。

dsp

图3.VisualAudio AVR 框架中的线程活动。线程按优先级(顶部)到最低优先级(底部)的顺序排列。

VisualAudio 分区控制主机微控制器和 DSP 之间的功能。这种分区是任意的,甚至可以支持没有专用主机微控制器的系统。如上所述,UCC 以最低优先级执行 - 使用中断处理程序未使用的任何空闲周期。UCC 由框架定期调用,其中包含消息和通知。

消息是从主机微控制器发送到DSP的命令。这些命令用于控制音频处理(例如,“将音量设置为 –20 dB”、“将低音音调控制设置为 +3 dB”)或查询音频处理的状态(例如,“系统是否受到限制?VisualAudio 框架在内部处理一些命令,而其余的则传递给 UCC。在每个时间点,主机和 DSP 之间只能有一条挂起的消息,并且 DSP 必须在处理完每个命令后发送确认。

通知由框架异步生成,并在多种条件下发生。第一个通知发生在系统初始化期间,在启用任何实时处理之前。此时可以完成特定于系统或应用程序的初始化。第二个通知以大约 200 Hz 的速率定期生成,用于控制实时音频处理,例如自动增益控制 (AGC) 计算和更新。最后一类通知由音频解码器生成,以响应编码位流中的更改。当采样率发生变化、输入通道数发生变化或在传入比特流中检测到循环冗余校验 (CRC) 错误时,将发生此类通知。这些通知允许 UCC 在音频处理中进行适当的更改。

由于 UCC 被实时音频处理抢占,因此可能要过几毫秒才能执行,如图 3 所示。VisualAudio 包括几个功能,可以简化编写将不断受到中断的 UCC。首先,由于主机通信接口只允许单个主机消息在主机和 DSP 之间挂起,因此不存在消息缓冲区溢出或主机消息相互覆盖的危险。另一个功能是通知队列,其中相同类型的通知相互覆盖。例如,如果在执行 UCC 之前生成了两个时间间隔很近的采样率通知,则 UCC 将仅接收第二个通知,即最终采样率。此外,由于通知数量有限,因此通知队列的长度必然是有限的。

还必须仔细编写 UCC 以更新某些音频模块参数。某些模块参数(如无限脉冲响应 (IIR) 滤波器系数)必须自动更新,而不会被音频处理中断。

每个 VisualAudio 框架都有一个关联的 XML 平台文件,该文件向 VisualAudio 应用程序描述目标平台的功能,还包含生成可执行文件所需的源、对象和库文件的列表。软件设计和开发通常从现成的评估或开发平台开始,例如ADI公司的EZ-KIT Lite评估套件,然后在完成后迁移到实际目标硬件。VisualAudio 的更改平台向导可自动执行在硬件平台之间迁移软件的过程。

音频模块

VisualAudio 包含一个包含大约 100 个音频处理模块的库,这些模块已针对 SHARC 处理器进行了优化。这些模块按功能分类,包括音量控制、音调控制、滤波器、混音器等,这些功能类型足以开发各种音频产品。这些标准音频模块可以通过实现专有后处理功能的自定义模块来增强。

图4显示了10阶IIR滤波器的模块处理效率,该滤波器以64个双二阶滤波器的级联形式实现。每个样本的操作数绘制为块大小的函数。大多数效率增益是通过 21 个样本模块实现的,而较大模块的收益递减。对于此滤波器,内核内环每个样本包含 15 个乘法累加 (MAC);但是通过使用同时对两条数据进行操作的 SIMD 指令,循环减少到大约 <> 个周期。

dsp

图4.IIR滤波器的处理效率与模块大小的关系。

每个音频模块都通过关联的 XML 文件向 VisualAudio 应用程序描述。此文件包含模块的内存中数据结构、内存分配规则、输入和输出音频通道列表、高级接口变量(显示在模块的图形表示或检查器上)和设计公式的描述。XML 语言由标记结构化数据的标记组成。例如,考虑一个简单的音频模块,该模块按固定增益缩放单声道信号。此模块将包含单个渲染变量 - amp - 指定要应用的增益。在模块的 XML 文件中,变量 amp 由如下所示的 XML 代码描述:


amplitude applied to input
amp

-1.0
1.0
1.0

parameter
true
true

描述标记提供变量的简短摘要。名称标记指示数据结构中的变量名称。该变量被描述为浮点数,其默认范围为 [–1 +1],可以修改,默认值为 1.0。VisualAudio 将此变量视为设计可设置和可调参数,允许在设计时修改它,并在以后的实时调优期间对其进行修改。此单声道固定增益示例说明了可以用 VisualAudio XML 格式描述的众多变量类型之一。

VisualAudio 为后处理布局中音频模块的每个实例创建单独的数据结构。所有数据结构共享一个通用的 5 字标头,用于描述模块与框架的运行时接口。接下来是特定于模块的参数和状态变量。例如,上述缩放器模块的数据结构的类型声明为:

typedef struct
{
AMF_Module b; // Common 5 word header
float amp; // Instance specific variable
} AMF_Scaler;

VisualAudio 中的音频处理功能遵循统一的调用顺序。每个函数都使用三个参数调用:指向实例数据结构的指针、指向输入和输出缓冲区指针数组(首先是输入缓冲区,然后是输出缓冲区)的指针,以及指定块大小的整数。继续以缩放器为例,其实时处理功能定义如下。

void AMF_Scaler_Render(AMF_Scaler *instance, float ** buffers,int blockSize) {
int i;
float *in = buffers[0];
float *out = buffers[1];
float amp = instance->amp;
for (i=0; iout[i] = in[i] * amp;
}
}

请注意,此示例是用 C 编写的,以阐明其描述。VisualAudio 中包含的实际渲染函数是用优化的汇编语言编写的,以提高执行速度。

总结

音频产品中数字信号处理软件的复杂性不断增加。为了解决这个问题,ADI公司开发了图形音频系统设计和开发环境VisualAudio。VisualAudio 通过为开发人员提供音频系统中的许多关键软件构建块,通过直观的图形界面进行管理,简化了音频产品的设计和开发。VisualAudio实时架构足够灵活,可以支持各种产品类型,并且在MIPS和内存方面也很高效。整个可视音频工具链启动了产品开发;降低开发成本、时间和风险;并允许工程师专注于创新和产品差异化。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分