主要内容

多波段动态范围压缩

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

简介

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

多频带压缩分别压缩不同的音频频带,首先将音频信号分割成多个频带,然后让每个频带通过自己的独立可调压缩机。多频带压缩在音频制作中被广泛应用,经常被包括在音频工作站中。

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

Linkwitz-Riley交叉滤波器

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

crossoverFilter可用于实现Linkwitz-Riley系统对象。由于Linkwitz-Riley交叉滤波器是由两个Butterworth滤波器级联形成的,因此它的顺序总是偶数。巴特沃斯滤波器的斜率等于6*NdB /八度,N是过滤器的顺序。当CrossoverSlopes的属性crossoverFilter能被12(即过滤器是偶序的),对象实现了Linkwitz-Riley交叉。否则,该对象实现了巴特沃斯交叉,其中low - pass和high - pass部分分别使用单个巴特沃斯顺序过滤器实现CrossoverSlopes / 6

下面是一个用四阶Linkwitz-Riley交叉滤波信号的例子。注意,低通和高通部分在交叉频率处都有- 6db增益。low - pass和high - pass部分之和为allpass。

Fs = 44100;% Linkwitz-Riley滤波器cross = crosoverfilter (1,5000,4*6, f);%传递函数估计transferFuncEstimator = dsp。TransferFunctionEstimator (...“FrequencyRange”“单向的”“SpectralAverages”, 20);framength = 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] = cross (in);%求和Y = ylp + yhp;v = transferFuncEstimator(repmat(in,1,3),[ylp yhp y]);范围(20 * log10 (abs (v)));结束

多波段交叉滤波器

crossoverFilter也可用于通过将双带交叉滤波器和全通滤波器组合成树状结构来实现多带交叉滤波器。该滤波器将频谱分成多个波段,使它们的和是一个完美的全通滤波器。

下面的例子显示了一个四阶Linkwitz-Riley交叉滤波器组成的四波段交叉滤波器。注意四个波段之和的全通响应。

Fs = 44100;cross = crosoverfilter (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 * Fs/(L/2 + 1),...“YLabel”“频率响应(dB)”...“包含”的频率(赫兹)...“标题”“四波段交叉滤波器”...“ShowLegend”,真的,...“ChannelNames”, {“带1”《带2》“乐队3”“四级”“和”});抽搐;toc < 10 in = randn(L,1);将信号分成四个波段[ylp,ybp1,ybp2,yhp] = cross (in);Y = ylp + ybp1 + ybp2 + yhp;z = transferFuncEstimator(repmat(in,1,5),[ylp,ybp1,ybp2,yhp,y]);范围(20 * log10 (abs (z)))结束

动态范围压缩

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

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

DRC =压缩机(-15,5);可视化(drc);

为了观察阈值、比值和膝宽对压缩机静态特性的影响,可以改变的值阈值而且KneeWidth属性。静态特征图应相应改变。

压缩机的攻击时间定义为当信号电平超过阈值时,压缩机增益从其最终值的10%上升到其最终值的90%所需的时间(以毫秒为单位)。压缩机释放时间定义为当信号电平低于阈值时,压缩机增益从其值的90%下降到10%的时间(以秒为单位)。下面的例子说明了不同释放和攻击时间的信号包络:

Fs = 44100;DRC =压缩机(-10,5,...“SampleRate”Fs,...“AttackTime”, 0.050,...“ReleaseTime”, 0.200,...“MakeUpGainMode”“属性”);x = [ones(Fs,1);0.1*ones(Fs,1)];[y,g] = drc(x);t = (1/Fs) * (0: 2*Fs - 1);图subplot(211) plot(t,x);持有网格情节(t y“r”) ylabel (“振幅”)传说(“输入”“压缩输出”)子图(212)图(t,g)网格传奇(压缩机增益(dB))包含(的时间(秒)) ylabel (“获得(dB)”

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

输入的最大电平为0db,高于指定的- 10db阈值。0 dB输入时压缩机稳态输出为-10 + 10/5 = - 8db。因此增益为-8 dB。攻击时间定义为当输入电平超过阈值时,压缩机增益从其最终值的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 s

输入信号然后下降到0,没有压缩。释放时间定义为当输入低于阈值时,增益从其绝对值的90%下降到10%的时间,或者在本例中为-7.2 dB到-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));tRelease = (t2 - t1) / Fs;流('释放时间为%d s\n'tRelease)
发布时间为2.000000e-01秒

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

framength = 1024;Reader = dsp。AudioFileReader (“文件名”...“rockguitar - 16 - 44 - p1 -立体声- 72 secs.wav”...“SamplesPerFrame”, frameLength);%压缩机。阈值= -15 dB,比值= 7DRC =压缩机(-15,7,...“SampleRate”,读者。SampleRate,...“MakeUpGainMode”“属性”...“KneeWidth”5);Scope = 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] = drc(x);X1 = x(:,1);Y1 = y(:,1);范围((x1, y1), g (: 1))结束

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

下面的模型实现了多波段动态范围压缩的例子:

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

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

该模型集成了用于与仿真交互的用户界面(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 Coder可以用来生成C代码的函数HelperMultibandCompressionSim.为了为您的平台生成一个mexo文件,请执行HelperMultibandCompressionCodeGeneration

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

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