2012-04-16 106 views
8

这实际上更多的是一个理论问题,但在这里它是:音频单元中的等功率交叉淡入淡出?

我正在开发一个效果音频单元,它需要干和湿信号之间的等功率交叉淡入淡出。

但是我对从线性衰减器到干流和湿流信号幅度的缩放因子(增益)做映射函数的正确方法感到困惑。

基本上,我看到它用cos/sin函数或平方根完成......基本上近似于对数曲线。但是如果我们的幅度感知是对数的,那么这些曲线不应该将衰减器位置映射到幅度实际上是指数型的吗?

这就是我的意思是:

假设:

  • signal[i]意味着信号的第i个样本。
  • 每个样本都是[-1,1]的范围,范围为[0,1]之间的幅度。
  • 我们的GUI控件是一个范围从[0,1]的NSSlider,所以它在 原理上是线性的。
  • fader是一个带有NSSlider值的变量。

第一观察: 我们对数的方式感知幅度。因此,如果我们有一个线性推杆,仅仅通过做调整信号的幅度:signal[i] * fader我们所感知(听力,无论数学)是沿着线的东西:

enter image description here

这就是所谓的称为蹩脚的推子效果:我们从静音到滑块最左侧的音量增加剧烈,并且音量似乎没有变大。

所以,我们要做的推子“右”,我们不是任何明示它在一个分贝的规模,然后,尽可能的信号而言,这样做:signal[i] * 10^(fader/20)或者,如果我们在[0,以保持或推子单位, 1],我们可以这样做:signal[i] * (.001*10^(3*fader))

无论哪种方式,我们从NSSlider这是我们将使用在我们的代码乘以推子变量新的映射,看起来现在这个样子:

enter image description here

这是我们真正想要的,因为由于我们以对数方式感知振幅,所以我们本质上是马比从线性(NSSLider范围0-1)到指数并且将这个指数输出馈送到我们的对数感知。事实证明:log(10^x)=x所以我们最终以线性(正确)方式感知幅度变化。

太好了。

现在,我认为两个信号之间的等功率交叉淡入淡出(在这种情况下,干/湿水平NSSlider将输入混合到AU以及来自AU的处理输出)基本上与只有一个滑块作用于两个假设信号dry [i]和wet [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); 

其中的曲线将是:

enter image description here

和以前一样,因为我们对数感知幅度,这个指数映射实际上应该让我们听到交叉淡入淡出线性。

但是,我已经看到使用近似曲线的交叉渐变的实现。含义,而不是:

enter image description here

但不会这些曲线实际上是强调我们振幅的对数看法?

+0

我建议在DSP姊妹网站上询问这个问题:http://dsp.stackexchange.com/ – 2012-04-16 10:33:18

+0

我想我现在知道了,但嘿,我不知道那个网站! – SaldaVonSchwartz 2012-04-16 10:35:48

+0

很酷。如果你知道了,你应该回答你自己的问题 - 我想为你想知道你提出的答案。 – 2012-04-17 07:08:48

回答

7

您所考虑的“相等功率”交叉淡入淡出必须与保持混合的总输出功率保持恒定不变,因为您从褪色变为干燥。保持总功率不变是保持总体感知响度不变的合理近似(实际上它可能相当复杂)。

如果正在相等的功率两个不相关的信号之间的交叉衰减,则可以通过使用任何两个函数,其平方值总和为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 [x2(t) (E [x1(t)* x2(t)] = 0)。请注意,满足前一条件的任何一组增益函数将具有g2(k)=(1-g1(k)^ 2)^。现在,在形成值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, 

在这里我们使用任何g1(k)的和g2(k)是确定性的,因此可以被拉到期望算子E []外,并且根据定义E [x1(t)* x2(t)] = 0,因为假定x1(t)和x2不相关。这意味着无论我们处于交叉淡入淡出状态(无论我们选择哪个k),我们的输出仍将具有相同的功率Px,并因此有望与感知的响度相等。请注意,对于完全相关的信号,可以通过执行“线性”淡入使用和两个总和为1的函数(g1(k)+ g2(k)= 1)来获得恒定的输出功率。当混合有些相关的信号时,这两者之间的增益函数理论上是合适的。

你想,当你说

的什么,和以前一样,因为我们对数感知幅度, 这个指数映射实际上应该让我们听到 交叉淡入淡出线性。

是一个信号应在感知响度作为减少的滑块位置(k)的线性函数,同时施加派生淡入淡出时的其他信号应感知响度作为增加的滑块位置的线性函数,。虽然你的推导看起来很不错,但不幸的是,这可能不是最好的方法来融合你干湿信号的一致性 - 无论滑块位置如何,保持相同的输出响度都是最好的选择。无论如何,可能值得尝试一些不同的功能来查看哪些是最可用和最一致的。