主要内容

Ambisonic双耳解码

这个例子展示了如何使用虚拟ambisonic音频解码成双声道的音频扬声器。一个虚拟扬声器声源定位在一个球体的表面,与侦听器位于球体的中心。每个虚拟扬声器有一对Head-Related转移函数(电火花冲激)与之关联的:一个用于左耳和右耳。虚拟扬声器位置随着ambisonic订单用于计算ambisonic译码矩阵。译码器的输出过滤头对应的虚拟扬声器的位置。信号从左边头和美联储的左耳总结在一起。信号从右侧头一起总结和美联储向右耳朵。音频信号流的框图所示。

数据集加载ARI电火花冲激

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

得到的电火花冲激数据所需的维度:[NumOfSourceMeasurements x 2 x LengthOfSamples]

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

ARI电火花冲激数据库中使用这个示例是基于声学研究所的工作。电火花冲激数据和源位置ReferenceHRTF.mat来自阿里NH2的主题。

声学研究所的电火花冲激数据库,奥地利科学院是在Creative Commons许可授权3.0 Unported许可证:https://creativecommons.org/licenses/by-sa/3.0/

从阿里电火花冲激数据集选择点

现在加载电火花冲激数据集,确定哪些点虚拟扬声器。本例中选择随机点分布在一个球体的表面并选择电火花冲激的点数据集最接近点。

  1. 选择随机分球形分布

  2. 球从电火花冲激点数据集进行比较

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

%创建一个球体,点的分布nPoints = 24;%点选择的数量rng (0);%随机数生成器的种子nPoints sphereAZ = 360 *兰德(1);sphereEL = rad2deg(治疗(2 *兰德(nPoints) 1)) -90;pickedSphere = [sphereAZ ' sphereEL '];%比较分布式点球面上的点数据集从电火花冲激选择= 0 (1、nPoints);d = 0(大小(pickedSphere, 1),大小(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译码器

指定一个期望ambisonic秩序和期望虚拟扬声器位置作为输入的来源audioexample.ambisonics.ambidecodemtrxhelper函数。该函数返回一个ambisonics译码矩阵。

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

创建电火花冲激过滤器

创建一个数组的FIR滤波器进行双耳电火花冲激过滤基于虚拟扬声器的位置。

冷杉=细胞(大小(pickedSphere));2 = 1:长度(选择)冷杉{ii, 1} = dsp.FrequencyDomainFIRFilter (hrtfData (:, (ii), 1) ');冷杉{ii, 2} = dsp.FrequencyDomainFIRFilter (hrtfData (:, (ii), 2) ');结束

创建音频输入和输出对象

加载ambisonic直升机声音的音频文件,并将其转换为兼容48 kHz电火花冲激数据集。指定ambisonic格式的音频文件。

创建一个音频文件在48千赫采样与电火花冲激数据集的兼容性。

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”,samplesPerFrame);deviceWriter = audioDeviceWriter (“SampleRate”,desiredFs);audioFiltered = 0 (samplesPerFrame、大小(杉木、1),2);

处理音频

~结束(fileReader) audioAmbi = fileReader ();audioDecoded = audioexample.ambisonics。ambidecode (audioAmbi dmtrx格式);2 = 1:尺寸(杉木、1)audioFiltered(二世,:1)=步骤(冷杉{ii, 1}, audioDecoded(:,(二));%左audioFiltered(:,二,2)=步骤(冷杉{ii, 2}, audioDecoded(:,(二));%对吧结束audioOut = 10 *挤压(sum (audioFiltered, 2));%和在每个耳朵numUnderrun = deviceWriter (audioOut);结束%释放资源发布(fileReader)发布(deviceWriter)

引用

[1]Kronlachner, m (2014)。空间转换的变更Ambisonic录音(硕士论文)。

[2]Noisternig,马库斯。et al。“基于3 d Ambisonic双耳声重发系统”。Presented at 24th AES International Conference: Multichannel Audio, The New Reality, Alberta, June 2003.

另请参阅