主要内容

多频带动态范围压缩

这个例子展示了如何模拟一个数字音频多频带动态范围压缩系统。

介绍

动态范围压缩通过衰减强峰的水平来减少信号的动态范围,同时保持较弱的峰值不变。压缩在音频录制,混合和广播中具有应用。

多频带压缩通过首先将音频信号分成多个频段,然后通过其自身独立可调节的压缩机将音频信号分成不同的音频频段。多频带压缩广泛用于音频母带,通常包含在音频工作站中。

在该示例中的多频带压缩机首先使用多频带交叉滤波器将音频信号分成不同的频带。LinkWitz-Riley交叉过滤器用于获得整体allpass频率响应。然后使用单独的动态范围压缩机压缩每个频带。键压缩机特性,例如压缩比,攻击和释放时间,阈值和膝关节宽度为每个频带可独立地调谐。展示了压缩对信号动态范围的影响。

Linkwitz-Riley交叉过滤器

LinkWitz-Riley Crossover滤波器包括低通和高通滤波器的组合,每个滤波器通过级联两个低通或高通巴特滤波器组成。求和两个滤波器的响应在交叉频率下产生0 dB的增益,使得交叉起到ALLPASS滤波器(因此在音频信号中引入没有失真)。

crossoverFilter可以用于实现Linkwitz-Riley System对象。由于Linkwitz-Riley交叉滤波器是由层叠的两个Butterworth滤波器组成的,它的顺序总是偶数。巴特沃斯滤波器的斜率等于6*Ndb / octave,在哪里N为过滤顺序。当CrossoverSlopes的属性crossoverFilter是整除12(即过滤器是偶序的),对象实现了Linkwitz-Riley交叉。否则,该对象将实现Butterworth交叉,其中低通和高通部分都使用单个Butterworth有序滤波器实现交叉索引/ 6.

下面是一个四阶Linkwitz-Riley交叉的例子,用来过滤信号。注意,低通和高通段在交叉频率上各有-6 dB增益。低通和高通段的总和是allpass。

Fs = 44100;% Linkwitz-Riley过滤器交叉= crossoverFilter (1 5000 4 * 6, Fs);传递函数估计transferFuncEstimator = dsp。TransferFunctionEstimator (...“FrequencyRange”'片面'“SpectralAverages”20);frameLength = 1024;scope = dsp.arrayplot(...“PlotType”“行”...“YLimits”, -40年[1],...'ylabel'“(dB)级”...“XScale”“日志”...'SampleIncrement',(fs / 2)/(frameLength / 2 + 1),...“包含”的频率(赫兹)...'标题'“第八阶Linkwitz-Riley交叉过滤器”...“ShowLegend”,真的,...'ChannelNames',{'乐队1''乐队2'“和”});抽搐尽管toc < 10 in = randn(frameLength,1);%返回交叉滤波器的低通和高通响应[ylp, yhp] =交叉(的);响应的百分比总和Y = YLP + YHP;v = transferfuncestimator(Repmat(在,1,3),[YLP YHP Y]);范围(20 * log10(abs(v)));结束

多波段交叉过滤器

crossoverFilter也可用于实现多频带交叉滤波器,通过在树形结构中结合双频带交叉滤波器和全通滤波器。滤波器将频谱分成多个波段,这样它们的和就是一个完美的全通滤波器。

下面的例子展示了由四阶Linkwitz-Riley交叉滤波器组成的四带交叉滤波器。注意四个波段的和的allpass响应。

Fs = 44100;cross = cross - filter (3,[2e3 5e3 10e3],[24 24 24],44100);transferFuncEstimator = dsp。TransferFunctionEstimator (“FrequencyRange”'片面'“SpectralAverages”20);l = 2 ^ 14;scope = dsp.arrayplot(...“PlotType”“行”...“XOffset”0,...“YLimits”-120年[5],...“XScale”“日志”...'SampleIncrement', 5 * f /(L/2 + 1),...'ylabel''频率响应(DB)'...“包含”的频率(赫兹)...'标题'“四人交叉过滤”...“ShowLegend”,真的,...'ChannelNames',{'乐队1''乐队2''乐队3'“四级”“和”});抽搐;尽管TOC <10 IN = RANDN(L,1);将信号分成四个波段[ylp, ybp1 ybp2 yhp] =交叉(的);Y = ylp + ybp1 + ybp2 + yhp;z = transferFuncEstimator (repmat(在1 5),[ylp, ybp1, ybp2 yhp y]);范围(20 * log10 (abs (z)))结束

动态范围压缩

压缩机是一个动态范围压缩器系统对象。当输入信号超过指定的阈值时,对其进行压缩。压缩量由指定的压缩比控制。攻击和释放时间决定压缩机启动或停止压缩的速度。膝宽为压缩机在阈值附近的增益提供了一个平滑过渡。最后,一个补充增益可以应用于压缩机的输出。这种补偿增益同时放大强峰和弱峰。

压缩机的静态压缩特性取决于压缩比、阈值和膝宽。下面的例子说明了硬膝盖的静态压缩特性:

刚果民主共和国=压缩机(-15 5);可视化(drc);

为了查看阈值,比率和膝关节宽度对压缩机的静态特性的影响,改变了值的值阈值KneeWidth属性。静态特征图应相应改变。

压缩机的攻击时间被定义为当信号电平超过阈值时,压缩机的增益从其最终值的10%到90%所花费的时间(在MSEC中)。当信号电平下降到阈值以下时,压缩机的释放时间被定义为时刻(以秒为单位),压缩机的增益从其值的90%降至10%。下面的示例说明了不同释放和攻击时间的信号包络:

