主要内容

Ambisonic Binaural Degoding.

这个例子展示了如何使用虚拟扬声器将双耳音频解码成双耳音频。虚拟扬声器是一个位于球体表面的声源,而听筒位于球体的中心。每个虚拟扬声器都有一对与头部相关的传递函数(HRTF):一个用于左耳,一个用于右耳。利用虚拟扬声器位置和双声阶来计算双声解码器矩阵。解码器的输出由与虚拟扬声器位置相对应的hrtf进行滤波。从左侧hrtf发出的信号被汇总在一起,然后喂给左耳。从右侧hrtf发出的信号被汇总在一起,然后送入右耳。这里显示了音频信号流的框图。

加载ARI HRTF数据集

ARIDataset =负载('roidhrtf.mat');

获取HRTF数据所需的尺寸:[nummofsourcemeasements x 2 x LengthOfSamples]

hrtfData = ARIDataset.hrtfData;sourcePosition = ARIDataset.sourcePosition (:, [1, 2]);

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

奥地利科学院声学研究所的HRTF数据库是在Creative Commons Attribution-ShareAlike 3.0非移植许可下授权的:https://creativecommons.org/licenses/by-sa/3.0/

从ARI HRTF数据集选择点

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

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

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

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

创建一个带有点分布的球体nPoints = 24;%点数选择RNG(0);%种子随机数生成器Sphereaz = 360 * rand(1,npoints);Sphereel = Rad2deg(ACOS(2 * rand(1,Nopites)-1)) -  90;Pickedsphere = [sphereaz'phillel'];%比较球上的分布点和HRTF数据集上的点pick = 0 (1, nPoints);d = 0 (size(pickkedsphere,1), size(sourcePosition,1));II = 1:尺寸(Pickedsphere,1)JJ = 1:大小(源头,1)计算弧长d (ii, jj) =位于...信德(pickedSphere(2, 2)) *信德(sourcePosition (jj, 2)) +...cosd (pickedSphere (2, 2)) * cosd (sourcePosition (jj, 2)) *...cosd (pickedSphere(2, 1)——sourcePosition (jj, 1)));结束[~, Idx] = (d (ii):));%排序点选择(2)= Idx (1);%选择最接近的点结束

创建Ambisonic解码器

指定所需的双音顺序和所需的虚拟扬声器源位置作为输入audioExample.ambisonics.ambidecodemtrx.helper函数。该函数返回一个双谐音解码器矩阵。

订单= 7;:设备= sourcePosition(选择)';dmtrx = audioexample.ambisonics。ambidecodemtrx(顺序、设备);

创建HRTF过滤器

创建FIR滤波器阵列,根据虚拟扬声器的位置执行双耳HRTF滤波。

fir = cell(size(pickedsphere));ii = 1:length(pick) FIR{ii,1} = dsp.FrequencyDomainFIRFilter(hrtfData(:,pick(ii),1)');冷杉{ii, 2} = dsp.FrequencyDomainFIRFilter (hrtfData (:, (ii), 2) ');结束

创建音频输入和输出对象

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

创建一个音频文件采样在48 kHz,以兼容HRTF数据集。

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

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

格式='acn-sn3d';samplesPerFrame = 2048;fileReader = dsp。AudioFileReader (“Heli_16ch_ACN_SN3D_48.wav”...“SamplesPerFrame”,样品普通话);devicewriter = audiodevicewriter(“SampleRate”, desiredFs);audioFiltered = 0 (samplesPerFrame、大小(杉木、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) = step(FIR{ii,2}, audioDecoded(:,ii));%对吧结束audioOut = 10 *挤压(sum (audioFiltered, 2));每只耳朵的总和numUnderrun = deviceWriter (audioOut);结束%释放资源发布(fileReader)发布(deviceWriter)

另请参阅

Ambisonic插件生成示例

参考

Kronlachner, M.(2014)。空间转换的双声录音的改变(硕士论文)。

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