动态范围规划(调整)Dynamic Range Control的一些心得(三)

来源:互联网 发布:网络教育学什么专业好 编辑:程序博客网 时间:2024/06/06 10:49


应该来说,经过上两次的描述,一个DRC应该初具规模了,不过要考虑DRC作用的完备性,还得深耕细作呢。

前面从幅度变化方面做了大量的工作,实际上DRC作用时,还得考虑时间问题


attack和release时间就是专门做这个的,一般来说,作用一个很大的Gain,是需要时间慢慢加上去的,作用一个较小的G(衰减),也是需要慢慢减下去的,这样能保证平稳过度。


这有点像药物中的缓释剂,慢慢地才发挥效果。

典型的attacktime值:0.02ms...10ms

典型的releasetime值:1ms...5000ms


一般来说releasetime的值要比attacktime的值长,为啥?,我贴一下sox 工具中的compand的解释:

For most situations, the attack time (response to the music getting louder) should be shorter than the decay time because the human ear is more sensitive to sudden loud music than sudden soft music.


用图来表示:

可能数学好,眼尖的人,一眼就看出来就是用exp衰减指数函数来模拟这个衰减量就好了,每次计算好衰减多少,对应的一段period时间乘上不同的衰减量即可,这样做在实际操作中还需要缓冲区,不利于实时计算。


还好每个值的衰减量都是可通过它前面一个点的因子变化过来的,这就方便很多了

gc[n]=xsc[n]xdB[n].

为什么要求差值?很显然,我要求dB值,dB就是对比reference变化了多少。


下面这个图里面道出了 attack和release的真谛:实际上 attack和realse 操作就是 再次经过两个一阶自回归滤波器 而已

显然么,这种“滤波器”估计就是滤除那些高频比较毛刺的地方(你变化剧烈的地方对应的就是),使得整个曲线变得更加柔和,光滑。



按照matlab 官网的给出来的提示,这个模型可以这么建立


但我觉得它这里面的attack和release概念的理解和一般论文描述的不太一样,对于下降应该是release啊,对于上升应该是attack



也有用RMS作为能量阈值判断的,大家可以找相关的论文来看看。我这里就纯粹是按照每个点的能量判断。

后面几步也很简单,所谓的Make -up Gain 就是 中间的线性增益,放大了多少。

所以我这里面的代码和它还是有差别的。


让我们看看gc和gs是不是满足我们当初的设计:

下面是gc在进入smooth之前的增益,注意最大幅度是0 dB,这是因为在dB域上,又没有加入makeup Gain之前,显然不可能到1的


下面是gc和gs的对比图,这个图是在 AttackTime = 20ms; ReleaseTime = 100ms 下描画的,很显然,gs是gc的低频部分,因为被smooth了,

这也说明了你给音频信号加Gain,不可能在短时间变化频繁,当然要缓缓的给加上拉,否则怎么叫缓释剂?(前面提到了)


后实践下DRC的功能,一是看达到效果没有,二是看attack、release起效没有


先分析看看不想要的噪声段的幅度,确认好低端的noiseGate



这里还是(一)里面的那个声音样本,我们放大一个aggressive的Gain试试,比如10dB,另外还得考虑留有一定的headroom,比如有个卡限就是不能超过-3dB

% G = 10;
% ThreshHold1 = -30;
% ThreshHold2 = -15;
% Ratio1 = 3;
% Ratio2 = 0.23;



你是不是担心Clipping了?可以放大看看:没想象中的那么严重对不对?



设定attacktime是20ms release时间是100ms,用一个方波来测试:



效果还可以。

我没有matlab 2017AudioProcess tool工具箱,我想就是有,也没法给你源代码让你转成C,现在有了一个例子,可很方便的porting到嵌入式平台了

这也是我研究DRC的一个初衷。


阅读全文
0 0