主要内容

Ambisonic Binaural Degoding.

此示例显示如何使用虚拟扬声器将Ambisonic Audio解码为双耳音频。虚拟扬声器是位于球体的表面上的声源,听众位于球体的中心。每个虚拟扬声器都有一对与其相关联的头部相关传输功能(HRTF):一个用于左耳,一个用于右耳。虚拟扬声器位置以及ambisonic order用于计算ambisonic解码器矩阵。解码器的输出由对应于虚拟扬声器位置的HRTF来过滤。来自左HRTF的信号总结在一起并送入左耳。来自右HRTFS的信号总结在一起并送到右耳。这里示出了音频信号流的框图。

加载ARI HRTF数据集

ARIDATASET = LOAD('roidhrtf.mat');

获取所需维度的HRTF数据:[numofsourcemeasurements x 2 x lendersofsamples]

hrtfdata = aridataset.hrtfdata;sourceposition = Aridataset.sourcePosition(:,[1,2]);

在此示例中使用的ARI HRTF数据库是基于声学研究所的工作。HRTF数据和源位置Referenchrtf.mat.来自ARI NH2主题。

奥地利科学院的HRTF数据库,奥地利科学院均以创造性的公共归因于归因于Sharealike 3.0被授权,其中包括:https://creativecommons.org/licenses/by-sa/3.0/

从ARI HRTF数据集选择点

现在加载了HRTF数据集,确定为虚拟扬声器选择哪些点。该示例选择分布在球体表面上的随机点,并选择最接近拾取点的HRTF数据集的点。

  1. 从球形分布中选择随机点

  2. 将球体与HRTF数据集进行比较

  3. 选择它们之间最短距离的点

%以分布点创建一个球体npoints = 24;%点数的点数RNG(0);%种子RANDCOM编号发生器Sphereaz = 360 * rand(1,npoints);Sphereel = Rad2deg(ACOS(2 * rand(1,Nopites)-1)) -  90;Pickedsphere = [sphereaz'phillel'];%将球体上的分布式点与HRTF DataSet进行比较挑选=零(1,npoints);d =零(尺寸(pickedsphere,1),尺寸(sourceposition,1));为了II = 1:尺寸(Pickedsphere,1)为了JJ = 1:大小(源头,1)%计算弧长d(ii,jj)= ACOS(......sind(Pickedsphere(II,2))* sind(源头(JJ,2))+......COSD(PICKEDSPHERE(II,2))* COSD(SourcePosition(JJ,2))*......COSD(PICKEDSPHERE(II,1) -  SourcePosition(JJ,1)));结尾[〜,idx] = sort(d(ii,:));%排序点挑选(ii)= IDX(1);%选择最接近的点结尾

创建Ambisonic解码器

指定所需的amisonic订单和所需的虚拟扬声器源位置作为输入audioExample.ambisonics.ambidecodemtrx.帮手功能。该函数返回Ambisonics解码器矩阵。

订单= 7;设备= sourceposition(pick,:)';dmtrx = audioExample.ambisonics.ambidecodemtrx(订单,设备);

创建HRTF过滤器

创建一个FIR滤波器数组,以根据虚拟扬声器的位置执行双耳HRTF过滤。

fir = cell(size(pickedsphere));为了II = 1:长度(PICK)FIR {II,1} = DSP.frequencyDomainFirfilter(HRTFDATA(:,选择(II),1)');FIR {II,2} = dsp.frequencydomainfirfilter(hrtfdata(:,pick(ii),2)');结尾

创建音频输入和输出对象

加载直升机声音的Ambisonic音频文件,并将其转换为48 kHz,以与HRTF数据集兼容。指定音频文件的Ambisonic格式。

创建以48 kHz采样的音频文件,以与HRTF数据集兼容。

lavescdfs = 48e3;[音频,fs] = audioread('heli_16ch_acn_sn3d.wav');AUDIO =重组(音频,所需的FS,FS);audiowrite('heli_16ch_acn_sn3d_48.wav',音频,uscedfs);

指定音频文件的Ambisonic格式。设置音频输入和音频输出对象。

格式='acn-sn3d';SamplesPerframe = 2048;filereader = dsp.audiofilereader('heli_16ch_acn_sn3d_48.wav'......'samplesperframe',样品普通话);devicewriter = audiodevicewriter('采样率',缺血);audiofiltered = zeros(Samplesperframe,尺寸(FIR,1),2);

流程音频

尽管〜ISDONE(FILEREADER)AudioAMBI = filereader();audiodeCoded = audioExample.ambisonics.ambidecode(AudioAmbi,DMTRX,格式);为了II = 1:大小(FIR,1)Audiofiltered(:,II,1)=步骤(FIR {II,1},audioDeCoded(:,II));% 剩下audiofiltered(:,ii,2)=步骤(FIR {II,2},audioDeCoded(:,II));% 对结尾Auditout = 10 *挤压(总和(audiofiltered,2));每只耳朵的%总和NumUnderRun = DeviceWriter(AudioOut);结尾%释放资源释放(Filereader)释放(DeviceWriter)

也可以看看

Ambisonic插件生成示例

参考

[1] Kronlachner,M。(2014)。植石录制改变的空间转化(硕士论文)。

[2] Noisternig,Markus。等等。“基于3D Ambisonic B的双耳声音再现系统。”在第24届AES国际会议上提出:MultiShannel Audio 2003年6月,艾伯塔省新现实。