基于HRTF的3D虚拟音效合成系统
项目简介
本项目是一个基于MATLAB开发的3D双耳听觉合成系统。该系统利用头相关传输函数(HRTF)技术,通过数字信号处理手段模拟声波从空间任意点传输到人耳的物理过程。系统能够动态地处理单声道音频,根据预设的3D空间轨迹,合成出具有真实空间感、方位感和距离感的立体声(双耳)音频文件。
该代码设计为独立运行模式,内置了HRTF数据模拟生成器和测试音频生成器,无需外部数据文件即可直接演示3D音效合成效果。
功能特性
- HRTF数据模拟生成:内置基于球头模型(Spherical Head Model)的HRTF生成算法,可自动计算包含ITD(双耳时间差)、ILD(双耳电平差)及简单的频谱陷波特征的脉冲响应。
- 动态轨迹合成:支持声源在3D空间(方位角、仰角、距离)中的连续运动模拟。
- 高保真空间插值:采用双线性插值算法计算非采样点的HRTF系数,确保声源移动时的声像平滑过渡。
- 物理距离模拟:实现了基于距离幅度的$1/r$衰减模型,以及基于距离的空气吸收效应(低通滤波)。
- 分帧叠加处理:使用Overlap-Add(重叠相加)算法进行分帧卷积,支持长音频流处理。
- 可视化分析:提供声源轨迹、极坐标方位及输入输出波形对比的直观展示。
系统要求
- MATLAB R2016b 或更高版本
- Signal Processing Toolbox(用于信号重采样、滤波及卷积操作)
使用方法
- 确保MATLAB当前工作目录为脚本所在文件夹。
- 直接运行主函数
main。 - 系统将按以下流程执行:
* 检查是否存在
test_mono.wav,若不存在则自动生成一段频率变化的警报声作为测试源。
* 生成模拟的HRTF数据库。
* 计算3D运动轨迹并进行逐帧渲染。
* 弹出进度条显示渲染进度。
* 渲染完成后,绘制分析图表。
* 在当前目录下生成合成后的音频文件
output_binaural_3d.wav。
代码实现详解
本项目核心逻辑封装在 main.m 文件中,主要包含以下关键模块和算法:
1. 音频源与HRTF数据准备
- 音频输入:代码具备容错机制,优先尝试读取本地
test_mono.wav 文件;如果文件不存在,则利用 chirp 函数生成一段持续5秒、频率由400Hz扫至1000Hz的单声道模拟信号,并施加包络使其听感平滑。 - HRTF数据库模拟 (
loadOrSimulateHRTF 子函数):
* 代码并未依赖外部CIPIC库文件,而是通过算法实时生成模拟数据。
*
ITD模拟:使用Woodworth公式近似计算声波到达左右耳的时间差,并将其转换为采样点延迟。
*
ILD模拟:根据声源方位角,利用正弦函数模拟简单的头影效应(Head Shadow),调整左右耳幅度。
*
频谱特征:引入
iirnotch 陷波滤波器,根据仰角变化改变中心频率,模拟耳廓产生的频谱线索(Spectral Cues)。
* 生成的数据结构包含方位角网格、仰角网格及对应的左右耳脉冲响应(HRIR)。
2. 轨迹定义
系统在球坐标系下定义了声源的运动路径:
- 方位角 (Azimuth):在 -80° 到 +80° 之间进行正弦摆动,模拟声源在听者前方左右往复运动。
- 仰角 (Elevation):随时间从 0° 线性上升至 45°。
- 距离 (Distance):在 1米 到 5米 之间变化,模拟声源的靠近与远离。
3. 核心渲染引擎 (Overlap-Add)
这是系统的主循环部分,负责将单声道信号转换为双耳信号:
- 分帧处理:将音频切分为固定长度(1024采样点)的帧。
- 空间插值 (
interpolateHRTF 子函数):
* 针对每一帧当前的方位角和仰角,在HRTF数据库网格中寻找相邻的四个采样点。
* 应用
双线性插值技术,计算出精确对应当前位置的左右耳HRIR(头相关脉冲响应)。
*
幅度衰减:应用反比定律($1/d$),距离越远音量越小。
*
空气吸收:当距离超过2米时,应用一个简化的低通滤波器(一阶IIR),模拟高频成分随距离增加而被空气吸收的物理现象。
- 卷积运算:使用时域
conv 函数将当前帧音频与插值后的HRIR进行卷积。 - 重叠相加:采用标准的Overlap-Add方法解决卷积带来的尾部拖尾问题,将处理后的数据累加到输出缓冲区的正确位置,防止帧之间出现咔嗒声或断裂。
4. 结果输出与可视化
- 幅度归一化:在保存前检测输出信号的最大幅值,进行归一化处理(缩放至0.99),防止音频削波失真。
- 分析图表 (
visualizeSystem 子函数):
*
3D轨迹图:展示声源在空间的立体运动路径。
*
极坐标图:展示方位角与距离的俯视关系。
*
波形对比图:在同一时间轴上绘制原始单声道信号与合成后的左右耳信号(人为添加偏移以便观察),直观展示双耳信号的时域差异。
输出文件
output_binaural_3d.wav: 合成后的立体声波形文件,采样率为44100Hz。