使用VisualAudio实时架构开发音频系统

描述

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

音频产品开发挑战

今天,音频系统开发人员面临着越来越需要设计复杂的音频系统 - 特别是家庭音频/视频接收器(AVR)和汽车信息娱乐系统 - 既快速又经济。为什么?

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

不同的,有时甚至是竞争的多声道音频格式的数量一直在迅速增加 - 包括杜比® Pro Logic ®,杜比数字,DTS ® 5.1,Dolby Digital Surround EX™和DTS-ES ®。

产品必须与数字网络连接,例如 Media

消费者拥有定向系统传输(MOST ®)总线,需要网络堆栈,内容加密和解密以及采样率转换。在顶级和主流产品中,我们期待复杂的后期处理功能,例如空间化,自动均衡和低音管理。

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

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

为了满足这一需求,ADI开发了一个图形环境-VisualAudio,以帮助设计和开发使用SHARC处理器系列的音频系统。 VisualAudio为音频系统开发人员提供了大部分软件构建模块,以及图1所示的直观图形界面,用于设计,开发,调整和测试音频系统。

dsp

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

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

框架

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

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

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

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

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

VisualAudio框架以块为单位向后处理网络传送音频。块大小有一些限制。首先,由于某些音频模块的单指令,多数据(SIMD)行为,它必须是偶数。其次,最小块大小为8个样本 - 由于某些音频模块中的流水线操作。最后,在具有音频解码器的系统中,后处理块大小必须是解码器块大小的因子。例如,对于Dolby Digital,可能的块大小为8,16,32,64,128和256个样本。

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

dsp

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

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

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

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

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

音频处理(用户中断0)- 对32个样本块执行后处理。大部分处理都发生在这个线程中。

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

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

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

dsp

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

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

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

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

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

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

音频模块

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

图4展示了10阶IIR滤波器的块处理效率 - 实现为五个双二阶滤波器的级联。将每个样本的操作数绘制为块大小的函数。 64个样本块实现了大多数效率增益,大块的回报递减。对于这个滤波器,核心内环每个样本包含21个乘法累加(MAC);但是通过使用同时对两个数据进行操作的SIMD指令,循环减少到大约15个周期。

dsp

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

幅度应用于输入

amp

- 1.0

1.0

1.0

《用法type =“string”》参数

true

true

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

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

typedef struct

{

AMF_Module b; //通用5字头

float amp; //特定于实例的变量

} 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; i

out [i] = in [i] * amp;

}

}

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

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

全部0条评论

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

×
20
完善资料,
赚取积分