作者的话
在前面几篇文章里,我们希望用户迅速入门,了解和掌握 DSP 的整个开发流程,而从这个文档开始,我们将做一些更深入的例程和讲解,希望用户掌握到更多的功能和开发技巧。
ADAU1452 的进阶例程 1:子程序的设计 1
音频框架的设计,往往会比较复杂,当图中的算法模块过多,会让设计者和阅读者感觉杂乱,不方便查阅,所以软件提供了子程序的分级设计,可以将各个功能模块子程序化,方便开发。
先看一个简单的音量调节程序,如何来做子程序:
这是一个最简单的音量调节程序,音源从 32/33 输入,通过一个音量调节模块后,输出到 0/1接口。
1)首先删掉音量算法模块,我们需要把这个音量模块放到子程序里
2)调出子程序
3)给子程序模块命名,这个操作跟 PC 上命名文档一样,直接输入即可,我这里输入的是“总音量调节”
4)这个时候你会发现在软件最下端,Main 的边上会出现一个“总音量调节”的子页面,点击进入,并加入音量调节模块。
5)进行分级设计
6)回到主程序,会发现总音量调节的那个模块出现了输入输出接口,进行连线,完成设计。
ADAU1452 的进阶例程 2:子程序的设计 2
再做一个例程,加深一下理解:
一个音量调节子程序,一个 15 段 EQ 子程序,这样调每个模块,就到自己的子程序界面下调,互不干扰,也使得主程序界面更简洁,在设计很复杂,或者有固定组合的模块时,有一定的实用价值。
ADAU1452 的进阶例程 3:伪模块 1
为了使程序在视觉上更加美观,可以创建伪模块,以便为原理图中的信号流提供清晰的连接参考。“ 伪模块” (Alias)由一对伪输入和伪输出模块构成。使用伪模块可以减少原理图窗口中因长线连接造成的视觉混乱。也是设计的一个小技巧,我见有客户的量产代码里经常用到,在这里也分享一个例程。
还是以最简单的直通例程,当你的程序很复杂的时候,线会连的乱,不容易查看,这个时候我们可以这么做:
1)把输出的线断掉。
2)选择调音量模块的两个输出口,分别鼠标右键并选择伪模块
3)出现两组 Alias
4)完成连线,这个设计就跟我们直接用线连得效果是一样的,但是你就可以把你的输出 0/1放到你想放的最佳位置,免得线太长了影响程序的阅读啦。
ADAU1452 的进阶例程 4:伪模块 2
再做一个稍微复杂一点的程序,实际上在真实的产品开发中,可能整个页面都布满了原理图,信号流全部通过连线方式的话,阅读程序就比较困难,用这种方式能简化很多。
这个程序的信号流就很清晰,每个接口的输出一目了然。
ADAU1452 的进阶例程 5:设置采样率
常见的问题,DSP 支持多个采样率,怎么去设置采样率,有几种方法,就拿例程 4 来说,默认我们的采样率设置为 48KHz,改到 192KHz,怎么改:
首先我们要改ADAU1772的采样率,就不在1452这里展现了,有问题可以问我。把ADAU1772的采样率改成192K,然后再来改ADAU1452。
如下图所示,下拉选择:
改为 192KHz 之后,也还是不够的,更改的仅为输入或源模块的采样速率。若要将更改应用到所有下游模块,请单击工具栏下拉列表右侧的“ 扩散采样速率” (Propagate Sampling Rate)按钮:
特别注意,改了采样率,再扩散到全部模块后,没有声音了,这个是正常的,需要再次下载程序后,才可以实现 192KHz 采样率下的正常调试。
ADAU1452 的进阶例程 6:电位器调音量
ADAU1701 的电位器调音实现很简单,只需要有专门的模块拖出来设置一下就好了,但是ADAU1452 并没有这个东西,那么如何实现电位器调音呢,要做了一个逻辑电路来实现,我从老外的设计里找了一个,效果并不好,仅作参考吧。实际上 1452 更多的是用 MCU 来控制调音量会更佳。
注意,开发板上的电位器用这个电路,从静音到音量最大化的幅度很小,下载程序后,可先使用旋钮将音量调到静音,再慢慢旋转电位器,声音逐渐增加,增大到设定值后,再往下转电位器则无效果。
个人感觉真正做设计,还是 MCU 控制调音量模块来实现调音比较好,DSP 的 ADC 控制这块比较弱。如果非要用 DSP 来设计音量,用 I/O 和按键比较好,下面几个例程会做详解。
ADAU1452 的进阶例程 7:按键控制音量+和音量-
这个例程实际上是对 GPIO 的深层次应用,通过对 GPIO 的配置,以及程序的模块配合,来实现按键调音量的功能。该程序下载后,默认是静音的,按开发板上的 KEY1 增加音量,按 KEY2 降低音量。注意我的音量调整调的比较细,所以从静音到听到声音, KEY1 要多按几次。
特别注意,这个例程里,最关键的是要配对寄存器,如下图:
特别注意,调音的控制,都在 table 里,点开它,输入相应的数字
查找表的输出值以控制输入的形式发送给 SW 音量单元。该单元同样也有两个音频输入(绿 色)和两个音频输出(蓝色)。控制输入从表格中取值,并相应地调整音频。按下按钮时,表格会输出一个新值,然后音量单元会转换到一个新值,该值的大小取决于单元中所输入的 SW转换速率。按钮音量控制-音量增大/音量减小/静音的指数表:
按下 KEY1 是音量+,按下 KEY2 是音量-,可以多次按按键,也可以按住了按键,让音量一直加或者一直减,效果更明显。
特别注意,下载程序后声音变为 0,需要按 KEY1 把音量加上来,才能听得到。
ADAU1452 的进阶例程 8:按键控制音量+和音量-和静音
这个例程实际上是对 GPIO 的深层次应用,通过对 GPIO 的配置,以及程序的模块配合,来实现按键调音量以及静音的功能。
该程序下载后,默认是静音的,按开发板上的 KEY1 增加音量,按 KEY2 降低音量。注意我的音量调整调的比较细,所以从静音到听到声音, KEY1 要多按几次。 KEY1 和 KEY2 同时按下则静音,再按一下 KEY1 或者 KEY2 则恢复静音前的声音。
特别注意,这个例程用的算法模块,不支持按住 KEY1 或者 KEY2 不松开,也能加或者减音量,只能一下一下的按来调。
- hardware 设计
- 寄存器配置
- 程序设计,这里我就不在详细的说每个模块是从哪里拖出来的,用户可以自己找一下,或者直接拿我们提供的程序去 copy。
特别注意,调音的控制,都在 table 里,点开它,输入相应的数字
查找表的输出值以控制输入的形式发送给 SW 音量单元。 该单元同样也有两个音频输入(绿 色)和两个音频输出(蓝色)。控制输入从表格中取值,并相应地调整音频。按下按钮时,表格会输出一个新值,然后音量单元会转换到一个新值,该值的大小取决于单元中所输入的 SW转换速率。
按钮音量控制-音量增大/音量减小/静音的指数表:
ADAU1452 的进阶例程 9:算法-混响 1
ADI 提供了很多音效算法,我尽量找一些有官方描述的算法做些例程。
算法几乎都在这个模块里头。
混响是非常常见的音效,模拟回声空间(如演奏厅)的自然回响效应,并将该信号混入原始信号。技术上来说,回响是原始音源消失后,封闭空间中余留的总声场。
该模块允许您控制以下三个参数:
混响时间(Reverb Time) – 这些单选按钮允许您控制“混响时间”设置,包括“短”(short)和“长”(long)两个选项。混响时间指回响衰减所需时间。(技术上来说,这是通过测量信号SPL(声压强度)衰减 60dB、达到其原始值的一百万分之一所需时间来确定的。)
HF 阻尼(HF Damping) – 这些单选按钮允许您控制 HF 阻尼设置,包括“明亮”(bright)和“暗淡”(dim)两个选项。 HF 阻尼指混响反射的亮度。
低音混响增益(Bass Reverb Gain) – 这些单选按钮允许您控制“低音混响增益”设置,包括“高”(high)和“低”(low)两个选项。低音混响指 LF 反射的强度和丰富度。
最简单的直通加混响的例程:
把直通的音源进行了混响处理,效果非常明显。
ADAU1452 的进阶例程 10:算法-混响 2
再做一个复杂一点的混响,将输入的音源进行混响处理,再和这个音源增益后的进行自混音输出,这里接了个开关,可以自由选择混响后混音、直接混响、直通三种效果,对比一下更好听出不一样。
开关选择最上面,是混响+增益混音后输出;开关选择中间,是混响后直接输出;开关选择最下面,是直通输出。对比一下音效吧。
这里就提出了一个音效修补的思路,我这里是加增益放大,用户也可以加 EQ,加分频,加延迟,加反馈等,再混音,大家可以自行尝试,SigmaDSP 最大的特点就是自由的玩音效,玩起来!
ADAU1452 的进阶例程 11:算法-动态低音增强(Dynamic Bass Boost)
对于能找到详细说明的模块,我会多一些笔墨描述模块:
“动态低音增强”(Dynamic Bass Boost)模块可提供因输入信号电平而异的增强效果:低电平比高电平要求且接收更多低音。该模块采用一个可变-Q 滤波器,可动态调节增强量。
滤波器在“阈值”(Threshold) 与“最低增益”(Min(imum) Gain)设置间计算低音增强量。高于最低增益、低于阈值的输入存在固定最大限值。
7 个参数(如下所述)控制着该模块的性能。在相应字段输入参数值,也可通过箭头输入。尽管了解这些参数的工作原理及其具体作用是非常重要的,但您需要做的只是试试各个参数,感受它们各自及组合后对目标音效的影响。
低通频率(Lowpass Freq) – 低通频率范围为 20Hz 至 250Hz;检测器通过选中点之下的频率来确定增强量。
高阈值(High Threshold) (dB) – 高阈值的范围为-20 至 10dB,用于设定检测器操作的上限点。高于最低增益的信号不会影响增强计算,而会被以固定量增强。
时间常数(Time Constant) – 范围为 0 至 500 毫秒,控制着检测器的均方根时间常数,可改变起音速率(attack rate)和释放速率(release rate)。
低阈值(Low Threshold) (dB) – 该值的范围为-100 至-20dB,为检测器的阈值下限。进入检测器且低于此阈值的任何信号不会影响增强计算,而是获得固定量的增强。
压缩比(Compression Ratio) – 压缩比的范围为 1 至 15,可能理解为一种动态增强比更为恰当,控制着低音增强从低阈值变为高阈值的比率。
增强(Boost) – 该滑块的范围为 0 至 16dB,控制着动态应用于算法的最大增益。另见下一个参数。低音频率(Bass Freq)- 本字段位于增强滑块之下,其范围为 20 至 300Hz,用于设定增强滤波器的中心频率。将所需值直接输入字段,或通过滑块两端的两个水平箭头输入。 注意: 当滑块向下滑至 0dB 时,实际上并未绕过该模块。
ADAU1452 的进阶例程 12:算法-响度低和高Loudness (Low and High)
对于低电平,“响度”(低和高) (Loudness (Low and High))模块可增强低于 60 Hz 的低音和高于 7kHz 的高音(另见下面的控制旋钮部分)。
增强值依据著名的 Fletcher-Munson 等响曲线及其他曲线计算而得。这项研究显示,低电平时,低声级和高声级必须显著提高响度,才能使音色平衡听起来比例适当,并使整体声音在人耳中呈现出相同的响度。
请注意,这种算法为固定而非动态算法:它假定输入电平保持不变。该模块的参数包括电平滑块、LPF 及 HPF 旋钮和电平(Level)。
-
电平滑块控制整个信号的输出音量, 但更重要的是,它同时也控制响度算法。低电平时,响度算法对低频的增强效果好于高频。电平为 0dB 时,无论输入电平为何,低频和高频都不能增强。
-
通过 LP 旋钮,您可以更改低通滤波器的截止频率。默认值接近 Fletcher-Munson 曲线。频率值越高,低音带宽增益越高。
-
通过 HF 旋钮,您可以更改高通滤波器的截止频率。默认值为 7kHz,接近 Fletcher-Munson曲线。
ADAU1452 的进阶例程 13:算法-自动音量控制
ADAU1452 的进阶例程 14:算法- Phat-立体声
Phat–立体声(Phat-Stereo)是一种扩展算法,通过立体声交叉耦合在立体声扬声器及其他双声道应用中模拟环绕声。
人耳对低于 2 kHz 的耳间相移最为敏感, 这种相移增量会导致立体声像扩展。一种 3D 增强,可为耳机和立体声扬声器产生一个浓缩的环绕声场。
有两个参数控制着该模块:
截止频率(Cut Freq) (Hz) – 控制一阶低通滤波器的截止频率,决定着附加反相信号的频率范围。为获得最佳效果,范围应为 500 Hz 至 2 kHz。
电平(Level) – 控制滤波器的输出电平; -80dB 基本为直通电平,不存在信号调制。
ADAU1452 的进阶例程 15:算法- ADI 3D
ADI 提供了一个 3D 的效果算法,我觉得挺不错,做个例程仅供参考:
我们开发板上做的都是立体声,而且只有 4 个通道,这里 5 个通道输出,所以我在这里加了一个混音,目的只是为了呈现这个模块。
所以你看,这里就有一个技术点,你必须要想办法让所有的点都连上线,算法模块功能才能正常使用,如果我这里 4 个通道连上,还有一个输出没有连,那么下载就会直接报错!
ADAU1452 的进阶例程 16:Enhanced Stereo Capture(ESC)