主要内容

双声道的音频渲染使用头部跟踪

跟踪头方向通过收到的IMU融合数据,然后控制声源的方向到达通过应用head-related转移函数(电火花冲激)。

在一个典型的虚拟现实的设置中,乌兹别克斯坦伊斯兰运动传感器连接到用户的耳机或虚拟现实耳机这样认为声源的位置是相对于头部动作的视觉提示独立。例如,如果声音被认为是来自监视器,它仍然是这样,即使用户把他的头。

所需的硬件

  • Arduino Uno

  • Invensense微处理器- 9250

硬件连接

首先,Invensense微处理器- 9250连接到Arduino电路板。更多细节,请参阅估计方向使用惯性传感器融合和微处理器- 9250(传感器融合和跟踪工具箱)

创建传感器对象和IMU过滤器

创建一个arduino对象。

一个= arduino;

创建Invensense微处理器- 9250传感器对象。

imu = mpu9250(一个);

创建和设置卡尔曼滤波器的采样率。

Fs = imu.SampleRate;imufilt = imufilter (“SampleRate”Fs);

数据集加载ARI电火花冲激

当声音从一个点在空间传播你的耳朵,你可以基于本地化两耳(ITD和ILD)时间和水平差异。这些频率相关ITD ILD的可以测量和脉冲响应表示为一对对于任何给定的源仰角和方位角。ARI电火花冲激数据集包含1550双脉冲响应跨越另超过360度,海拔从-30年到80度。你用这些脉冲响应滤波器声源,被认为是来自位置取决于传感器的姿态。如果传感器连接到一个设备在用户的头,声音被认为是来自于一个固定的地方尽管头部动作。

首先,数据集加载电火花冲激。

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

然后,得到相关的电火花冲激数据集的数据,把它放进一个有用的格式给我们处理。

hrtfData =双(ARIDataset.hrtfData);hrtfData =排列(hrtfData [2、3、1]);

得到相关的源位置。角度应该在相同的范围传感器。转换的方位角》[0360][-180180]。

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

负载单声道的记录

加载一个ambisonic直升机的记录。只保留第一个频道,这对应于一个全方位记录。重新取样48 kHz的兼容性与电火花冲激数据集。

[直升机,originalSampleRate] = audioread (“Heli_16ch_ACN_SN3D.wav”);直升机= 12 *直升机(:1);%保持只有一个通道sampleRate = 48 e3;直升机=重新取样(直升机、sampleRate originalSampleRate);

音频数据加载到一个SignalSource对象。设置SamplesPerFrame0.1秒。

sigsrc = dsp.SignalSource(直升机,“SamplesPerFrame”sampleRate / 10“SignalEndAction”,循环重复的);

设置音频设备

创建一个audioDeviceWriter相同的音频信号的采样率。

deviceWriter = audioDeviceWriter (“SampleRate”,sampleRate);

为电火花冲激创建FIR滤波器系数

创建一对FIR滤波器来执行双耳电火花冲激过滤。

冷杉=细胞(1、2);冷杉{1}= dsp.FIRFilter (“NumeratorSource”,输入端口的);冷杉{2}= dsp.FIRFilter (“NumeratorSource”,输入端口的);

初始化定位查看器

创建一个对象来执行实时可视化IMU的方向传感器。调用IMU过滤一次,显示初始取向。

orientationScope = HelperOrientationViewer;data =阅读(imu);qimu = imufilt (data.Acceleration data.AngularVelocity);orientationScope (qimu);

音频处理循环

执行处理循环,持续30秒。这个循环执行以下步骤:

  1. 读取数据从乌兹别克斯坦伊斯兰运动传感器。

  2. IMU传感器数据融合估计的方向传感器。可视化当前取向。

  3. 四元数表示的方向转换为欧拉角的俯仰和偏航。

  4. 使用interpolateHRTF获得一双头在所需的位置。

  5. 读取一帧信号的音频源。

  6. 应用头mono录制和播放音响信号。这是最好的经验使用耳机。

imuOverruns = 0;audioUnderruns = 0;audioFiltered = 0 (sigsrc.SamplesPerFrame, 2);抽搐toc < 30%从IMU读取传感器。(数据溢出)=阅读(imu);如果泛滥> 0 imuOverruns = imuOverruns +溢出;结束% IMU传感器数据融合估计的方向传感器。qimu = imufilt (data.Acceleration data.AngularVelocity);orientationScope (qimu);%将方向从四元数表示在欧拉角俯仰和偏航。ypr = eulerd (qimu,“zyx股票”,“帧”);偏航= ypr(结束,1);距= ypr (, 2);desiredPosition =(偏航、俯仰);%获得一双头在所需的位置。interpolatedIR =挤压(interpolateHRTF (hrtfData, sourcePosition desiredPosition));%从文件读取音频audioIn = sigsrc ();%应用头audioFiltered(: 1) =冷杉{1}(audioIn, interpolatedIR (1:));%左audioFiltered(:, 2) =冷杉{2}(audioIn, interpolatedIR (2:));%对吧audioUnderruns = audioUnderruns + deviceWriter(挤压(audioFiltered));结束

清理

释放资源,包括声音设备。

发布(sigsrc)发布(deviceWriter)清晰imu一个