interpolateHRTF
三维头部相关传递函数(HRTF)插值
语法
描述
返回所需位置的插值头相关传递函数(HRTF)。interpolatedHRTF
= interpolateHRTF (电火花冲激
,sourcePositions
,desiredSourcePositions
)
使用一个或多个选项指定选项interpolatedHRTF
= interpolateHRTF (___,名称,值
)名称,值
对参数。
例子
在耳机上渲染3d音频
通过头部相关传递函数(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);
在音频流循环中:
在一帧音频数据中读取。
分别通过左、右HRIR滤波器输入立体声音频数据。
连接左右通道和写音频到您的输出设备。
而~isDone(fileReader) audioIn = fileReader();leftChannel = leftFilter(audioIn(:,1));rightChannel = rightFilter(audioIn(:,2));deviceWriter ([leftChannel rightChannel]);结束
作为最佳实践,在完成时释放System对象。
发布(deviceWriter)发布(fileReader)
使用HRIR滤波建模移动源
创建与头部相关的脉冲响应数组,对应于所需的源位置。过滤单声道输入来模拟移动源。
加载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);
在音频流循环中:
在一帧音频数据中读取。
通过左、右HRIR滤波器输入音频数据。
连接左右通道和写音频到您的输出设备。如果您有一个立体声输出硬件,如耳机,您可以听到源的位置随着时间的推移而变化。
通过更新滤波器系数,在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值
N2 -米数组
在源位置测量的HRTF值,用a表示N2 -米数组中。
N——已知HRTF对的数量
米——每个已知HRTF中的样本数量
如果你指定电火花冲激
对于实数,函数假设输入代表一个脉冲响应,并且米对应于脉冲响应的长度。如果你指定电火花冲激
对于复数,函数假设输入代表传递函数,并且米对应于频率响应中的箱的数量。的输出interpolateHRTF
函数具有与输入相同的复杂性和解释。
数据类型:单
|双
复数支持:金宝app是的
sourcePositions
- - - - - -与测量的HRTF值对应的源位置
N2矩阵
HRTF值对应的源位置,用a表示N2矩阵。N为已知HRTF对的数量。这两列分别以度数表示源的方位角和仰角。
方位角必须在[−180,360]范围内。您可以使用−180 ~ 180或0 ~ 360约定。
标高必须在[- 90,180]的范围内。您可以使用−90 ~ 90或0 ~ 180约定。
数据类型:单
|双
desiredSourcePositions
- - - - - -HRTF插值所需的源位置
P2矩阵
HRTF插值所需的源位置,指定为P2矩阵。P是所需源位置的数目。这些列分别对应所需的源方位角和仰角的度数。
方位角必须在[−180,360]范围内。您可以使用−180 ~ 180或0 ~ 360约定。
标高必须在[- 90,180]的范围内。您可以使用−90 ~ 90或0 ~ 180约定。
数据类型:单
|双
名称-值对实参
指定逗号分隔的可选对名称,值
参数。的名字
参数名称和价值
对应的值。的名字
必须出现在引号内。可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家
.
“算法”、“VBAP”
输出参数
interpolatedHRTF
-插值的HRTF
P2 -米
插值的HRTF,返回为P2 -米数组中。
P控件中的行数指定所需源位置的数目
desiredSourcePositions
输入参数。米——每个已知HRTF中的样本数量,由
电火花冲激
输入参数。
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中介绍
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。