这个例子展示了如何模拟数字音频多波段动态范围压缩系统。
动态范围压缩降低了信号的动态范围衰减的程度强峰,而弱峰不变。压缩应用程序在录音、混合和广播。
多频带压缩压缩音频频段分别不同,首先将音频信号分解到多个乐队,然后通过每个乐队通过自己的独立可调压缩机。多频带压缩是广泛应用于音频掌握和通常是包含在音频工作站。
本例中的多波段压缩机首先将音频信号分为不同的乐队使用多波段交叉过滤器。Linkwitz-Riley交叉过滤器是用来获得一个整体allpass频率响应。然后使用一个单独的动态范围压缩每个乐队压缩机。压缩机关键特征,如压缩比、攻击和释放时间阈值和膝盖宽度,每个乐队都是独立可调。压缩的影响信号的动态范围是展示。
Linkwitz-Riley交叉过滤器由低通和高通滤波器的组合,每一个由两个巴特沃斯低通和高通滤波器级联。求和的反应两个过滤器收益率上涨0分贝在交叉频率,以便跨界就像一个allpass过滤器(因此引入没有音频信号失真)。
crossoverFilter
可用于实现Linkwitz-Riley系统对象。自从Linkwitz-Riley交叉过滤器是由两个巴特沃斯滤波器级联,其顺序总是甚至。巴特沃斯滤波器的斜率等于6 *NdB /八度,N是过滤器的顺序。当CrossoverSlopes
的属性crossoverFilter
是整除12
(即过滤甚至命令),对象实现了Linkwitz-Riley交叉。否则,该对象实现巴特沃斯交叉,低通和高通滤波部分都使用单一的巴特沃斯滤波器实现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 = randn (frameLength, 1);%的返回低通和高通滤波响应交叉过滤器[ylp, yhp] =交叉(的);%和反应y = ylp + yhp;v = transferFuncEstimator (repmat (1, 3), [ylp yhp y]);范围(20 * log10 (abs (v)));结束
crossoverFilter
也可以用来实现一个多波段交叉过滤结合双波段交叉过滤器和allpass过滤器在一个树状结构。过滤器将频谱划分为多个乐队,它们的和是一个完美的allpass过滤器。
下面的例子展示了一个四人交叉过滤形成的四阶Linkwitz-Riley交叉过滤器。注意allpass响应四个乐队的总和。
Fs = 44100;交叉= crossoverFilter (3 [2 e3 5 e3 10 e3], [24 24 24], 44100);transferFuncEstimator = dsp.TransferFunctionEstimator (“FrequencyRange”,“单向的”,“SpectralAverages”,20);L = 2 ^ 14;范围= dsp.ArrayPlot (…“PlotType”,“行”,…“XOffset”0,…“YLimits”-120年[5],…“XScale”,“日志”,…“SampleIncrement”,5 * Fs / (L / 2 + 1),…“YLabel”,的频率响应(dB),…“包含”,的频率(赫兹),…“标题”,“四人交叉过滤”,…“ShowLegend”,真的,…“ChannelNames”,{“带1”,《带2》,“乐队3”,“四级”,“和”});抽搐;而toc < 10 = 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)”)
输入最大级别0分贝,上面指定的-10分贝的阈值。稳态压缩机输出0数据库输入-10 + 10/5 = 8分贝。因此,获得8分贝。攻击时间被定义为时间从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.000000 e-02年代
然后输入信号下降回落到0,没有压缩。释放时间被定义为时间的收益从90%滑落到10%绝对值当输入阈值以下,或在这种情况下,-7.2 dB -0.8 dB。我们找的时候没有压缩阶段的收益等于-7.2 dB和-0.8 dB,分别为:
(~,t1) = min (abs (g (Fs:结束)+ 0.9 * 8));[~,t2] = min (abs (g (Fs:结束)+ 0.1 * 8));tRelease = (t2 - t1) / Fs;流(“释放时间是% d s \ n”tRelease)
释放时间是2.000000 e-01年代
下面的例子说明了影响动态范围压缩音频信号。压缩阈值设置为-15分贝,压缩比是7。
frameLength = 1024;读者= dsp.AudioFileReader (“文件名”,…“rockguitar - 16 - 44 - p1 -立体声- 72 secs.wav”,…“SamplesPerFrame”,frameLength);%压缩机。阈值= -15分贝,比= 7刚果民主共和国=压缩机(-15 7…“SampleRate”reader.SampleRate,…“MakeUpGainMode”,“属性”,…“KneeWidth”5);范围= timescope (“SampleRate”reader.SampleRate,…“TimeSpanSource”,“属性”,…“时间间隔”,1“BufferLength”Fs * 4,…“ShowGrid”,真的,…“LayoutDimensions”(2 - 1),…“NumInputPorts”2,…“TimeSpanOverrunAction”,“滚动”);范围。ActiveDisplay = 1;范围。YLimits = [1];范围。ShowLegend = true;范围。ChannelNames = {“原来与压缩音频”};范围。ActiveDisplay = 2;范围。YLimits = [6 0];范围。YLabel =“获得(dB)”;范围。ShowLegend = true;范围。ChannelNames = {“压缩机增益在dB”};而~结束(读者)x =读者();刚果民主共和国(y, g) = (x);x1 = x (: 1);日元= y (: 1);范围((x1, y1), g (: 1))结束
下面的模型实现了多波段动态范围压缩的例子:
模型=“audiomultibanddynamiccompression”;open_system(模型)
在这个例子中,音频信号首先被分为四个乐队使用多波段交叉过滤器。每个乐队都是使用一个单独的压缩机压缩。然后四个乐队重组形成了音频输出。未压缩和压缩信号的动态范围(定义为信号的最大绝对值比信号RMS)计算。听原和压缩音频信号之间的区别,在顶级切换开关。
该模型集成了一个用户界面(UI)设计与仿真。用户界面允许您调整参数和结果立即反映在模拟。启动UI控制仿真,单击“启动参数调优UI”链接模式。
set_param(模型,“StopTime”,(1/44100)* 8192 * 20的);sim(模型);
关闭模型:
bdclose(模型)
HelperMultibandCompressionSim
是包含多波段的MATLAB函数动态范围压缩的实现示例。它实例化,通过算法形成的对象初始化和步骤。
这个函数multibandAudioCompressionExampleApp
包裹在HelperMultibandCompressionSim
和迭代调用它。它还情节压缩和压缩音频信号。策划时发生的plotResults
输入函数是“真正的”。
执行multibandAudioCompressionExampleApp
运行仿真和绘制结果范围。请注意,模拟运行时,只要用户不明确阻止它。
multibandAudioCompressionExampleApp
启动一个UI设计与仿真。用户界面允许您调整参数和结果立即反映在模拟。在UI上的更多信息,请参阅HelperCreateParamTuningUI
。
MATLAB编码器可用于生成C代码的函数HelperMultibandCompressionSim
。为了生成一个MEX-file平台,执行HelperMultibandCompressionCodeGeneration
。
通过调用包装器函数multibandAudioCompressionExampleApp
与“真正的”
作为参数,生成MEX-file可以代替使用HelperMultibandCompressionSim
的模拟。在这个场景中,UI仍在MATLAB环境中运行,但主要处理算法MEX-file执行。性能改进的前提下在这种模式下优化参数的能力。
调用multibandAudioCompressionExampleApp(真正的)
使用MEX-file来模拟。再次,模拟运行,直到用户显式地阻止它的UI。