通过融合从IMU接收到的数据来跟踪头部方向,然后通过头部相关传递函数(HRTF)控制声源到达的方向。
在典型的虚拟现实设置中,IMU传感器附加到用户的耳机或VR耳机,使得声源的感知位置与无关的视觉提示相对于头部运动。例如,如果声音被视为来自显示器的声音,即使用户将头部转向侧面,它也仍然这样。
Arduino Uno
Invensense微处理器- 9250
首先,将Invensense MPU-9250连接到Arduino板。有关详细信息,请参见利用惯性传感器融合和MPU-9250估计方向.
创建一个arduino
对象。
a = arduino;
创建Invensense MPU-9250传感器对象。
imu = mpu9250(一个);
创建并设置卡尔曼滤波器的采样率。
Fs = imu.SampleRate;imufilt = imufilter (“SampleRate”,fs);
当声音从空间点到耳朵的点行进时,您可以根据腔室时间和级别差异(ITD和ILD)本地化它。可以测量这些频率相关的ITD和ILD,并表示为任何给定的源极高和方位角的一对脉冲响应。ARI HRTF数据集包含1550对脉冲响应,这些脉冲响应超过360度超过360度,高度从-30到80度。您使用这些脉冲响应来过滤声源,以便从传感器方向确定的位置被感知。如果传感器连接到用户头上的装置,则尽管头部运动,声音被视为来自一个固定位置。
首先,加载HRTF数据集。
ARIDataset =负载('roidhrtf.mat');
然后,从DataSet获取相关的HRTF数据,并将其以有用的格式用于我们的处理。
hrtfdata = double(aridataset.hrtfdata);hrtfdata = erfute(hrtfdata,[2,3,1]);
获取相关的源位置。角度应与传感器的范围相同。将方位角从[0,360]转换为[-180,180]。
sourcePosition = ARIDataset.sourcePosition (:, [1, 2]);sourcePosition(:,1) = sourcePosition(:,1) - 180;
装上直升机的双音速录音。只保留第一个通道,它对应于一个全向记录。为与HRTF数据集兼容重新采样到48 kHz。
[直升机,originalSampleRate] = audioread ('heli_16ch_acn_sn3d.wav');heli = 12 * heli(:,1);只保留一个频道sampleRate = 48 e3;直升机=重新取样(直升机、sampleRate originalSampleRate);
将音频数据加载到submanceource.
对象。设置SamplesPerframe.
来0.1
秒。
sigsrc = dsp。submanceource.(heli,...“SamplesPerFrame”sampleRate / 10...'seriperencaction','循环重复');
创建一个audioDeviceWriter
采样率与音频信号相同。
devicewriter = audiodevicewriter(“SampleRate”, sampleRate);
创建一对FIR滤波器来执行双耳HRTF滤波。
冷杉=细胞(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秒。此循环执行以下步骤:
从IMU传感器读取数据。
融合IMU传感器数据来估计传感器的方向。可视化当前方向。
转换方向从四元数表示俯仰和偏航在欧拉角。
用interpolateHRTF
以获得所需位置上的一对hrtf。
从信号源读取一帧音频。
将hrtf应用于单声道录音并播放立体声信号。这是最好的体验使用耳机。
imuoverruns = 0;Audiounderruns = 0;audiofiltered = zeros(sigsrc.samplesperframe,2);Tic.尽管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 =(偏航、俯仰);%在所需位置获得一对HRTF。interpolatedIR =挤压(interpolateHRTF (hrtfData, sourcePosition desiredPosition));从文件中读取音频audioIn = sigsrc ();%申请HRTFS.audiofiltered(:,1)= FIR {1}(AudioIn,InterpolateIr(1,:));%左audioFiltered(:,2) = FIR{2}(audioIn, interpolatedIR(2,:))); / /这个函数是对的%对吧audioUnderruns = audioUnderruns + deviceWriter(挤压(audifilter));结束
释放资源,包括声音设备。
发布(sigsrc)发布(deviceWriter)清晰IMU.一个