主要内容

双声双耳解码

这个例子展示了如何使用虚拟扬声器将双声音频解码为双声音频。虚拟扬声器是放置在球体表面的声源,而听者位于球体的中心。每个虚拟扬声器都有一对与之相关的头部相关传递函数(HRTF):一个用于左耳,一个用于右耳。使用虚拟扬声器位置和双声子顺序来计算双声子解码器矩阵。解码器的输出由对应于虚拟扬声器位置的hrtf滤波。来自左侧hrtf的信号被汇总并馈送到左耳。来自右侧hrtf的信号被汇总并输入到右耳。这里显示了音频信号流的框图。

加载ARI HRTF数据集

aridatset = load(“ReferenceHRTF.mat”);

获得所需维度的HRTF数据:[numofsourcemmeasurements x 2 x LengthOfSamples]

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

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

奥地利科学院声学研究所的HRTF数据库是根据创作共用署名相似共享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,nPoints)-1)))-90;pickkedsphere = [sphereAZ' sphereEL'];将球体上分布的点与HRTF数据集中的点进行比较pick = 0 (1, nPoints);d = 0 (size(pickedSphere,1), size(sourcePosition,1));ii = 1:size(pickkedsphere,1)jj = 1:size(sourcePosition,1)计算弧长D (ii,jj) = acos(...信德(pickedSphere(2, 2)) *信德(sourcePosition (jj, 2)) +...cosd (pickedSphere (2, 2)) * cosd (sourcePosition (jj, 2)) *...cosd(pickedSphere(ii,1) - sourcePosition(jj,1)));结束[~,Idx] = sort(d(ii,:));%排序点pick(ii) = Idx(1);选择最近的点结束

创建双光子解码器

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

Order = 7;devices = sourcePosition(pick,:)';DMTRX = audioexample.ambisonics。ambidecodemtrx(顺序、设备);

创建HRTF过滤器

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

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

创建音频输入和输出对象

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

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

desiredFs = 48e3;[音频,fs] = audioread(“Heli_16ch_ACN_SN3D.wav”);音频= resample(音频,desiredFs,fs);audiowrite (“Heli_16ch_ACN_SN3D_48.wav”、音频、desiredFs);

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

格式=“acn-sn3d”;samplesPerFrame = 2048;fileReader = dsp。AudioFileReader (“Heli_16ch_ACN_SN3D_48.wav”...“SamplesPerFrame”, samplesPerFrame);deviceWriter = audioDeviceWriter(“SampleRate”, desiredFs);audioFiltered =零(samplesPerFrame,大小(FIR,1),2);

处理音频

~isDone(fileReader) audioAmbi = fileReader();audioDecoded = audioexample.ambisonics。ambidecode(audioAmbi, dmtrx, format);ii = 1:size(FIR,1) audioFiltered(:,ii,1) = step(FIR{ii,1}, audioDecoded(:,ii));%左audioFiltered(:,ii,2) = step(FIR{ii,2}, audioDecoded(:,ii));%对吧结束audioOut = 10*squeeze(sum(audioFiltered,2));每只耳朵的总和numUnderrun = deviceWriter(audioOut);结束%释放资源发布(fileReader)发布(deviceWriter)

另请参阅

Ambisonic插件生成示例

参考文献

[1]克朗拉克纳,M.(2014)。双音阶录音的空间变换(硕士论文)。

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