江波
摘 要 SHARC DSP广泛应用于数字音频产品中,为分析SHARC DSP音频算法开发中的调试数据,采用了文件读写、数据流、操作数组和存储空间等4种数据输入输出方法,以及在软件开发平台VisualDSP++中实现的主要步骤及关键代码。以参量均衡算法为例说明如何用MATLAB对调试数据进行分析。
【关键词】音频 数据模拟 SHARC DSP VisualDSP++
1 引言
目前很多数字音频产品都是采用DSP作为信号处理平台。为降低产品开发难度、加快进度,国内厂家目前使用较多的是基于图标编程的专用音频DSP,如ADI公司的ADAU1701 SigmaDSP和TI公司的TAS3108。然而这类基于图标编程的DSP虽然使用方便,但算法功能却受限于现有的算法图标,仅适合较常用的功能,且不同厂家开发的产品易出现同质化的现象。为提升产品的竞争力,有些厂家研究出自己的音频处理算法,在通用DSP上通过编程实现。ADI公司生产的SHARC系列DSP是数字音频产品中常用的通用DSP,其软件开发平台是VisualDSP++(近年推出了CCES软件,支持与SigmaDSP开发软件平台的互连,目前VisualDSP++还是得到广泛应用)。在SHARC DSP上调试音频算法时,除了需将算法通过程序实现外,还需对算法程序调试的调试数据进行分析。以下讨论DSP开发平台上音频数据输入输出模拟的实现方法及如何用MATLAB对调试数据进行分析。
2 音频数据输入输出模拟
常见的DSP音频信号处理框图如图1所示。
其中音频算法一般需要在DSP軟件开发平台中先通过软件仿真的方式进行调试,在这个过程中没有外部声音信号输入,也无法将处理好的声音信号输出给外部设备,所以需要对图1中的信号输入输出部分进行模拟。下面讨论在VisualDSP++5.0上模拟输入输出音频数据的几种方法。
2.1 通过文件读写进行模拟
通过调用文件操作函数,对WAV、PCM等常用的声音文件进行读写,图2是操作框图。
本例程有两点需要注意:一是WAV文件有44个字节的文件头,不能作为声音数据进行处理,因为文件头有保存文件类型大小等,不是声音的具体数据;二是在SHARC DSP中各种数据类型的比特数,比如short int/int/float等数据类型均为32比特。
2.2 通过数据流进行模拟
数据流可以模拟通过外部端口或存储器与DSP处理器进行数据传输。在VisualDSP++菜单中选择“Settings\Streams\Add”,弹出图3所示界面。
共有Source和Destination两栏,通过对这两栏的相关参数进行设置即可模拟数据的输入输出。
模拟数据输入:在Source栏设定File路径,在Destination栏设定Debug target,既可以是各种接口,也可以是存储器地址。为方便处理,可以在程序中定义一个变量,然后将该变量地址作为接收文件数据的Debug target。
模拟数据输出:在Source栏设定Debug target,在Destination栏设定File路径。实际的算法仿真时,可以将保存输出数据的变量地址作为Debug target,程序运行时系统就会将输出数据保存到输出文件中。
数据流模拟时都要使用到数据文件(后缀名为dat),这种dat文件要满足一定的格式,即将所有数据排成一列,可以通过Matlab或C语言编程对dat文件进行读写。更简便的方法是通过CoolEdit软件进行dat文件读写:若要写一个dat文件,则先打开一个声音文件,然后选择另存,类型选txt,最后写自己定义的文件名(后缀写dat);并将该dat文件中的前面几行文件头信息去掉;若要读一个dat文件,直接打开该文件,然后选定采样率和数据量化比特数即可。
2.3 通过操作数组进行模拟
以上两种方法主要模拟数据量较大、无法预存到存储空间的情况,对于少量数据的情况,输入数据的模拟可以定义一个输入数组,用原始声音数据对其初始化。输出数据的模拟也可以定义一个输出数组,将所有处理好的数据都存入这个数组。
输入数组的初始化有几种方法,最直接的方法是将所有数据列出来,但对于几百甚至几千个数据的情况,显得页面不够简洁,建议用以下两种方法。
2.3.1 汇编语言环境下用dat文件初始化数组
首先将原始数据写入一个dat文件(例如input.dat),然后新建一个asm文件,定义数组名(例如_inputx),选择存储区(例如seg_dmda)。以下是相关代码:
.global _inputx;// 声明全局变量
.SECTION/DM seg_dmda;// 定义数组存放的存储区
.VAR _inputx[N]= "input.dat"; // 用input.dat文件的数据对数组初始化
然后在C语言文件中先将_inputx声明为外部变量:extern int inputx[N],这样就可以调用了。这里有两点需要注意:一是在asm文件中数组名前面有一个“_”,而在C语言文件中则无需加这个符号;二是在C语言中inputx数组的数据类型由input.dat中的数据类型确定,若为float型,则将声明外部变量语句改为:extern float inputx[N]。
2.3.2 C语言环境下用dat文件初始化数组
2.4 通过操作存储空间进行模拟
在VisualDSP++菜单中选择Memory\Two column,将弹出DM(数据存储空间)界面,如图4所示。在空白栏中输入绝对地址或数组名(例如图4中的InputData),则在存储空间栏内将显示相应地址的内容,此时可以直接查看数据或手动修改相关地址上的数值。在菜单中若选择Memory\Three column,则将弹出与图4类似的PM(程序存储空间)界面。
也可以在菜单中选择Memory\Fill,对某个地址直接填充数据,或通过dat文件对存储空间的数据进行填充。同样的,也可以在菜单中选择Memory \Dump,将存储空间中的数据导出为一个dat文件。
3 调试数据的MATLAB分析
为分析VisualDsp++软件平台中音频算法的调试数据是否正确,选择上述数据模拟方法将调试数据从DSP开发平台导出,然后导入MATLAB中进行分析。这里以参量均衡算法为例进行说明。
3.1 参量均衡算法原理
参量均衡器是由一种峰值带通滤波器,用来调整声音信号的幅频特性。参量均衡器的Q值、增益和中心频率3个参数可调。当增益大小在0dB以上称为峰值滤波器,反之称作陷波器(对信号的某一频段起到衰减的作用)。
3.2 MATLAB数据分析
参量均衡算法DSP软件实现流程如图5所示。实验中所用的音频数据来自于TIMIT数据库中NeoSpeech_Ashley.wav(男声)语音。通过CoolEdit软件将.wav格式的语音转换为后缀为.dat格式。
整个实现过程中参量均衡器的参数设置如下:Q值为14,中心频率w0=1000Hz,滤波器增益G为-6dB。对程序经行编译后,在VisualDSP++菜单中选择“Settings\Streams\Add”进行数据的导入与导出。采用上述2.2中的方法进行声音数据的导入与导出,采用上述2.4中的方法导出参量均衡器的滤波器系数。将DSP中参量均衡器的滤波器系数和DSP中经参量均衡器滤波后的声音数据导入到MATLAB中,并将其与用MATLAB进行计算和处理的结果进行对比,从而来进行判断DSP算法程序的准确性。
图6,是MATLAB直接计算和通过DSP计算得到的参量均衡器的幅频响应图像,只有通过对MATLAB得到的图形进行加粗才能看出有两条曲线。图7参量均衡器滤波后的声音数据时域波形图和幅频图,曲线重合,说明了DSP滤波处理得出的輸出结果和用MATLAB仿真得出结果是一致的。
4 结语
在VisualDSP++软件平台中用软件仿真的方式来调试SHARC DSP音频算法程序时,可以通过文件读写或数据流操作的方法模拟大量的数据输入输出。对于数据量较少的情况,则可以通过操作数组或存储空间的方法对输入输出数据进行模拟。使用者可以根据自己需求选取适合的数据模拟的方法,从而减少软件仿真所需要的时间。DSP音频算法的调试数据可导入到MATLAB中进行分析对比,验证算法程序是否正确。
参考文献
[1]ADI.ADAU1701:SigmaDSP? 28/56-Bit Audio Processor with Two ADCs and FourDACs [G/OL].(2013-8-1)http://www.analog.com/en/processors-dsp/sigmadsp/ADAU1701/products/product.html.
[2]TI.TAS3108Digital Audio Processor[G/OL].(2013-8-1).http://www.ti.com/product/tas3108.
[3]张承云,高星辉.音频专用DSP的软件设计方法[J].电声技术,2009,33(10):39-42.
[4]ADI.CrossCore? Embedded Studio for Analog Devices Processors[G/OL].(2013-8-1).http://www.anal-og.com/en/evaluation/adswt-cces/eb.html.
[5]冯小平,罗勇江,罗明.ADSP技术与应用[M].北京:机械工业出版社,2008.
[6]Regalia P,Mitra S.Tunable digital frequency response equalization filters[J].IEEE Transactio-ns on Acoustics Speech & Signal Processing,1987,35(01):118-120.
作者单位
广州大学机械与电气工程学院 广东省广州市 510006