首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >音频单元中的等功率交叉衰减?

音频单元中的等功率交叉衰减?
EN

Stack Overflow用户
提问于 2012-04-16 04:49:45
回答 1查看 3K关注 0票数 10

这实际上是一个理论上的问题,但这里说的是:

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

但是,我不知道如何正确地实现从线性填充器到干湿流信号幅值的缩放因子(增益)的映射函数。

基本上,我看到它是用函数或平方根来完成的.本质上接近对数曲线。但是,如果我们对振幅的感知是对数的,那么这些曲线是否应该是指数的呢?

这就是我的意思:

假设:

  • signal[i]是指信号中的第i个样本,
  • 每个样本是一个浮点范围-1,1表示0,1之间的振幅。
  • 我们的图形用户界面控件是一个从0,1到0,1的NSSlider,所以原则上,linear.
  • fader是一个变量,其值为NSSlider.

第一次观察:我们以对数方式感知振幅。因此,如果我们有一个线性衰减器,并且仅仅通过这样做来调整一个信号的幅度:signal[i] * fader我们正在感知的东西(不管数学是什么)是这样的:

这就是所谓的糟糕的推动力:在滑块最左边的部分,我们从沉默到大幅度的音量增长,从中间到中间,音量似乎没有那么响亮。

因此,为了正确地完成这个任务,我们要么用dB标度来表示它,然后,就信号而言,do:signal[i] * 10^(fader/20),或者,如果我们要将它保持在0,1中,我们可以做:signal[i] * (.001*10^(3*fader))

无论哪种方式,我们从NSSlider到fader变量的新映射(我们将用于在代码中进行乘法)现在如下所示:

这就是我们真正想要的,因为我们通过对数感知幅度,我们本质上是从线性 (NSSLider范围0-1)映射到指数,并将这个指数输出加到我们的对数感知。结果是:log(10^x)=x,所以我们最终以线性(也就是正确的)方式感知振幅的变化。

太棒了。

现在,我的想法是,两个信号之间的等功率交叉衰减(在本例中是一个干/湿的水平NSSlider,将输入到AU和它的处理输出混合在一起)本质上是相同的,只有一个滑块对假想信号dryi和weti起作用。

因此,如果我的滑块范围为0到100,dry为满左,而湿为完全右),我将得到如下代码:

代码语言:javascript
复制
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);

其图表如下:

和以前一样,因为我们以对数方式感知振幅,这个指数映射实际上应该使它成为我们听到交叉衰减为线性的地方。

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

但这些曲线不是真的强调了我们对振幅的对数感知吗?

EN

回答 1

Stack Overflow用户

发布于 2012-07-01 06:42:42

当你从湿到干的时候,你所想的“等力”交叉衰减与保持混合的总输出功率保持不变有关。保持总功率不变是保持总感知响度不变的合理近似值(这在现实中是相当复杂的)。

如果您是在两个不相关的等功率信号之间交叉衰落,则可以使用任意两个函数,其平方值之和为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)^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)的和,我们有:

代码语言:javascript
复制
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 x1(t)*x2(t)定义为0,因为x1(t)和x2(t)是不相关的。这意味着,无论我们处于交叉衰退(无论我们选择什么k),我们的输出仍将有相同的力量,Px,因此希望平等的响度。

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

你说的时候你在想什么

和以前一样,因为我们以对数方式感知振幅,这个指数映射实际上应该使它成为我们听到交叉衰减为线性的地方。

当应用导出的交叉衰减时,一个信号应感知到响度减小为滑块位置(k)的线性函数,而另一个信号应作为滑块位置的线性函数而感知地增大响度。虽然你的推导看起来很不错,但不幸的是,这可能并不是把你的干信号和湿信号混合起来的最佳方法--通常,不管滑块的位置如何,保持相同的输出响度是最好的选择。在任何情况下,可能都值得尝试几个不同的函数,看看什么是最有用和最一致的。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10168842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档