- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这实际上更多的是一个理论问题,但事实是:
我正在开发一个效果音频单元,它需要干信号和湿信号之间具有相等功率的交叉淡入淡出。
但是我对从线性推子到干流和湿流信号幅度的比例因子(增益)的映射函数的正确方法感到困惑。
基本上,我见过它是用 cos/sin 函数或平方根完成的......本质上近似对数曲线。但是,如果我们对幅度的感知一开始是对数的,那么这些将推子位置映射到幅度的曲线实际上不应该是指数的吗?
这就是我的意思:
假设:
signal[i]
表示信号中的第 i 个样本。fader
是一个具有 NSSlider 值的变量。第一次观察:我们以对数方式感知振幅。因此,如果我们有一个线性推子,并且仅通过执行以下操作来调整信号的幅度:signal[i] * fader
,我们所感知的(听到的,无论数学如何)类似于:
这就是所谓的蹩脚推子效果:我们从静音到 slider 最左边部分的音量急剧增加,经过中间,音量似乎没有变得那么响亮。
因此,为了“正确”地实现推子,我们可以用 dB 标度来表示,然后就信号而言,执行:signal[i] * 10^(fader/20)
或者,如果我们要将推子单位保留在 [0,1] 中,我们可以这样做:signal[i] * (.001*10^(3*fader))
无论哪种方式,我们从 NSSlider 到我们将在代码中用于相乘的推子变量的新映射现在看起来像这样:
这就是我们真正想要的,因为由于我们以对数方式感知振幅,所以我们本质上是从线性(NSSLider范围0-1)映射到指数并提供该指数输出到我们的对数感知。事实证明:log(10^x)=x
因此我们最终以线性(也称为正确)方式感知幅度变化。
太棒了。
现在,我的想法是,两个信号之间的等功率交叉淡入淡出(在本例中是一个干/湿水平 NSSlider,用于将 AU 的输入与其处理后的输出混合在一起)本质上是相同的,只是与一个信号相同 slider 作用于假设信号 dry[i] 和 wet[i]。
因此,如果我的 slider 范围从 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);
其图表如下:
和以前一样,因为我们以对数方式感知幅度,所以这种指数映射实际上应该使其在我们听到交叉淡入淡出的地方呈线性。
但是,我已经看到使用近似值来记录曲线的交叉淡入淡出的实现。意思是:
但是这些曲线难道不会真正强调我们对振幅的对数感知吗?
最佳答案
您所考虑的“等功率”交叉淡入淡出与从湿淡入干时保持混音的总输出功率恒定有关。保持总功率恒定是保持总感知响度恒定的合理近似(这实际上可能相当复杂)。
如果要在两个功率相等的不相关信号之间进行交叉淡入淡出,则可以使用平方值总和为 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),我们有:
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(t) 被假定为不相关。这意味着无论我们处于交叉淡入淡出的哪个位置(无论我们选择什么 k),我们的输出仍将具有相同的功率 Px,因此希望感知的响度相等。
请注意,对于完全相关的信号,您可以通过执行“线性”淡入淡出来实现恒定的输出功率 - 使用 和 两个总和为 1 的函数 ( g1(k) + g2(k) = 1 )。当混合有些相关的信号时,这两者之间的增益函数理论上是合适的。
当你说这句话的时候你在想什么
And same as before, because we perceive amplitude logarithmically, this exponential mapping should actually make it where we hear the crossfade as linear.
是,当应用派生的交叉淡入淡出时,一个信号的响度在感知上应作为 slider 位置 (k) 的线性函数而降低,而另一个信号的响度在感知上应作为 slider 位置的线性函数而增加。虽然您的推导似乎非常正确,但不幸的是,这可能不是在一致性方面混合干信号和湿信号的最佳方法 - 通常,无论 slider 位置如何,保持相同的输出响度是更好的选择。无论如何,可能值得尝试几个不同的功能,看看什么是最有用和一致的。
关于macos - 音频单元中的等功率交叉淡入淡出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10168842/
我试图要求 test/unit 的新版本(即不是与 ruby 捆绑的版本) .根据 instructions我用 gem i test-unit 安装它.但是现在当我需要 test/unit我似乎
简短版本是: 我有一个 systemd 单元,我想在调用时检查脚本的返回代码: systemctl status service.service 长版本:我有一个 lsb init 脚本正是这样做的,
我正在使用反射动态创建一个类的实例,这工作正常,除非尝试通过单元测试执行此操作 - 我使用的是 MS 测试框架。 我收到熟悉的错误:“无法加载文件或程序集‘Assy’或其依赖项之一。系统找不到指定的文
我想知道测试网站“界面功能”的最佳实践是什么。 我对哪些方法可用于测试界面和动态生成的内容感兴趣。特别是,我很难弄清楚是否可以为需要用户交互的操作创建自动化测试,或者这是否只是浪费时间,我应该让一些
我有一个简单的 Python 服务,其中有一个无限执行某些操作的循环。在各种信号上,sys.exit(0) 被调用,这导致 SystemExit 被引发,然后如果可以的话应该进行一些清理。 在测试中,
我正在使用 OpenCV 2.4.2 这是 OpenCV 文档中的引文 C++: void HoughLinesP(InputArray image, OutputArray lines, doubl
忙于 C# 中的自动化测试用例,我们需要在每次测试后恢复数据库快照。问题是,当运行多个测试时它会失败,因为“其他用户正在使用数据库时无法更改数据库状态。” 我们使用 SqlConnection.Cle
我阅读了 C# 规范并用谷歌搜索了它,但一无所获。 我 99% 肯定 C# 中没有像单元命名空间指令这样的功能,但问题是:为什么?是否有惯用或技术原因? 这很方便,尤其是当我们的大部分文件都由单个命名
我目前正在尝试向我的应用程序(一个非常老的项目......评论说 iOS 2.0)添加单元测试(精确的应用程序测试)并且总是偶然发现 undefined symbols for architectur
我正在使用Delphi 7,并且有一个新单元要在我的项目中使用。我已经编译了新的。当我尝试通过将其添加到uses子句在项目中使用此单元时,出现错误,提示未找到.dcu文件。我还尝试将文件的完整路径放在
场景:我需要编写一个复杂的nHibernate查询,该查询将返回预计的DTO,但是我想使用TDD方法。该方法如下所示: public PrintDTO GetUsersForPrinting(int
您可以通过运行以下命令在事件 html 设置中显示 Jupyter 笔记本: $ jupyter nbconvert untitled.ipynb --to slides --post serve 有
如何在一个网站上拥有多个 AdSense 单元? Google 提供的唯一代码是按单位计算的。 (adsbygoogle = window.adsbygoogle || []).push({})
我刚刚开始为大量代码编写测试。有很多类依赖于文件系统,即读取 CSV 文件、读/写配置文件等。 当前测试文件存储在项目(这是一个 Maven2 项目)的 test 目录中,但由于多种原因该目录并不总是
我对 TDD 还很陌生,在单元测试方面也不是很老练,所以才有这个问题。我有这个用 PHP 编写的遗留函数 function foo(){ x = bar(); y = baz();
我创建了一个程序,在 Swing 窗口的一侧显示结果过滤选项,但默认情况下它们水平相邻显示,这浪费了我在 BorderLayout 的西侧分配的空间。我可以在构造函数或添加语句中传递任何内容来将它们堆
标题不好的借口:如果有人能更好地描述它,请做。 我有一个 WeakList类,它“基本上”是一个 List> (虽然不是字面意义上的派生自列表,但它应该对用户完全透明)。 现在的基本思想是“如果引用的
我正在尝试在 UITableView 上添加两个原型(prototype)单元。但是,我不知道如何验证是否能够为每个原型(prototype)“返回”正确的单元格。你们能帮我一下吗? func ta
我正在使用 CloudKit 作为数据库创建一个简单的待办事项列表应用程序。目前我可以添加和删除对象,但对编辑对象感到困惑。 编辑项目 Controller protocol EditItemCont
我正在针对以下任务训练 RNN:给定一个包含 30 个单词的序列,然后将该序列分类为二进制类。 在我的网络中拥有超过 30 个单元(LSTM、GRU 或普通 RNN)有好处吗?我在网上看到过很多例子,
我是一名优秀的程序员,十分优秀!