这实际上更多是理论上的问题,但是在这里:

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

但是,我对于为干流和湿流的信号幅度从线性推子到缩放因子(增益)执行映射功能的正确方法感到困惑。

基本上,我看过它是用cos/sin函数或平方根完成的……本质上是近似对数曲线。但是,如果从一开始我们就对振幅的感知是对数的,那么这些将推子位置映射到振幅的曲线难道不是真的是指数的吗?

这就是我的意思:

假设:

  • signal[i]表示信号中的第i个样本。
  • 每个样本都是一个浮点,范围为[0,1],范围为[-1,1]。
  • 我们的GUI控件是一个NSSlider,范围为[0,1],因此它位于
    线性原理。
  • fader是具有NSSlider值的变量。

  • 首次观察:
    我们以对数的方式感知振幅。因此,如果我们有一个线性推子,而只是通过执行以下操作来调整信号的幅度:signal[i] * fader我们所感知的(无论数学运算如何,都会听到)类似于以下内容:

    这就是所谓的糟糕的推子效果:我们从静音过渡到滑块最左边的部分,音量急剧增加,超过中间部分时,音量似乎没有变得更大。

    因此,要使推子“正确”,我们要么以dB刻度表示它,然后就信号而言,执行:signal[i] * 10^(fader/20),或者,如果我们要保持推子单位为[0,1],则我们将其保持为[0,1]可以做的:signal[i] * (.001*10^(3*fader))
    无论哪种方式,我们从NSSlider到推子变量的新映射(我们将在代码中用于乘法)现在都看起来像这样:

    这实际上是我们想要的,因为既然我们可以对数地感知振幅,那么我们实际上是从线性(NSSLider范围0-1)映射到指数,并将此指数输出馈入对数感知。结果是:log(10^x)=x,所以我们最终以线性(aka正确)的方式感知幅度变化。

    伟大的。

    现在,我的想法是,两个信号(在这种情况下为干/湿水平NSSlider,将AU的输入和来自AU的处理后的输出混合在一起)之间的等功率交叉淡入淡出本质上是相同的,两种假设信号都是dry [i]和wet [i]。

    因此,如果我的滑块的范围是0到100,并且dry(干)是左全角,wet(湿)是右全角),我将得到如下代码:
    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);
    

    其图形为:

    与以前一样,因为我们可以对数地感知振幅,所以这种指数映射实际上应该使其在我们听到淡入淡出的地方是线性的。

    但是,我已经看到了使用近似值记录曲线的交叉淡入淡出的实现。意思是:

    但是,这些曲线实际上不会强调我们对振幅的对数感知吗?

    最佳答案

    您正在考虑的“相等功率”交叉淡入淡出与从湿变干到淡变时保持混音的总输出功率恒定有关。保持总功率恒定可以合理地近似于保持总感知响度恒定(实际上这可能相当复杂)。

    如果您在两个功率不相关的互不相关信号之间进行淡入淡出,则可以通过使用平方值总和为1的两个函数来在淡入淡出期间保持恒定的输出功率。

    g1(k)=(0.5 + 0.5 * cos(pi * k))^。5

    g2(k)=(0.5-0.5 * cos(pi * k))^。5,

    其中0
    假设我们有两个信号x1(t)和x2(t)具有相等的幂E [x1(t)^ 2] = E [x2(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,
    

    在这里我们使用g1(k)和g2(k)是确定性的,因此可以拉到期望运算符E []的外面,并且由于定义x [(假设t)和x2(t)不相关。这意味着无论我们处于淡入淡出的位置(无论选择何种k),我们的输出仍将具有相同的功率Px,因此希望具有相等的感知响度。

    请注意,对于完全相关的信号,可以通过执行“线性”衰落来实现恒定的输出功率-使用和两个函数加和为1(g1(k)+ g2(k)= 1)。当混合有些相关的信号时,这两者之间的增益函数在理论上将是适当的。

    你说的时候在想什么



    是,在应用派生淡入淡出功能时,一个信号的响度应在感知上随滑块位置(k)的线性函数而降低,而另一个信号的响度应在感知上随滑块位置(k)的线性函数而增加。尽管您的推论似乎很不错,但不幸的是,这可能不是在一致性方面混合干信号和湿信号的最佳方法-通常,无论滑块位置如何,保持相等的输出响度都是更好的选择。无论如何,可能值得尝试几个不同的功能,以了解最有用和最一致的功能。

    关于macos - 音频单元中功率相等的淡入淡出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10168842/

    10-12 07:25