主要内容

多频带动态范围压缩

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

介绍

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

多频带压缩是将不同的音频频带分别压缩,首先将音频信号分成多个频带,然后将每个频带通过自己独立的可调压缩器。多频带压缩广泛应用于音频母版和音频工作站。

本例中的多频带压缩器首先使用多频带交叉滤波器将音频信号分成不同的频带。Linkwitz-Riley交叉滤波器用于获得整体全通频率响应。然后使用一个单独的动态范围压缩机压缩每个频带。关键压缩机特性,如压缩比,攻击和释放时间,阈值和膝盖宽度,是独立可调的每个波段。并给出了压缩对信号动态范围的影响。

Linkwitz-Riley交叉过滤器

Linkwitz-Riley交叉滤波器由低通和高通滤波器组成,每个滤波器由两个低通或高通巴特沃斯滤波器级联而成。将两个滤波器的响应加起来,在交叉频率处产生0 dB的增益,这样交叉就像一个全通滤波器(因此不会在音频信号中引入失真)。

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

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

Fs = 44100;% Linkwitz-Riley过滤器交叉= crossoverFilter (1 5000 4 * 6, Fs);传递函数估计transferFuncEstimator = dsp。TransferFunctionEstimator (...“FrequencyRange”,“单向的”,“SpectralAverages”, 20);frameLength = 1024;= 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(in,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;= 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%所需要的时间(以毫秒为单位)。压缩机释放时间定义为信号电平低于阈值时,压缩机增益从其值的90%下降到10%所需要的时间(以秒为单位)。下面的例子说明了不同的释放和攻击时间的信号包络:

Fs = 44100;刚果民主共和国=压缩机(-10年5...“SampleRate”Fs,...“AttackTime”, 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)”)包含(的时间(秒)) 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,没有压缩。释放时间定义为当输入低于阈值时,或者在本例中是-7.2 dB到-0.8 dB时,增益从其绝对值的90%下降到10%所需要的时间。让我们计算无压缩阶段的增益分别等于-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”,读者。SampleRate,...“MakeUpGainMode”,“属性”,...“KneeWidth”5);范围= timescope (“SampleRate”,读者。SampleRate,...“TimeSpanSource”,“属性”,...“时间间隔”, 1“BufferLength”Fs * 4,...“ShowGrid”,真的,...“LayoutDimensions”(2 - 1),...“NumInputPorts”2,...“TimeSpanOverrunAction”,“滚动”);范围。ActiveDisplay = 1;范围。YLimits = [-1 1];范围。ShowLegend = true;范围。ChannelNames = {“原创音频与压缩音频”};范围。ActiveDisplay = 2;范围。YLimits = [-6 0];范围。YLabel =“获得(dB)”;范围。ShowLegend = true;范围。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中停止为止。