主要内容

Ambisonic双耳解码

此示例显示如何使用虚拟扬声器将双音音频解码为双耳音频。虚拟扬声器是位于球体表面的声源,侦听器位于球体的中心。每个虚拟扬声器都有一对与头部相关的传递函数(HRTF)与之相关的:一个用于左耳,一个用于右耳。虚拟扬声器位置以及ambisonic顺序用于计算ambisonic解码器矩阵。解码器的输出由对应于虚拟扬声器位置的HRTF进行过滤。来自左HRTF的信号被汇总并馈送到to左耳。来自右HRTF的信号被汇总并馈送至右耳。此处显示了音频信号流的框图。

加载ARI HRTF数据集

数据集=加载(“ReferenceHRTF.mat”);

获取[NumofSourceMeasures x 2 x LengthOfSamples]所需维度的HRTF数据

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

本例中使用的ARI HRTF数据库是基于声学研究所的工作。HRTF数据和源位置ReferenceHRTF.mat来自ARI NH2科目。

奥地利科学院声学研究所(Acoustics Research Institute,Austrian Academy of Sciences)的HRTF数据库根据Creative Commons 3.0 Unported许可证获得许可:https://creativecommons.org/licenses/by-sa/3.0/.

从ARI HRTF数据集中选择点

现在已经加载了HRTF数据集,请确定为虚拟扬声器选择哪些点。这个例子选取了分布在球体表面的随机点,并选择了HRTF数据集中最接近这些点的点。

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

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

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

%创建具有点分布的球体nPoints=24;%要拾取的点数rng (0);%种子随机数发生器nPoints sphereAZ = 360 *兰德(1);sphereEL = rad2deg(治疗(2 *兰德(nPoints) 1)) -90;pickedSphere = [sphereAZ' sphereEL'];%将球体上的分布式点与HRTF数据集中的点进行比较pick = 0 (1, nPoints);d = 0 (size(pickkedsphere,1), size(sourcePosition,1));对于2 = 1:尺寸(pickedSphere, 1)对于jj = 1:尺寸(sourcePosition, 1)%计算弧长d(ii,jj)=acos(...sind(pickedSphere(ii,2))*sind(sourcePosition(jj,2))+...cosd (pickedSphere (2, 2)) * cosd (sourcePosition (jj, 2)) *...cosd(pickedSphere(ii,1)-源位置(jj,1));终止[~,Idx]=排序(d(ii,:);%点排序拾取(ii)=Idx(1);选择最近的点终止

创建Ambisonic译码器

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

顺序=7;设备=源位置(拾取,:)';dmtrx=audioexample.ambisonics.ambidecodemtrx(订单,设备);

创建电火花冲激过滤器

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

冷杉=细胞(大小(pickedSphere));对于ii=1:length(pick)FIR{ii,1}=dsp.FrequencyDomainFIRFilter(hrtfData(:,pick(ii),1)');FIR{ii,2}=dsp.FrequencyDomainFIRFilter(hrtfData(:,pick(ii),2)');终止

创建音频输入和输出对象

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

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

desiredFs = 48 e3;(音频、fs) = audioread (“Heli_16ch_ACN_SN3D.wav”);音频=重新取样(音频、desiredFs fs);audiowrite (“Heli_16ch_ACN_SN3D_48.wav”、音频、desiredFs);

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

格式=“acn-sn3d”; samplesPerFrame=2048;fileReader=dsp.AudioFileReader(“Heli_16ch_ACN_SN3D_48.wav”,...“样品性能框架”, samplesPerFrame);deviceWriter = audioDeviceWriter (“采样器”,所需文件);音频过滤=零(采样性能帧,大小(FIR,1),2);

处理音频

~isDone(fileReader) audioAmbi = fileReader();audioDecoded = audioexample.ambisonics。ambidecode (audioAmbi dmtrx格式);对于ii = 1:size(FIR,1) audiofilded (:,ii) = step(FIR{ii,1}, audioDecoded(:,ii));%左音频过滤(:,ii,2)=步骤(FIR{ii,2},音频解码(:,ii));%对终止audioOut=10*压缩(总和(音频过滤,2));%两耳合计numUnderrun=deviceWriter(audioOut);终止%释放资源发布(文件阅读器)发布(deviceWriter)

另见

Ambisonic插件生成示例

参考文献

[1] Kronlachner,M.(2014)。环境声波记录变化的空间变换(硕士论文)。

[2] Noisternig,马库斯。et al。"基于三维双耳声学的声音再现系统"发表于第24届AES国际会议:多通道音频,新现实,阿尔伯塔,2003年6月。