这实际上更多的是一个理论问题,但在这里它是:音频单元中的等功率交叉淡入淡出?
我正在开发一个效果音频单元,它需要干和湿信号之间的等功率交叉淡入淡出。
但是我对从线性衰减器到干流和湿流信号幅度的缩放因子(增益)做映射函数的正确方法感到困惑。
基本上,我看到它用cos/sin函数或平方根完成......基本上近似于对数曲线。但是如果我们的幅度感知是对数的,那么这些曲线不应该将衰减器位置映射到幅度实际上是指数型的吗?
这就是我的意思是:
假设:
signal[i]
意味着信号的第i个样本。- 每个样本都是[-1,1]的范围,范围为[0,1]之间的幅度。
- 我们的GUI控件是一个范围从[0,1]的NSSlider,所以它在 原理上是线性的。
fader
是一个带有NSSlider值的变量。
第一观察: 我们对数的方式感知幅度。因此,如果我们有一个线性推杆,仅仅通过做调整信号的幅度:signal[i] * fader
我们所感知(听力,无论数学)是沿着线的东西:
这就是所谓的称为蹩脚的推子效果:我们从静音到滑块最左侧的音量增加剧烈,并且音量似乎没有变大。
所以,我们要做的推子“右”,我们不是任何明示它在一个分贝的规模,然后,尽可能的信号而言,这样做:signal[i] * 10^(fader/20)
或者,如果我们在[0,以保持或推子单位, 1],我们可以这样做:signal[i] * (.001*10^(3*fader))
无论哪种方式,我们从NSSlider这是我们将使用在我们的代码乘以推子变量新的映射,看起来现在这个样子:
这是我们真正想要的,因为由于我们以对数方式感知振幅,所以我们本质上是马比从线性(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);
其中的曲线将是:
和以前一样,因为我们对数感知幅度,这个指数映射实际上应该让我们听到交叉淡入淡出线性。
但是,我已经看到使用近似曲线的交叉渐变的实现。含义,而不是:
但不会这些曲线实际上是强调我们振幅的对数看法?
我建议在DSP姊妹网站上询问这个问题:http://dsp.stackexchange.com/ – 2012-04-16 10:33:18
我想我现在知道了,但嘿,我不知道那个网站! – SaldaVonSchwartz 2012-04-16 10:35:48
很酷。如果你知道了,你应该回答你自己的问题 - 我想为你想知道你提出的答案。 – 2012-04-17 07:08:48