【发布时间】:2012-04-27 11:18:22
【问题描述】:
这实际上更像是一个理论问题,但它是这样的:
我正在开发一个效果器音频单元,它需要在干湿信号之间进行相等功率的交叉渐变。
但是对于干湿流信号幅度从线性推子到比例因子(增益)的映射函数的正确方法,我感到困惑。
基本上,我已经看到它是用 cos / sin 函数或平方根完成的......基本上是近似对数曲线。但是,如果我们对幅度的感知一开始是对数的,那么这些将推子位置映射到幅度的曲线不应该是指数级的吗?
这就是我的意思:
假设:
-
signal[i]表示信号中的第 i 个样本。 - 每个样本都是一个浮点数,范围为 [-1, 1],幅度在 [0,1] 之间。
- 我们的 GUI 控件是一个 NSSlider,范围从 [0,1],所以它在 线性原则。
-
fader是一个带有 NSSlider 值的变量。
第一次观察:
我们以对数方式感知幅度。因此,如果我们有一个线性推子,并且只是通过执行以下操作来调整信号的幅度:signal[i] * fader 我们所感知的(听到的,无论数学如何)大致如下:
这就是所谓的糟糕推子效果:我们从静音到滑块最左侧部分的音量急剧增加,而中间的音量似乎并没有变得那么响亮。
因此,要“正确”地使用推子,我们要么以 dB 标度表示它,然后就信号而言,执行:signal[i] * 10^(fader/20) 或者,如果我们要保持或推子单位为 [0 ,1],我们可以这样做:signal[i] * (.001*10^(3*fader))
无论哪种方式,我们从 NSSlider 到我们将在代码中用于相乘的推子变量的新映射现在看起来像这样:
这是我们真正想要的,因为我们以对数方式感知幅度,所以我们本质上是从 linear(NSSLider 范围 0-1)映射到 exponential 并输入这个指数输出到我们的对数感知。事实证明:log(10^x)=x 所以我们最终以线性(又名正确)方式感知幅度变化。
太棒了。
现在,我的想法是,两个信号之间的等功率交叉淡入淡出(在这种情况下,一个干/湿水平 NSSlider 将 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 姊妹网站上问这个问题:dsp.stackexchange.com
-
我想我现在知道了,但是我不知道那个网站!
-
酷。如果你弄明白了,你应该回答你自己的问题——我想知道你想出的答案。
标签: macos audio core-audio audiounit