此示例显示了如何模拟数字音频多频带动态范围压缩系统。
动态范围压缩通过减弱强峰值的水平,同时保持较弱峰值不变来减少信号的动态范围。压缩在录音、混音和广播中都有应用。
多频带压缩是将不同的音频频带分别压缩,首先将音频信号分成多个频带,然后将每个频带通过自己独立的可调压缩器。多频带压缩广泛应用于音频母版和音频工作站。
本例中的多频带压缩器首先使用多频带交叉滤波器将音频信号分成不同的频带。Linkwitz-Riley交叉滤波器用于获得整体全通频率响应。然后使用一个单独的动态范围压缩机压缩每个频带。关键压缩机特性,如压缩比,攻击和释放时间,阈值和膝盖宽度,是独立可调的每个波段。并给出了压缩对信号动态范围的影响。
Linkwitz-Riley交叉滤波器由低通和高通滤波器组成,每个滤波器由两个低通或高通巴特沃斯滤波器级联而成。将两个滤波器的响应加起来,在交叉频率处产生0 dB的增益,这样交叉就像一个全通滤波器(因此不会在音频信号中引入失真)。
交叉反射器
可用于实现LinkWitz-Riley System对象。由于通过级联两个Butterworth滤波器形成了LinkWitz-Riley Crossover滤波器,因此其顺序甚至是偶数。Butterworth滤波器的斜率等于6 *N.dB /八度,N.是过滤器订单。当。。。的时候交叉潜水艇
财产交叉反射器
是可分开的12.
(即筛选器是偶然的),对象实现了一个LinkWitz-Riley交叉。否则,对象实现了一个Butterworth交叉,其中低通和高通截面各自使用单个Butterworth滤波器来实现订单CrossoverSlopes / 6
。
以下是用于过滤信号的第四阶链路Witz-Riley交叉的示例。请注意,低通和高通节点各自在交叉频率下具有-6 dB增益。低通和高通段的总和是asspass。
FS = 44100;%LinkWitz-Riley过滤器交叉=交叉Filter(1,5000,4 * 6,FS);%转移函数估计transferfuncestimator = dsp.transferFunctionestimator(......'频率范围'那“单向的”那'spectralaverages', 20);frameLength = 1024;= dsp范围。ArrayPlot (......'plottype'那'线'那......'ylimits',[ - 40 1],......“YLabel”那'幅度(DB)'那......'xscale'那'日志'那......“SampleIncrement”(Fs / 2) / (frameLength / 2 + 1),......'xlabel'那'频率(Hz)'那......“标题”那'第八次LinkWitz-Riley Crossover过滤器'那......'ShowLegend',真的,......“ChannelNames”,{“带1”那《带2》那'和'});t而TOC <10 IN = RANDN(FRAMELENG,1);%返回交叉滤波器的低通和高通响应[YLP,YHP] =交叉(IN);%总结答案Y = ylp + yhp;v = transferFuncEstimator(repmat(in,1,3),[ylp yhp y])); / /将所有的函数都赋值范围(20 * log10 (abs (v)));结尾
交叉反射器
也可用于通过在树状结构中组合双频交叉滤波器和AllApd滤波器来实现多频带交叉滤波器。过滤器将频谱划分为多个频段,使其总和是完美的Allpass滤波器。
下面的示例示出了由第四阶LinkWitz-Riley交叉过滤器形成的四带交叉滤波器。注意四个频段的总和的Allpass响应。
FS = 44100;交叉=交叉滤器(3,[2E3 5E3 10E3],[24 24 24],44100);transferfuncestimator = dsp.transferFunctionestimator('频率范围'那“单向的”那'spectralaverages', 20);L = 2 ^ 14;= dsp范围。ArrayPlot (......'plottype'那'线'那......'xoffset',0,......'ylimits',[ - 120 5],......'xscale'那'日志'那......“SampleIncrement”,.5 * fs /(l / 2 + 1),......“YLabel”那的频率响应(dB)那......'xlabel'那'频率(Hz)'那......“标题”那'四带交叉过滤器'那......'ShowLegend',真的,......“ChannelNames”,{“带1”那《带2》那“乐队3”那'乐队4'那'和'});Tic;而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)))结尾
压缩机
是动态范围压缩机系统对象。当超过指定阈值时,输入信号被压缩。压缩量由指定的压缩比控制。攻击和释放时间确定压缩机启动或停止压缩的速度。膝关节宽度为压缩机增益周围提供了平滑的转换。最后,可以在压缩机的输出端应用化妆增益。该化妆增益同样放大强度和弱峰。
压缩机的静态压缩特性取决于压缩比,阈值和膝关节宽度。下面的示例说明了硬膝的静态压缩特性:
DRC =压缩机(-15,5);可视化(DRC);
为了观察阀值、比和膝宽对压缩机静态特性的影响,可以通过改变的值来观察临界点
那比率
和kneewidth.
特性。静态特征曲线应相应地改变。
压缩机攻击时间定义为当信号电平超过阈值时,压缩机增益从其最终值的10%上升到90%所需要的时间(以毫秒为单位)。压缩机释放时间定义为信号电平低于阈值时,压缩机增益从其值的90%下降到10%所需要的时间(以秒为单位)。下面的例子说明了不同的释放和攻击时间的信号包络:
FS = 44100;DRC =压缩机(-10,5,......'采样率',fs,......“AttackTime”,0.050,......'推出日期',0.200,......'makeupgainmode'那'财产');x = [(fs,1); 0.1 * oer(fs,1)];[y,g] = drc(x);t =(1 / fs)*(0:2 * FS-1);图形子图(211)绘图(t,x);抓住在网格在情节(t y'r') ylabel ('振幅') 传奇('输入'那'压缩输出')子图(212)图(t,g)网格在传奇('压缩机增益(DB)')包含(的时间(秒)) ylabel (“获得(dB)”的)
输入最大级别为0 dB,高于指定的-10 dB阈值。为0 dB输入的稳态压缩机输出为-10 + 10/5 = -8 dB。因此增益-8 dB。当输入电平超过阈值时,或者在这种情况下,从-0.8 db到-7.2 dB时,攻击时间被定义为压缩机增益从其最终值的10%到90%从其最终值增加到最终值的时间。让我们发现压缩阶段的收益的时间分别等于-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;FPRINTF('攻击时间是%d s \ n',tittack)
攻击时间为5.000000E-02 S.
然后输入信号下降到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));trelease =(t2 - t1)/ fs;FPRINTF('发布时间是%d s \ n',孕妇)
发布时间为2.000000E-01 s
下面的例子说明了动态范围压缩对音频信号的影响。压缩阈值设置为- 15db,压缩比为7。
frameLength = 1024;reader = dsp.audiofilereader('文档名称'那......'Rockguitar-16-44p1-stereo-72secs.wav'那......'samplesperframe', frameLength);%压缩机。阈值= -15 dB,比率= 7DRC =压缩机(-15,7,......'采样率',读者。SampleRate,......'makeupgainmode'那'财产'那......'kneewidth'5);范围= timescope('采样率',读者。SampleRate,......'timespansource'那'财产'那......'时间跨度',1,“BufferLength”,fs * 4,......“ShowGrid”,真的,......'layoutdimensions',[2 1],......'numinputports'2,......“TimeSpanOverrunAction”那“滚动”);scope.activeyplay = 1;scope.ylimits = [-1 1];scope.showlegend = true;scope.channelnames = {'原始与压缩音频'};范围。ActiveDisplay = 2;范围。YLimits = [-6 0];范围。YLabel =“获得(dB)”;scope.showlegend = true;scope.channelnames = {'压缩机增益在db'};而〜Isdone(读者)x =读取器();[y,g] = drc(x);x1 = x(:,1);Y1 = Y(:,1);范围([x1,y1],g(:,1))结尾
以下模型实现了多频带动态范围压缩示例:
模型='audiomulibanddynamicCompression';Open_System(型号)
在该示例中,使用多频带交叉滤波器首先将音频信号分成四个频带。每个频带使用单独的压缩机压缩。然后重新组合四个频带以形成音频输出。计算未压缩和压缩信号的动态范围(定义为信号RMS的最大绝对值与信号RMS的比率)。要听到原始音频信号和压缩音频信号之间的差异,请切换顶层开关。
该模型集成了旨在与模拟交互的用户界面(UI)。UI允许您调整参数,结果立即反映在模拟中。要启动控制模拟的UI,请单击模型上的“启动参数调整UI”链接。
set_param(型号,'停止'那'(1/44100)* 8192 * 20');sim(模型);
关闭模型:
bdclose(模型)
HelperMultibandCompressionsim
是包含多频带动态范围压缩示例的Matlab功能。它通过形成算法的物体来实例化,初始化和步骤。
这个函数multibandaudiocompression exampleapp.
包裹HelperMultibandCompressionsim
并迭代地称之为。它还绘制未压缩的与压缩音频信号。绘制时会发生Plotesults.
输入函数是'true'。
执行multibandaudiocompression exampleapp.
运行模拟并绘制范围的结果。请注意,只要用户未明确停止它,模拟运行。
multibandaudiocompression exampleapp.
启动旨在与模拟交互的UI。UI允许您调整参数,结果立即反映在模拟中。有关UI的更多信息,请参阅HelperCreateParamTuningUI
。
MATLAB编码器可用于生成函数的C代码HelperMultibandCompressionsim
。为了为您的平台生成MEX文件,执行HelperMultibandCompressionCodegeneration.
。
通过调用包装器函数multibandaudiocompression exampleapp.
和“真正的”
作为一个参数,可以使用生成的MEX文件而不是HelperMultibandCompressionsim
用于模拟。在这种情况下,UI仍在MATLAB环境中运行,但是MEX文件正在执行主要处理算法。这种模式下的性能得到改善,而不会影响调谐参数的能力。
称呼multibandaudiocompression exampleapp(true)
使用MEX文件进行仿真。同样,模拟运行,直到用户明确地从UI停止它。