Fs = 44100;刚果民主共和国=压缩机(-10年5...“SampleRate”Fs,...'攻击时间', 0.050,...“ReleaseTime”, 0.200,...“MakeUpGainMode”“属性”);x = [(Fs, 1); 0.1 * 1 (Fs, 1)];刚果民主共和国(y, g) = (x);t = (1/Fs) * (0: 2*Fs - 1);图次要情节(211)情节(t, x);持有网格绘图(t,y,“r”)ylabel(“振幅”)传说(“输入”“压缩输出”)子图(212)绘图(t,g)网格传奇(“压缩机获得(dB)”)xlabel('时间(秒)')ylabel('收益(DB)'

图中包含2个轴。axis 1包含2个类型为line的对象。这些对象表示输入、压缩输出。Axes 2包含一个类型为line的对象。该对象表示压缩机增益(dB)。

输入最大电平为0 dB,高于指定的-10 dB阈值。输入0db时,压缩机稳态输出为-10 + 10/5 = - 8db。因此增益是- 8db。攻击时间定义为当输入电平超过阈值时,压缩机增益从最终值的10%上升到90%所需要的时间,或者在本例中,从-0.8 dB上升到-7.2 dB。让我们计算压缩阶段增益分别等于-0.8 dB和-7.2 dB的时间:

[~,t1] = min(abs(g(1:Fs) + 0.1 * 8));[~,t2] = min(abs(g(1:Fs) + 0.9 * 8));tAttack = (t2 - t1) / Fs;流('攻击时间为%d s\n'tAttack)
攻击时间为5.000000e-02秒

然后输入信号掉回0,其中没有压缩。当输入远低于阈值时,或者在这种情况下,将释放时间定义为增益从其绝对值的90%到10%所花费的时间,或者在这种情况下,-7.2dB至-0.8 dB。让我们发现没有压缩阶段的收益等于-7.2 db和-0.8 db的时间:

[~,t1] = min(abs(g(Fs:end) + 0.9 * 8));[~,t2] = min(abs(g(Fs:end) + 0.1 * 8));/ Fs; / Fs; / Fs;流('释放时间为%d s\n'tRelease)
发布时间为2.000000e-01 s

下面的示例说明了动态范围压缩对音频信号的影响。压缩阈值设置为-15dB,压缩比为7。

frameLength = 1024;读者= dsp。AudioFileReader (“文件名”...“rockguitar - 16 - 44 - p1 -立体声- 72 secs.wav”...“SamplesPerFrame”,frameLength);%压缩机。阈值= - 15db,比值= 7刚果民主共和国=压缩机(-15 7...“SampleRate”,读者。赞美,...“MakeUpGainMode”“属性”...“KneeWidth”5);范围= timescope (“SampleRate”,读者。赞美,...“TimeSpanSource”“属性”...“时间间隔”, 1'bufferLength'Fs * 4,...'showgrid',真的,...“LayoutDimensions”(2 - 1),...“NumInputPorts”2,...'timespanoverrunaction''滚动');范围。ActiveDisplay = 1;范围。YLimits = [-1 1];scope.showlegend = true;scope.channelnames = {“原创音频与压缩音频”};scope.activedisplay = 2;scope.ylimits = [-6 0];scope.ylabel ='收益(DB)';scope.showlegend = true;scope.channelnames = {“压缩机增益(dB)”};尽管~isDone(reader) x = reader();刚果民主共和国(y, g) = (x);x1 = x (: 1);日元= y (: 1);范围((x1, y1), g (: 1))结束

金宝app多频带动态范围压缩示例的Simulink版本

下面的模型实现了多频带动态范围压缩示例:

模型=“audiomultibanddynamiccompression”;open_system(模型)

在这个例子中,音频信号首先使用多频带交叉滤波器分成四个频带。每个波段用一个单独的压缩机压缩。然后这四个波段被重新组合成音频输出。计算未压缩和压缩信号的动态范围(定义为信号的最大绝对值与信号均方根的比值)。要听到原始音频信号和压缩音频信号之间的区别,请拨动顶端的开关。

该模型集成了一个用于与仿真交互的用户界面(UI)。UI允许您调优参数,结果立即反映在模拟中。要启动控制仿真的UI,请单击模型上的“launch Parameter Tuning UI”链接。

set_param(模型,“StopTime”'(1/44100) * 8192 * 20');SIM(型号);

关闭模型:

bdclose(模型)

MATLAB版本的多频带动态范围压缩示例

HelperMultibandCompressionSim是MATLAB函数中包含多频带动态范围压缩实例的实现。它实例化、初始化并逐步遍历形成算法的对象。

功能multibandAudioCompressionExampleApp包裹在HelperMultibandCompressionSim迭代地调用它。它还绘制了未压缩和压缩的音频信号。绘图发生在plotResults函数的输入为“true”。

执行multibandAudioCompressionExampleApp运行模拟并在作用域上绘制结果。注意,只要用户没有显式地停止模拟,它就会运行。

multibandAudioCompressionExampleApp启动一个设计用于与模拟交互的UI。UI允许您调优参数,结果立即反映在模拟中。有关UI的更多信息,请参阅helpercreateparamtuningui.

可以使用MATLAB编码器为函数生成C代码HelperMultibandCompressionSim.为了为您的平台生成一个mex文件,请执行HelperMultibandCompressionCodeGeneration

通过调用包装函数multibandAudioCompressionExampleApp'真的'作为参数时,可以使用生成的mex -文件代替HelperMultibandCompressionSim的模拟。在这个场景中,UI仍然在MATLAB环境中运行,但是主要的处理算法由一个mex文件执行。在这种模式下,在不影响参数调优能力的情况下,性能得到了改善。

调用multibandAudioCompressionExampleApp(真正的)使用mex -文件进行模拟。同样,模拟一直运行到用户显式地从UI中停止为止。