基于近场二维宽带MUSIC算法的声源定位系统
项目介绍
本项目是一个基于MATLAB开发的声源定位仿真系统,旨在解决近场环境下宽带声源的方位角(Azimuth)与径向距离(Range)的同步估计问题。与传统的远场平面波假设不同,该系统采用了更为精确的近场球面波模型,能够有效处理距离阵列较近的声源信号。系统通过时频分析技术将宽带信号分解,并在频域内利用多信号分类(MUSIC)算法实现高分辨率的空间谱估计,最后通过频率融合技术增强系统在噪声环境下的稳健性。该代码不依赖于MATLAB商业工具箱,所有核心功能的算法逻辑均采用底层函数实现。
功能特性
- 近场球面波建模:系统考虑了声源到各麦克风阵元的距离差异引起的幅度衰减(1/r模型)和相位延迟,实现了距离与角度的二维定位。
- 宽带信号处理:支持对非单频信号(如语音或宽带随机信号)的处理,通过短时傅里叶变换(STFT)在多个频点上并行执行子空间估计。
- 自主算法实现:手动实现了短时傅里叶变换(STFT)和频域带通滤波器,消除了对信号处理工具箱的依赖。
- 谱融合技术:采用多频带伪谱累加融合策略,显著抑制了单频点可能存在的伪峰,提升了低信噪比环境下的定位精度。
- 直观可视化:提供二维空间伪谱热力图以及空间几何坐标定位图,直观对比真实声源位置与估计位置。
实现逻辑说明
系统的执行流程严格遵循以下逻辑步骤:
- 参数初始化:定义采样率(16kHz)、阵元数量(8元线阵)、阵元间距(5cm)以及搜索网格范围。
- 信号仿真模拟:
- 生成4000Hz以内的随机宽带信号并进行带通滤波。
- 根据设定的真实距离和角度计算声源到每个阵元精确距离。
- 在频域内通过相位偏移实现亚采样级别的信号延迟,并根据1/r定律模拟幅度衰减。
- 向多通道信号中注入指定信噪比的高斯白噪声。
- 时频域分解:调用自定义的STFT函数,利用汉明窗对原始时域信号进行分帧和FFT变换,提取出反映频率特性的三维张量数据(频率-时间-通道)。
- 频率选择与处理:
- 在1000Hz至3000Hz的有效频段内选择多个频点。
- 针对每个频点计算多通道数据的协方差矩阵。
- 子空间分解:
- 对协方差矩阵进行特征值分解,提取与噪声相关的特征向量构建噪声子空间。
- 二维空间谱扫描:
- 在预设的角度和距离网格内遍历。
- 为每个网格点构造归一化的近场球面波导向矢量。
- 计算导向矢量与噪声子空间的正交投影,生成单个频点的伪谱函数。
- 数据融合与估计:
- 将所有选定频点的伪谱进行算术平均融合,并在对数域归一化。
- 通过寻找融合伪谱的全局极大值点,确定声源的估计距离和角度。
关键函数与算法分析
- 近场导向矢量算法:
系统在构造导向矢量时,放弃了远场常用的线性相位近似,而是基于空间坐标计算每一个候选网格点到所有麦克风阵元的欧氏距离。这确保了算法在声源距离阵列较近时(如0.5m-3m),依然能保持极高的相位匹配度。
- 归一化导向矢量处理:
为了消除球面波1/r幅度衰减对距离估计带来的增益干扰,算法对生成的导向矢量进行了范数归一化。这一步骤确保了空间谱的峰值主要由相位匹配(即空间一致性)决定,而非仅仅由信号能量大小决定。
- 频域延迟仿真:
系统没有直接在时域使用滞后算子,而是利用FFT的位移性质(频域乘法)来实现精确的时间延迟。这种方法能够避免时域离散采样引起的延迟精度损失,使得仿真生成的近场信号更为真实。
- 简易滤波器与变换:
- 自定义带通滤波器:通过FFT进入频域,直接对目标频带外的频谱置零,再通过IFFT还原,实现了高效的信号预处理。
- 自定义STFT:在不调用内置函数的情况下,实现了信号的手动分帧、加窗及FFT变换,方便用户理解信号处理的底层过程。
系统要求- 运行环境:MATLAB R2016b 及以上版本。
- 硬件要求:普通PC即可,无需高性能显卡或其他特殊专用硬件。
- 依赖项:无需安装Signal Processing Toolbox或其他任何第三方工具箱。
使用方法- 打开MATLAB,将当前工作目录切换至本项目代码所在文件夹。
- 直接在命令行窗口输入主执行命令运行程序。
- 程序运行结束后,将自动弹出定位结果图表,并在命令行输出真实位置与估计位置的对比数据及计算误差。
- 用户可根据需要修改代码开头的参数设置(如改变snr增加噪声,或修改true_dist和true_angle测试不同位置)来观察系统的鲁棒性。