主要内容

双音双耳解码

此示例显示如何使用虚拟扬声器将双音音频解码为双耳音频。虚拟扬声器是位于球体表面的声源,侦听器位于球体的中心。每个虚拟扬声器都有一对与头部相关的传递函数(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.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);%种子随机数发生器sphereAZ=360*兰德(1,n点);SphereEel=rad2deg(acos(2*兰德(1,n点)-1))-90;pickedSphere=[sphereAZ'SphereEel'];%将球体上的分布式点与HRTF数据集中的点进行比较拾取=零(1,nPoints);d=零(大小(pickedSphere,1),大小(sourcePosition,1));对于ii=1:尺寸(拾取球体,1)对于jj=1:大小(sourcePosition,1)%计算弧长d(ii,jj)=acos(...sind(pickedSphere(ii,2))*sind(sourcePosition(jj,2))+...cosd(pickedSphere(ii,2))*cosd(sourcePosition(jj,2))*...cosd(pickedSphere(ii,1)-源位置(jj,1));终止[~,Idx]=排序(d(ii,:);%排序点拾取(ii)=Idx(1);%选择最近的点终止

创建双音解码器

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

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

创建HRTF过滤器

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

FIR=单元(大小(选取的球体));对于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=48e3;[audio,fs]=audioread(“Heli_16ch_ACN_SN3D.wav”);音频=重新采样(音频、所需fs、fs);音频写入(“Heli_16ch_ACN_SN3D_48.wav”,音频,所需文件);

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

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

处理音频

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

另见

Ambisonic插件生成示例

工具书类

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

[2] Noiseternig,Markus。等,《基于3D双声道的双耳声音再现系统》,发表于第24届AES国际会议:多声道音频,《新现实》,艾伯塔省,2003年6月。