基于ADSP-BF533的数字音效器实现
李程飞
(国家广电总局北京地球站)
摘要
本文主要论述基于ADSP-BF533的硬件开发系统,并运用微处理器实时快速地实现数字音效处理。通过对数字音频信号的混响、均衡两种音效算法研究,并在这个基础上进行仿真,然后在软件设计中, 实现了音频信号混响、均衡两种效果的设计处理。在硬件上实现对这些音效处理模块进行选择,并且能够实时播放。实时数字音效处理系统可用于MP3、MP4等数字播放器的后处理,也可以将它用于调音台或效果器等音频设备,具有广阔的市场前景。
关键词
ADSP-BF533;数字音效处理;混响;数字均衡
随着多媒体技术的快速发展,各种新型数字音源相继出现,这些都为数字音频系统创造了崭新的需求。而DSP 的普遍应用和数字信号处理技术的发展,使声音信号进行实时处理成为可能,DSP 的速度越来越快以及各种快速算法的应用,在上面可以进行各种复杂的数字语音实时处理[1],其中,ADSP—BF533适用于音频信号处理的系统,包括复位电路、电源单元、存储器单元及模数数模转换单元等。通过该系统的搭建,ADSP—BF533能够满足数字音效系统的信号处理的实时性要求,目前的DSP软硬件系统能够实现复杂的DSP算法,为研究数字音效系统提供良好的灵活性,使得在原来的音乐的基础上,进行空间环绕,动态增强等处理,使得音乐的细节和清晰度有了很好的提高,具有广阔的市场前景。
首先Environmental Reverberation反射(混响),简单说就是声音余韵,音源在空间反射出来的声音。适当设置混响,可以更真实、更有现场感的再现声音源。
混响效果的实现比较复杂,要通过梳状滤波器(comb)和全通滤波器(allpass)才能很好地完成。梳状滤波器是一个带后向反馈的延时回路, 是最直观、最简单的回声模拟模型,其特征图如图1
由图1可见,梳状滤波器的幅度是随时间以指数的形式衰减的,这点与实际混响的特性一致,但是它的频谱呈现明显的梳状滤波器的特性,这样对于不同的频率就会产生幅度的颤抖,从而使得处理后的声音有染色效应。这样设计出来的混响算法颤动,且很容易产生金属声。
然而,混响音必须发生在原音奏响的一段时间之后,因为人耳对时间间隔在30ms甚至50ms以上的2个信号才能分辨出来。所以参数选择要合适,过多或不合适的混响将毁坏原音的创造力和效果。数字化混响可采用相应的模型实现,其中Schroeder混响模型由四个并联的低通滤波器与两级全通滤波器进行级联构成,见图2:
即信号通过全通滤波器后,幅度谱保持不变,仅对相位起作用。
使用Moorer提出的混响结构,如图3所示,可以产生出比Schroeder更真实音效,它能实现回响外,还能实现脉冲响应的早期反射声和直达声。
在Moorer混响结构中,g1、g2、g3分别代表增强早期反射声、混响、直达声信号。x(n)代表输入信号,y(n)代表处理后的信号。
在系统设计中,滤波器的好坏将直接影响系统的性能。这里选择了FIR滤波块作为音频系统的模块。
基于FIR滤波器的8频带均衡器是FIR数字滤波器的扩展,用8个独立的、具有不同频率特性的FIR的滤波器,而不是一个单独的FIR滤波器来进行设计,然后分别调节每个FIR滤波器的输出增益,它用来放大或则衰减音频信号的特定频率成分,立体声8频带均衡器框图如图4所示。输入信号为信号为XL(n)和XR(n),它们可以直接与应用程序的输出端相连接,应用程序允许当输入带通滤波器增益设为0时,原始信号直接通过。在其他应用中,通常可以对其滤波器的增益的左、右声道分别进行调整。
在设计模块的试验中,频率覆盖范围从0到24KHz,设定采样频率为48KHZ。8频带均衡器的频率特性见表1,本上滤波器#1为从0到200HZ的低通滤波器,滤波器#8为从12800到24000HZ的高通滤波器。其余为带通滤波器。这些滤波器的通带起伏和阻带衰减分别1dB和40dB,采用加窗(hanning 窗)设计的方法,得到这些系数。
表1 8频带图示均衡器的频率特性
子带编号 | 通带频率(HZ) |
#1 | 0~200 |
#2 | 200-400 |
#3 | 400-800 |
#4 | 800-1600 |
#5 | 1600-3200 |
#6 | 3200-6400 |
#7 | 6400-12800 |
#8 | 12800-24000 |
在MATLAB FDATool(Filter Design and Analysis Tool)工具设计8个滤波器,本模块设定的参数为滤波器的阶为255。filter arithmetic 设置为 double precision floating-point(双精度浮点格式,64位浮点格式) 得到8个滤波器。
FIR的滤波器的增益Gain(i)可以设定范围-12dB~12dB,并以3dB递增,如表2所示,在C文件中包含8个滤波通道的滤波器系数,为了实现下表2的指定9个增益值,定义了fract16类型的数组band_gain[9],它的值预定义为其中的9个增益值。从dB刻度值到线性刻度之间的转化必须是16位增益值,用1.15的格式表示由于这种格式将数值范围限制在-1到+1之间,增益值必然以4递减将增益值限定在1.15格式之内。这一步骤见表2的第3列。表2的最后一行表示为了在C程序中应用,根据公式fract16=round[定点小数部分×32768] (其中round[.]操作表示按照四舍五入取整)将增益部分转变为整数格式。
表2图示均衡器的增益设置
增益设置 以dB为单位 (20logA) | 增益设置 线性单位 (A=10(dB/20)) | 增益设置 1.15格式 (A/4) | 1.15格式的16进 (fract16)形式 Hex[(A/4×32768)] |
+12 | 3.9811 | 0.9953 | 0x7F66 |
+9 | 2.8184 | 0.7046 | 0x5A30 |
+6 | 1.9952 | 0.4988 | 0x3FD9 |
+3 | 1.4125 | 0.3531 | 0x2D32 |
+0 | 1.0000 | 0.2500 | 0x2000 |
-3 | 0.7079 | 0.1769 | 0x16A5 |
-6 | 0.5012 | 0.1253 | 0x100A |
-9 | 0.3548 | 0.0887 | 0x0B5B |
-12 | 0.2512 | 0.0628 | 0x080A |
硬件平台采用的是ADI公司提供的ADSP_BF533EZ-KIT开发板,该实验板提供的Blackfin处理器及相关外设完全满足了本次试验的需要。
根据软件流程,利用Visual DSP++建立工程,所有代码均设定在SDRAM执行。连接硬件仿真器和BF533EZ-KIT开发板,设定目标处理器型号为BF533,编译代码。下载到目标板SDRAM。根据程序设定,单击按键执行相应音频编解码工作,并输出处理后的音频数据,经过DAC驱动音频外设,以此来验证音频处理效果。
由于上文中已经介绍了音效实现的原理和模型,我们只需要在程序中将各个模块的模型和算法实现就可以完成音效模块处理的功能。
如图7所示,这个是音效处理模块所通用的基本流程,Blackfin处理器的SPORT被设置成用于接收和发送数据的串行端口,所有的音频通过AD1836后,通过DMA通道1通道把数据送到接受缓冲区中,一旦缓冲区满了,DMA将中断处理器的内核来处理接收到的数据。相反的方向,已处理的的数据将被移到传输缓冲区。通过DMA通道2传输到SPORTO中,传输的数据将连续的输出到CODEC中。PF4可以设置中断,这里可以进行具体音效程序实现。
下面就对本课题中涉及到三个音效模块进行分析:
(1)混响音效模块
混响音效模块主要实现由早期反射发生器、以及低通梳状滤波器和全通滤波器组成的混响发生器。根据公式1低通梳妆滤波器实现如下程序所示。
for (i=0; i<iSamples; i++)
{ d[write_idx] = add_fr1x16
( pInput[i],
multr_fr1x16(d[read_idx], g) );
write_idx = circindex(write_idx, 1, length);
pOutput[i] = d[read_idx];
read_idx = circindex(read_idx, 1, length);}
(*stateLPComb).idx = read_idx; }
上面代码中用到的circindex函数,就是编译器内置函数。Circindex函数包含在ccblkfn.h头文件中,其含义为 circindex(idx,1, length);其中idx为索引值,步长为1,length为循环缓冲区的长度,而根据公式2,也能在程序段中实现全通滤波器。
根据混响的算法模型图3所示,在下面处理程序段中,利用内置函数add_fr1x16将早期反射器输出firOutL[i]、混响发射器的输出allpassOutL[i]、以及直达通道的输出sCh0LeftIn[i]进行叠加求和。i的取值范围是0~ INPUT_SIZE,INPUT_SIZE为每次采集的大小,右通道类似,只需将上面函数名中L改成R即可。
// 添加混响,早期反射和直达声作为最后的输出
sCh0LeftOut[i] = add_fr1x16
( sCh0LeftIn[i],
add_fr1x16( firOutL[i],
allpassOutL[i])
);
(2)均衡音效模块
因为实现均衡处理是用8个独立不同的FIR滤波来设计的,可以单独调节它们每个的输出增益,这些增益按照如下程序进行预设。
unsigned char band_level[NUM_BAND]={4,4,4,4,4,4,4,4};
由表2可知增益设置可知上面的程序段意味着其增益为零,若想实现其他的均衡效果可以改变括号内的值,当然也可以通过按键手动调节每个通道的增益。
根据图4,调用函数mult_fr1x32和 add_fr1x32,将每个滤波器的输出跟他对应的通道增益进行相乘,最后将其6个相乘值进行相加,并用下面的FIR滤波器分别处理左(sCh0LeftIn)和右( sCh0LeftOut)声道。得到输出。实现该功能的核心代码如下:
fir_fr16(sCh0LeftIn, sCh0LeftOut, INPUT_SIZE, &stateFIRL);
fir_fr16(sCh0RightIn, sCh0RightOut, INPUT_SIZE, &stateFIRR);
for (i = 0; i < NUM_COEFF; i++)
{ temp = add_fr1x32(
mult_fr1x32
( firCoeff0[i],
band_gain[band_level[0]] )
……
……
…… )
mult_fr1x32
( irCoeff7[i],
band_gain[band_level[7]]
allCoeff[i] = round_fr1x32(temp);}
fir_fr16(sCh0LeftIn, sCh0LeftOut, INPUT_SIZE, &stateFIRL);
fir_fr16(sCh0RightIn, sCh0RightOut, INPUT_SIZE, &stateFIRR);}
实现上述的程序后,对系统进行测试,如下表3所示,这个是各个模块所具备的功能,用按键SW4实现其功能,按一次实现混响功能,按二次实现均衡功能,按三次实现环绕音功能,按四次实现待机状态。
表3 按键实现功能模式和状态指示
按键 | 功能 | LED指示 | |
单击SW4第一次 | 进入混响模式 | LED4闪烁,LED5灭 | |
单击SW4第二次 | 均衡音效模式 | LED4 、LED5都闪烁 | |
单击SW4第四次 | 待机状态 | LED4 、LED5都灭 | |
而在下表4中体现的是各个模块的功能。
表4 音效模块的功能
模块 | 均衡 | 混响 |
功能 | 由较高的滤波器频带切换到较低的频带(从#7到#0) |
混响音效 |
由较低的滤波器频带切换到较高的频带(从#0到#7) | 直接通过声音 | |
降低当滤波器频带增益,每次为降低为3dB |
| |
升高当滤波器频带增益,每次为升高为3dB |
|
从输入端口(ADC1)输入采样频率为48KHZ的音乐信号,运行程序,将BF533 EZ-KIT的输出端口(DAC1)与耳机相连,对上面的功能进行验证,测试显示,系统所得的音效达到预期效果。
在充分利用ADSP-BF533 硬件资源的基础上,实现实时音效处理系统。由于BF533 具有哈佛结构,流水线指令,高效的指令集和丰富的外设,为音频数字信号的输入输出提供方便的接口,片内flash 存储器可实现方便快捷的在线编程,非常适合于数字音频处理。运用数字信号处理快速算法和优化程序,复杂的数字实时音效处理可以在BF533上实现,实时数字音效处理系统可用于MP3、MP4等数字播放器的后处理。
1 梁勇,刘光明.基于DSP的实时数字音效处理系统.北京:清华大学,2003,36-37
2 曾荣.DSP数字音效处理系统的算法研究与系统实现.武汉:华中科技大学,2008,1-3
3 林志琦,逄林.音频数字音效器的算法.长春:长春工业大学电气与电子工程学院2008,64-54
4 颜允圣.基于微信号结构的嵌入式信号处理.北京:电子工业出版社,1973,164-217
5 高西全,丁玉美.数字信号处理.西安:西安电子科技大学,2008,299-230
评论 点击评论