主要内容

Ambisonic双耳解码

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

加载ARI HRTF数据集

ARIDataset =负载(“ReferenceHRTF.mat”);

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

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

本例中使用的ARI HRTF数据库是基于声学研究所的工作。HRTF数据和源位置ReferenceHRTF.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);%种子随机数生成器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) =位于...信德(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.ambidecodemtrxhelper函数。该函数返回一个双谐音解码器矩阵。

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

创建电火花冲激过滤器

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

冷杉=细胞(大小(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数据集。

desiredFs = 48 e3;(音频、fs) = audioread (“Heli_16ch_ACN_SN3D.wav”);音频=重新取样(音频、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 = 0 (samplesPerFrame、大小(杉木、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));%左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,马库斯。et al。"基于三维双耳声学的声音再现系统"发表于第24届AES国际会议:多通道音频,新现实,阿尔伯塔,2003年6月。