通过将场景中的声学传播建模为线性时不变系统,将所有发声器和听者位置对连续映射到神经脉冲响应函数,然后可以将其应用于任意声音。 其连续性使我们能够为任意位置的听众呈现空间声学,并且可以预测新位置的声音传播。
3D 空间音频的编码方法有着悠久的历史。 这些方法主要分为两类。第一种方法通过从空间分布的源中捕获声音,在以用户为中心的位置对声场进行编码。第二种方法旨在模拟听众在场景中移动时听到的声音。
对场景的基础声学建模的方法依赖于使用神经隐式表示。 隐式表示已成为 3D 几何和场景外观的有前途的表示。
与视觉和音频的联合建模密切相关。 通过利用视觉和音频之间的对应关系,完成了学习无监督视频和音频表示的工作,可定位发出声音的对象并联合使用视觉和音频进行导航。
学习任意场景的通用声学表示,它可以捕获任意声源在场景中可见和不可见位置的潜在声音传播。
建模
import torch
from torch import nn
import numpy as np
class embedding_module_log(nn.Module):
def __init__(self, funcs=[torch.sin, torch.cos], num_freqs=20, max_freq=10, include_in=True):
super().__init__()
self.functions = funcs
self.num_functions = list(range(len(funcs)))
self.freqs = torch.nn.Parameter(2.0**torch.from_numpy(np.linspace(start=0.0,stop=max_freq, num=num_freqs).astype(np.single)), requires_grad=False)
def forward(self, x_input):
if self.include_in:
out_list = [x_input]
else:
out_list = []
for func in self.funcs:
for freq in self.freqs:
out_list.append(func(x_input*freq))
return torch.cat(out_list, dim=self.ch_dim)
def distance(x1, x2):
x1_norm = x1.pow(2).sum(dim=-1, keepdim=True)
x2_norm = x2.pow(2).sum(dim=-1, keepdim=True)
res = torch.addmm(x2_norm.transpose(-2, -1), x1, x2.transpose(-2, -1), alpha=-2).add_(x1_norm)
return res
def fit_predict_torch(input_pos:torch.Tensor, input_target:torch.Tensor, predict_pos:torch.Tensor, bandwidth:torch.Tensor) -> torch.Tensor:
dist_vector = -distance(predict_pos, input_pos)
gauss_dist = torch.exp(dist_vector/(2.0 * torch.square(bandwidth.unsqueeze(0))))
magnitude = torch.sum(gauss_dist, dim=1, keepdim=True)
out = torch.mm(gauss_dist, input_target)/magnitude
return out