Python声学特征神经网络构建区域响度图

该文介绍了一种基于神经网络的声学建模方法,用于空间音频编码。通过将场景中的声学传播建模为线性时不变系统,可以为任意位置的听众呈现空间声学效果。同时,文中提到了视听学习的应用,结合视觉和音频信息进行学习。提供的Python代码示例展示了预训练网络的推理和响应可视化。
摘要由CSDN通过智能技术生成

通过将场景中的声学传播建模为线性时不变系统,将所有发声器和听者位置对连续映射到神经脉冲响应函数,然后可以将其应用于任意声音。 其连续性使我们能够为任意位置的听众呈现空间声学,并且可以预测新位置的声音传播。

工具

  • Pytorch 1.9 (或更高版)
  • h5py
  • numpy
  • scipy
  • matplotlib
  • sklearn (用于线性探头和特征可视化)
  • librosa (用于训练数据解析)
  • ffmpeg 5.0 (仅适用于 AAC-LC 基线)
  • opus-tools 0.2 & libopus 1.3.1
  • 在 Ubuntu 20.04 and 21.10 上测试

处理

音频场编码

3D 空间音频的编码方法有着悠久的历史。 这些方法主要分为两类。第一种方法通过从空间分布的源中捕获声音,在以用户为中心的位置对声场进行编码。第二种方法旨在模拟听众在场景中移动时听到的声音。

隐式表示

对场景的基础声学建模的方法依赖于使用神经隐式表示。 隐式表示已成为 3D 几何和场景外观的有前途的表示。

视听学习

与视觉和音频的联合建模密切相关。 通过利用视觉和音频之间的对应关系,完成了学习无监督视频和音频表示的工作,可定位发出声音的对象并联合使用视觉和音频进行导航。

数学方法

学习任意场景的通用声学表示,它可以捕获任意声源在场景中可见和不可见位置的潜在声音传播。

Python演示预训练网络推理、可视化脉冲响应并绘制响度图

建模

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
参阅 - 亚图跨际
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值