如何制作 3D 音频?

信息处理 声音的
2022-02-10 06:37:37

存在在相对于听众的特定位置播放音频的概念,例如在游戏中。

  • 在立体声或更多通道中如何实现这一点的细节是什么?
  • 我知道远处的耳朵有音量调节和播放延迟(在立体声的情况下),但有人知道细节吗?
  • 还有其他考虑吗?
2个回答

首先,使用耳机执行此操作与使用一对或更大的扬声器集合执行此操作是有区别的。

有一些基本的物理和生理机制:

  1. Blumlein 立体声所基于的耳间时间差(ITD)这是定位声源方位角的最显着或精确的提示(从左到右,在听者的前面或后面),但它不区分声源是在前面还是后面或上面或以下。如果你能想象一个轴从左到右穿过你的头部,你的耳朵(或耳洞)所在的位置,如果一个声音从正前方向左 40°,导致声音到达你的左耳在到达您的右耳(即 ITD)之前 450 微秒,有一个以该轴为中心的假想锥体,周围有相同的 40°,所有位于该锥体上的声源将具有相同的 ITD。您无法判断它是从正面向左 40° 还是从笔直向上(左侧)向下 40° 或从正后方向左 40° 或从笔直向下向上 40°(在左侧)。ITD只是时间差,不是前对上对后对下的模型。

http://interface.cipic.ucdavis.edu/images/research/pathgeo.gif

  1. 与头部相关的传递函数(HRTF),它模拟耳朵的耳廓(可能还有头部阴影,但我认为这不那么显着)。因为从前面或后面或上面看耳廓的形状是不一样的,除了来自 ITD 的信息之外 , “耳廓提示”会告诉你的大脑声源可能在哪里。这看起来像是 HRTF 的一个很好的教程。

在此处输入图像描述

在此处输入图像描述

哦,还有一些物理机制。(以上两种机制会给听者一个方位角和仰角,但不是距离或深度。)

  1. 与距离的平方反比定律。 每当您将声源与听者的距离加倍时,功率强度(瓦特/平方米)就会降低 4 倍(“电压”电平减半),即信号下降 6 dB等级。

  2. 从远处过滤。 此外,高频有时会因距离和软表面的反射而比低频衰减更多。传递函数不仅是延迟(esτ) 如此遥远的声音可能比更近的声音稍微低通滤波,不那么“清脆”。考虑启动泵动式霰弹枪的经典电影效果声音。考虑一下如果它靠近或远离听起来会是什么样子。它不仅会在更远的时候更安静,而且会不那么清脆。

  3. 直接/反射能量比。 如果大脑解码了多个相关的声音到达,那么第一个到达可能被认为是直接路径,而后面的到达是反射。如果直接的能量远大于反射的能量,则声音可能会被认为更接近。如果直接的能量与反射的能量大致相同,则声音可能会被感知得更远。

在此处输入图像描述

我想我可以用一些传递函数——矩阵数学来勾勒从源到每只耳朵的 HRTF。这将需要更多时间来查找。不想从我的记忆中做到这一点。 这是一篇很好的维基百科文章。

我没有明确的答案,只能报告我在最近的一次实验中提出和尝试的内容。它似乎相当有效,至少对于主要由 X 轴、Z 轴平面组成的听觉世界而言。算法的优化空间可能相当大。

假设我们有一个在 3D 世界中移动的摄像头位置。我维护了两个虚拟“耳朵”的位置,距离相机指向的方向左右 90 度的固定距离,对应于我们可以称之为虚拟头部的位置。我确定声音到每只耳朵的距离并计算差异。声音被放置在由 32 帧阵列组成的立体声延迟线中(近似于时间量,44100 fps,与空气中的声音速度和真实世界头部的大小相匹配)。帧数可能不是最佳的。一个专用的“读取头”(用于该声音)根据时差定位在滞后的立体声通道上。线性插值用于在计算“读取”时读取信号

在我看来,这比使用音量差异更有说服力,特别是因为滞后的耳朵,带有音量差异,可以接收到明显更安静的信号,因此不能正确掩盖其他声音。恕我直言,一只耳朵从附近的响亮的手提钻转开,应该听不到其他更安静、更远的声音,因为手提钻已经衰减到该耳朵以实现立体声放置。

到目前为止,我发现的文本似乎依赖于滤波和衰减而不是延迟,并且依赖于比计算距离差异所需的简单三角更难理解的数学。我仍在寻找更明确的答案,并将监控这个问题,看看还会出现什么。

我在 java-gaming.org 3D 音频测试上发布了一个演示/示例文件(可以下载并运行 java jar)以征求意见。我收到了一些有趣的反馈,类似于您从 robert bristow-johnson 那里收到的反馈。对于 HRTF,我还没有尝试过实时过滤。据推测,一些低通滤波可以相对便宜地完成,并且对于一些需要通过声音指示一定距离或声学障碍(和消音)的游戏应用程序来说“足够好”。