文档

interpolateHRTF

三维头部相关传递函数(HRTF)插值

描述

例子

interpolatedHRTF= interpolateHRTF (电火花冲激sourcePositionsdesiredSourcePositions返回所需位置的插值头相关传递函数(HRTF)。

例子

interpolatedHRTF= interpolateHRTF (___名称,值使用一个或多个选项指定选项名称,值对参数。

例子

全部折叠

通过头部相关传递函数(HRTF)对声音文件进行过滤,修改其三维音频图像。通过指定所需的方位角和仰角设置声源的位置。

负载“ReferenceHRTF.mat”hrtfDatasourcePositionhrtfData = permute(double(hrtfData),[2,3,1]);sourcePosition = sourcePosition(:,[1,2]);

利用VBAP算法在目标源位置计算头部相关脉冲响应(HRIR)。分离输出,interpolatedIR左右耳的脉冲响应。

desiredAz = 110;desiredEl = -45;desiredPosition = [desiredAz desiredEl];插值dir =插值hrtf (hrtfData,sourcePosition,desiredPosition,...“算法”“VBAP”);leftIR = squeeze(interpolatedIR(:,1,:))';righttir = squeeze(interpolatedIR(:,2,:))';

创建一个dsp。AudioFileReader对象在文件中逐帧读取。创建一个audioDeviceWriter对象来逐帧向声卡播放音频。创建两个dsp。FIRFilter对象,并使用内插脉冲响应的头部相关传递函数指定滤波器系数。

fileReader = dsp。AudioFileReader (“RockDrums-44p1-stereo-11secs.mp3”);deviceWriter = audioDeviceWriter(“SampleRate”, fileReader.SampleRate);leftFilter = dsp。FIRFilter (“分子”, leftIR);rightFilter = dsp。FIRFilter (“分子”, rightIR);

在音频流循环中:

  1. 在一帧音频数据中读取。

  2. 分别通过左、右HRIR滤波器输入立体声音频数据。

  3. 连接左右通道和写音频到您的输出设备。

~isDone(fileReader) audioIn = fileReader();leftChannel = leftFilter(audioIn(:,1));rightChannel = rightFilter(audioIn(:,2));deviceWriter ([leftChannel rightChannel]);结束

作为最佳实践,在完成时释放System对象。

发布(deviceWriter)发布(fileReader)

创建与头部相关的脉冲响应数组,对应于所需的源位置。过滤单声道输入来模拟移动源。

加载ARI HRTF数据集。把hrtfData键入double,并将其重塑为所需的维度:(源位置的数量)-by-2-by-(HRTF样本的数量)。的前两列sourcePosition矩阵,它与源的方位角和仰角的度数相对应。

负载“ReferenceHRTF.mat”hrtfDatasourcePositionhrtfData = permute(double(hrtfData),[2,3,1]);sourcePosition = sourcePosition(:,[1,2]);

方法指定所需的源位置,然后计算这些位置上的HRTFinterpolateHRTF函数。分离输出,interpolatedIR左右耳的脉冲响应。

desiredAz = [-120;-60;0;60;120;0;desiredEl = [-90;90;45;0;-45;0;desiredPosition = [desiredAz desiredEl];interpolatedIR = interpolateHRTF(hrtfData,sourcePosition,desiredPosition);leftIR = squeeze(interpolatedIR(:,1,:));righttir = squeeze(interpolatedIR(:,2,:));

创建一个dsp。AudioFileReader对象在文件中逐帧读取。创建一个audioDeviceWriter对象来逐帧向声卡播放音频。创建两个dsp。FIRFilter对象与NumeratorSource设置为输入端口.设置NumeratorSource输入端口允许您在流处理时修改过滤器系数。

leftFilter = dsp。FIRFilter (“NumeratorSource”输入端口的);rightFilter = dsp。FIRFilter (“NumeratorSource”输入端口的);fileReader = dsp。AudioFileReader (“Counting-16-44p1-mono-15secs.wav”);deviceWriter = audioDeviceWriter(“SampleRate”, fileReader.SampleRate);

在音频流循环中:

  1. 在一帧音频数据中读取。

  2. 通过左、右HRIR滤波器输入音频数据。

  3. 连接左右通道和写音频到您的输出设备。如果您有一个立体声输出硬件,如耳机,您可以听到源的位置随着时间的推移而变化。

  4. 通过更新滤波器系数,在2秒间隔内修改所需的源位置。

durationPerPosition = 2;samplesPerPosition = durationPerPosition*fileReader.SampleRate;samplesPerPosition = samplesPerPosition - rem(samplesPerPosition,fileReader.SamplesPerFrame);sourcePositionIndex = 1;samplesRead = 0;~isDone(fileReader) audioIn = fileReader();samplesRead = samplesRead + fileReader.SamplesPerFrame;leftChannel = leftFilter(audioIn,leftIR(sourcePositionIndex,:));rightChannel = rightFilter(audioIn, righttir (sourcePositionIndex,:));deviceWriter ([leftChannel rightChannel]);如果mod(samplesRead,samplesPerPosition) = 0 sourcePositionIndex = sourcePositionIndex + 1;结束结束

作为最佳实践,在完成时释放System对象。

发布(deviceWriter)发布(fileReader)

输入参数

全部折叠

在源位置测量的HRTF值,用a表示N2 -数组中。

  • N——已知HRTF对的数量

  • ——每个已知HRTF中的样本数量

如果你指定电火花冲激对于实数,函数假设输入代表一个脉冲响应,并且对应于脉冲响应的长度。如果你指定电火花冲激对于复数,函数假设输入代表传递函数,并且对应于频率响应中的箱的数量。的输出interpolateHRTF函数具有与输入相同的复杂性和解释。

数据类型:|
复数支持:金宝app是的

HRTF值对应的源位置,用a表示N2矩阵。N为已知HRTF对的数量。这两列分别以度数表示源的方位角和仰角。

方位角必须在[−180,360]范围内。您可以使用−180 ~ 180或0 ~ 360约定。

标高必须在[- 90,180]的范围内。您可以使用−90 ~ 90或0 ~ 180约定。

数据类型:|

HRTF插值所需的源位置,指定为P2矩阵。P是所需源位置的数目。这些列分别对应所需的源方位角和仰角的度数。

方位角必须在[−180,360]范围内。您可以使用−180 ~ 180或0 ~ 360约定。

标高必须在[- 90,180]的范围内。您可以使用−90 ~ 90或0 ~ 180约定。

数据类型:|

名称-值对实参

指定逗号分隔的可选对名称,值参数。的名字参数名称和价值对应的值。的名字必须出现在引号内。可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:“算法”、“VBAP”

插值算法,指定为“双线性”“VBAP”

  • 双线性——三维双线性插值,具体由[1]

  • VBAP——矢量基幅平移插值,如[2]

数据类型:字符|字符串

输出参数

全部折叠

插值的HRTF,返回为P2 -数组中。

interpolatedHRTF具有与输入相同的复杂度和解释。如果你指定输入,电火花冲激,对于实数,函数假设输入代表一个脉冲响应。如果用复数指定输入,则该函数假定输入代表传递函数。

数据类型:|
复数支持:金宝app是的

参考文献

[1] F.P. Freeland, L.W.P. Biscainho和P.S.R. Diniz,“头部相关传递函数(HRTFS)插值:一种多源方法”。2004第十二届欧洲信号处理会议.维也纳,2004,第1761-1764页。

[2]普尔基,维尔。基于矢量基幅平移的虚拟声源定位音频工程学会杂志.45卷。。第6期,456-466页。

扩展功能

C/ c++代码生成
使用MATLAB®Coder™生成C和c++代码。

在R2018b中介绍