Sal*_*rtz 8 audio macos core-audio audiounit
这实际上更像是一个理论问题,但在这里:
我正在开发一种效果音频单元,它需要在干信号和湿信号之间进行相等的功率交叉渐变.
但我对于从线性衰减器到干流和湿流信号幅度的比例因子(增益)的映射函数的正确方法感到困惑.
基本上,我看到它用cos/sin函数或平方根完成...基本上近似对数曲线.但是,如果我们对幅度的感知是开始时的对数,那么这些将推子位置映射到幅度的曲线实际上不应该是指数的吗?
这就是我的意思:
假设:
signal[i] 表示信号中的第i个样本.fader 是具有NSSlider值的变量.第一次观察:
我们以对数方式感知振幅.因此,如果我们有一个线性推子,只是通过这样做来调整信号的幅度:signal[i] * fader我们所感知的内容(听觉,无论数学如何)都是这样的:

这就是所谓的蹩脚的推子效应:我们从静音变为滑块中最左边一段的剧烈音量增加,经过中间音量似乎没有那么响亮.
因此,为了使推子"正确",我们要么以dB尺度表示,然后,就信号而言,做:signal[i] * 10^(fader/20)或者,如果我们要保持[0,1]或推子单位,我们可以做:signal[i] * (.001*10^(3*fader))
无论哪种方式,我们从NSSlider到我们将在代码中使用的推子变量的新映射现在看起来像这样:

这是我们真正想要的,因为由于我们以对数方式感知振幅,我们基本上从线性(NSSLider范围0-1)映射到指数,并将这个指数输出馈送到我们的对数感知.事实证明:log(10^x)=x所以我们最终以线性(也就是正确的)方式感知幅度变化.
大.
现在,我的想法是两个信号之间的等功率交叉淡化(在这种情况下是干/湿水平NSSlider将输入混合到AU和来自它的处理输出)基本上只相同,只有一个滑块作用于两个假设信号都干[i]和湿[i].
因此,如果我的滑块范围从0到100并且干完全左,而湿是完全右,我最终会得到以下代码:
Float32 outputSample, wetSample, drySample = <assume proper initialization>
Float32 mixLevel = .01 * GetParameter(kParameterTypeMixLevel);
Float32 wetPowerLevel = .001 * pow(10, (mixLevel*3));
Float32 dryPowerLevel = .001 * pow(10, ((-3*mixLevel)+1));
outputSample = (wetSample * wetPowerLevel) + (drySample * dryPowerLevel);
Run Code Online (Sandbox Code Playgroud)
其图表将是:

和以前一样,因为我们以对数方式感知振幅,这种指数映射实际上应该使我们听到交叉渐变是线性的.
但是,我已经看到使用近似值来记录交叉淡化的实现.意思是:

但这些曲线实际上不会强调我们对振幅的对数感知吗?
小智 8
您正在考虑的"等功率"交叉淡化与保持混合物的总输出功率在从潮湿到干燥时保持恒定有关.保持总功率恒定是保持总感知响度恒定的合理近似(实际上可能相当复杂).
如果您在两个相等功率的不相关信号之间交叉渐变,则可以使用平方值总和为1的任意两个函数在交叉渐变期间保持恒定的输出功率.一个常见的例子是函数集
g1(k)=(0.5 + 0.5*cos(pi*k))^.5
g2(k)=(0.5 - 0.5*cos(pi*k))^.5,
其中0 <= k <= 1(注意,如上所述,满足g1(k)^ 2 + g2(k)^ 2 = 1).这证明了这导致不相关信号的恒定功率交叉衰减:
说,我们有两个信号X1(t)和X2(t)与等幂E [X1(t)的^ 2] = E [x 2(t)的^ 2] = Px的,这也是不相关的(E [X1(t)的*x2(t)] = 0).注意,满足先前条件的任何增益函数集将具有g2(k)=(1-g1(k)^ 2)^.5.现在,形成和y(t)= g1(k)*x1(t)+ g2(k)*x2(t),我们得到:
E[ y(t)^2 ] = E[ (g1(k) * x1(t))^2 + 2*g1(k)*(1 - g1(k)^2)^.5 * x1(t) * x2(t) + (1 - g1(k)^2) * x2(t)^2 ]
= g1(k)^2 * E[ x1(t)^2 ] + 2*g1(k)*(1 - g1(k)^2)^.5 * E[ x1(t)*x2(t) ] + (1 - g1(k)^2) * E[ x2(t)^2 ]
= g1(k)^2 * Px + 0 + (1 - g1(k)^2) * Px = Px,
Run Code Online (Sandbox Code Playgroud)
在这里我们使用任何g1(k)和G2(K)是确定性的,因此可以期望算子E []外拉出,而E [X1(t)的*X2(吨)] = 0通过定义,因为X1(假设t)和x2(t)是不相关的.这意味着无论我们在交叉淡入淡出的哪个位置(无论我们选择何种k),我们的输出仍将具有相同的功率Px,因此希望具有相同的感知响度.
请注意,对于完全相关的信号,您可以通过执行"线性"淡入淡出来实现恒定的输出功率 - 使用和两个总和为1的函数(g1(k)+ g2(k)= 1).当混合有些相关的信号时,理论上这两者之间的增益函数是合适的.
当你说的时候你在想什么
和以前一样,因为我们以对数方式感知振幅,这种指数映射实际上应该使我们听到交叉渐变是线性的.
是一个信号应该作为滑块位置(k)的线性函数在感知上降低,而另一个信号应该在响度上作为滑块位置的线性函数在感知上增加,当应用您的导出交叉渐变时.虽然你的推导似乎相当不错,但不幸的是,这可能不是在干燥和潮湿信号融合方面的最好方法 - 通常,无论滑块位置如何,保持相等的输出响度都是最好的选择.在任何情况下,尝试使用几个不同的函数来查看最有用和最一致的内容可能是值得的.