
简介一份围绕近场声源定位中二维到达方向估计理论的MATLAB验证代码适用于阵列信号处理、声学成像与机器人听觉等方向的初学者和研究者。近场与远场的关键差异在于声波不再近似为平面波声压、相位随距离变化更复杂需利用多通道阵列的相位差或时差完成水平与垂直角度估计脚本以简洁示例演示这一估计的基础逻辑可作为理解随机化搜索、蒙特卡洛模拟、改进型MUSIC或最小二乘类近场算法的前置测试工具。压缩包整体仅1KB仅含一个M文件结构极简便于快速阅读、直接运行与按需修改。配合理论文档中声波传播、傅里叶变换、传感器阵列设计、空间谱估计等讲解有助于连接基础理论与仿真实践。目前已有272人学习适合课堂演示、课程设计或算法原型验证也可作为近场声源定位研究的起步参考。1. 近场声源定位的2D DOA为何不能拿远场思路硬套近场声源定位的2D DOA估计难点不在算法本身而在于很多人拿远场模型套近场数据谱峰看着尖锐估计出的角度却系统性偏移好几度。这份theory.zip里的theory文档与test.m脚本正好把近场球面波传播模型、二维角度-距离联合搜索以及随机化验证方法串成了一条可复现的链路。它适合正在做麦克风阵列定位、声学成像或噪声源识别的人用来快速搭建近场仿真环境、验证算法在近场条件下的边界避免在自己的项目里重复踩远场近似失效的坑。2. 近场与远场的边界菲涅尔距离、导向矢量与角度定义2.1 菲涅尔距离先判断你的声源到底在不在近场近场与远场的分界业内最常用的判据是菲涅尔距离。给定阵列孔径D和声波波长λ远场近似成立的条件是声源到阵列的距离r满足r 2D² / λ当r小于这个阈值时声波到达阵列不同阵元的波前不能近似为平面波相位随距离的变化呈现明显曲率此时再使用远场假设就会引入不可忽略的建模误差。反过来如果r远大于该阈值球面波可以退化为平面波近场算法退化为远场算法但计算代价却高得多。以一个常见的6元均匀线阵为例阵元间距d 0.05 m阵列孔径D 5 × 0.05 0.25 m。如果信号频率为3400 Hz声速取343 m/s波长λ ≈ 0.1 m则菲涅尔距离为r_f 2 × 0.25² / 0.1 1.25 m也就是说只有声源距离小于1.25 m时近场效应才显著。若声源放在0.3 m处仍然按平面波建模角度估计偏差可能达到数度甚至十几度具体取决于阵列口径和入射角。这份资源里的theory文档在开头部分就强调了这个判据test.m脚本里也预留了距离参数的设置位置用于对比近场与远场模型下的谱峰差异。2.2 近场导向矢量幅度和相位都需要修正远场条件下导向矢量只与入射角度有关各阵元之间的相位差由波程差d·sinθ决定且各阵元接收到的信号幅度近似相等。近场条件下声源到每个阵元的实际距离不同这带来两方面的修正一是幅度不再是均匀的需要乘以距离之比二是相位延迟必须按实际距离逐阵元计算。以均匀线阵为例设参考阵元位于坐标原点第m个阵元坐标为(m·d, 0)声源位于极坐标(r, θ)θ定义为声源方向与阵列法线之间的夹角。此时声源到第m个阵元的距离为r_m sqrt(r² (m·d)² − 2·r·m·d·cosθ)近场导向矢量a的第m个分量为a_m (r / r_m) · exp(−j·2π·f·r_m / c)其中(r / r_m)是球面波幅度衰减因子指数项是相位延迟。与远场导向矢量相比多了一个随距离变化的幅度项相位部分也不再是简单的线性函数。下面是test.m中构造近场导向矢量的常见写法function a nearfield_steering_ula(r, theta, M, d, c, f) % 近场均匀线阵导向矢量 % 输入: % r 标量, 声源到参考阵元的距离 (m) % theta 标量, 入射角度 (rad), 0 表示法线方向 % M 阵元数 % d 阵元间距 (m) % c 声速 (m/s) % f 信号频率 (Hz) % 输出: % a M×1 复数导向矢量 a zeros(M, 1); for m 0 : M-1 % 声源到第 m 个阵元的实际距离 r_m sqrt(r^2 (m*d)^2 - 2*r*m*d*cos(theta)); % 幅度衰减因子: r / r_m % 相位延迟因子: exp(-j * 2*pi*f*r_m / c) a(m1) (r / r_m) * exp(-1j * 2*pi*f*r_m / c); end end这段代码把近场导向矢量拆成两个独立的物理因素r/r_m体现了球面波在传播过程中的幅度几何衰减指数项体现了每个阵元接收信号的相位滞后。使用时需要注意输入角度theta的单位是弧度而test.m主脚本里设置声源角度时通常用度需要先转换。另一个值得注意的细节是当r远大于阵列尺寸时r_m趋近于r − m·d·cosθ幅度因子趋近于1导向矢量自然退化为远场形式这也是判断算法适用性的一个自检手段。2.3 2D角度定义方位角与俯仰角的空间约定二维DOA估计的目标是同时确定声源在水平面和垂直面上的方向也就是方位角θ和俯仰角φ。实际工程中阵列不再是一维线阵而是矩形阵列、L型阵列或圆阵。每种阵形对应不同的坐标约定源码里使用的是矩形麦克风阵列因此有必要先说清楚角度定义。矩形阵列位于xOy平面内阵元沿x方向N_x个、沿y方向N_y个间距均为d。声源方向由方位角θ在xOy平面内相对x轴正方向和俯仰角φ相对z轴正方向描述。声源到参考阵元的方向向量为u [sinφ·cosθ, sinφ·sinθ, cosφ]第(p, q)个阵元坐标为(p·d, q·d, 0)则声源到该阵元的距离为r_pq sqrt(r² (p·d)² (q·d)² − 2·r·sinφ·(p·d·cosθ q·d·sinθ))将这个r_pq代入上一小节的导向矢量表达式就得到了二维近场导向矢量。这里最需要小心的是角度约定的统一性不同论文里θ可能定义为与法线的夹角也可能定义为与阵列轴向的夹角混用会导致谱峰出现在镜像位置。test.m里有一段对照代码分别用两种角度约定计算同一个声源位置下的导向矢量并打印出对应的空间谱峰位置用于帮使用者确认自己的约定与脚本一致。3. 算法选型MUSIC、子空间方法与随机化验证怎么组合3.1 远场MUSIC直接套用到近场为什么会出现偏差MUSIC算法是子空间类DOA估计方法的代表核心思想是对接收信号协方差矩阵做特征分解将特征空间划分为信号子空间与噪声子空间然后利用噪声子空间与导向矢量正交的特性构造空间谱。在远场条件下导向矢量只与角度有关因此谱搜索是一维的计算效率高谱峰尖锐。但在近场条件下MUSIC算法的搜索空间从一维变成二维不仅要搜角度还要搜距离。原因很简单近场导向矢量是角度和距离的二元函数如果只搜索角度等于强行把距离固定为一个不准确的值。当真实的声源距离与假定的距离不匹配时导向矢量不再准确噪声子空间与导向矢量的正交性被破坏。直观表现就是谱峰位置发生偏移且偏移量随真实距离减小而增大。一个典型的失败案例是某开发者在8元均匀线阵上做近场定位声源距离0.2 m、角度30度直接用远场MUSIC搜索谱峰出现在约27度位置偏差3度。这个偏差不是算法噪声导致的而是模型失配导致的系统性误差。将阵列尺寸减小到0.2 m后同样条件下偏差降到1度以内说明近场效应随阵列孔径增大而增强。theory文档中有一张不同距离下远场MUSIC角度偏差的对照表直观展示了这个趋势。3.2 近场二维MUSIC角度-距离联合搜索的实现近场MUSIC与远场版本的主要区别在于空间谱计算时使用近场导向矢量并遍历角度与距离两个维度。下面是test.m中二维MUSIC核心部分的简化实现function [theta_est, r_est] nearfield_music_2d(X, M, d, c, f, ... theta_grid, r_grid, num_src) % 近场二维 MUCIC 谱搜索 % 输入: % X M×T 接收信号矩阵 % theta_grid 1×Nt 角度搜索网格 (rad) % r_grid 1×Nr 距离搜索网格 (m) % num_src 信源个数, 单声源场景取 1 % 输出: % theta_est 估计的方位角 (rad) % r_est 估计的声源距离 (m) T size(X, 2); Rxx X * X / T; % 协方差矩阵, M×M [V, D] eig(Rxx); % 特征分解, 特征值升序排列 [~, idx] sort(diag(D), descend); V V(:, idx); % 按特征值降序排列特征向量 En V(:, num_src1:end); % 噪声子空间 EnEnH En * En; P zeros(length(theta_grid), length(r_grid)); for ti 1 : length(theta_grid) for ri 1 : length(r_grid) a nearfield_steering_ula(r_grid(ri), theta_grid(ti), ... M, d, c, f); P(ti, ri) 1 / abs(a * EnEnH * a); end end % 搜索谱峰 [~, lin_idx] max(P(:)); [ti, ri] ind2sub(size(P), lin_idx); theta_est theta_grid(ti); r_est r_grid(ri); end这里有几个关键参数需要说明。协方差矩阵Rxx使用样本协方差估计T是快拍数T越大协方差估计越准确。特征分解后矩阵V的列向量是对应特征值的特征向量MATLAB的eig函数默认按特征值升序排列因此需要sort操作。噪声子空间En由最小num_src个特征值对应的特征向量构成单声源场景下取除最大特征值外的其余向量。空间谱P的计算遍历了全部角度与距离网格双重循环的计算量正比于Nt×Nr这是近场MUSIC的主要成本点。实际使用中可以用meshgrid预计算整个网格上的导向矢量来加速但会大幅增加内存占用。作为折衷先粗搜再细搜是常见做法粗搜步长几度、几厘米锁定峰的大致区域后再用小步长加密。test.m里提供了finesearch参数的示例用来控制两级搜索的切换。3.3 随机化方法在近场DOA里的两个角色随机化方法在近场DOA估计中承担两个不同的角色。第一个角色是性能评估工具通过蒙特卡洛模拟在固定声源位置的情况下多次生成随机噪声统计角度估计的均方根误差RMSE与偏差从而评估算法在不同信噪比、不同快拍数下的表现。第二个角色是优化工具当空间谱函数存在多个局部极大值或者搜索空间过大时用随机搜索、遗传算法或粒子群优化来替代全网格穷举降低计算量。蒙特卡洛模拟的代码模式非常固定rng(42); % 固定随机种子, 保证结果可重复 num_trials 200; % 蒙特卡洛次数 errors zeros(num_trials, 1); for trial 1 : num_trials noise (randn(M, T) 1j*randn(M, T)) / sqrt(2) * sigma; X s * a_true. noise; % 含噪接收信号 [theta_est, ~] nearfield_music_2d(X, M, d, c, f, ... theta_grid, r_grid, 1); errors(trial) abs(theta_est - theta_true) * 180 / pi; end rmse_theta sqrt(mean(errors.^2));rng(42)这一步很容易被忽略但它决定了整个实验是否可复现。200次独立试验中每次生成的噪声都不同如果不固定种子同一份代码两次运行的结果会有微小差异这在对比算法性能时很麻烦。噪声功率sigma需要根据信噪比反推给定信号功率Ps信噪比SNR_dB则sigma sqrt(Ps / 10^(SNR_dB/10))。信噪比越低RMSE曲线上升越快但近场MUSIC在低信噪比下的退化速度往往比远场更明显这与距离维的搜索引入了额外自由度有关。4. 把theory.zip跑起来的完整链路test.m脚本拆解与参数复现4.1 初始化参数与生成近场接收信号test.m脚本的入口部分负责设置所有仿真参数这些参数的取值直接决定后续算法的输入数据形态。以下是脚本初始化的核心代码与资源包内的theory文档第一节相对应clear; clc; close all; % 阵列参数 M 6; % 麦克风数量 d 0.05; % 阵元间距 (m), 满足 d lambda/2 c 343; % 声速 (m/s) % 信号参数 f 3400; % 信号频率 (Hz), 对应波长约 0.1m fs 48000; % 采样率 (Hz) T 2000; % 快拍数 SNR_dB 15; % 信噪比 (dB) % 声源位置 theta_true 30; % 真实方位角 (度) r_true 0.5; % 真实距离 (m) % 近场导向矢量与信号 theta_rad theta_true * pi / 180; a_true nearfield_steering_ula(r_true, theta_rad, M, d, c, f); lambda c / f; Ps 1; % 信号功率 sigma sqrt(Ps / 10^(SNR_dB / 10)); % 噪声标准差 % 基带信号: 单频复指数 s exp(1j * 2 * pi * f * (0 : T-1) / fs); % 接收信号: 导向矢量加权 复高斯白噪声 X a_true * s (sigma / sqrt(2)) * (randn(M, T) 1j * randn(M, T));参数设置的逻辑顺序是先定阵列结构与信号频率再确认近场条件最后生成数据。阵元间距d取0.05 m对应3.4 kHz信号波长的二分之一这是空间采样定理的临界值。采样率fs与信号频率f之间不需要满足奈奎斯特条件以外的关系因为这里的信号是窄带复指数只需要保证每个快拍内的相位关系正确即可。快拍数T 2000对MUSIC来说比较充裕协方差矩阵的秩会接近满秩噪声子空间估计稳定。信噪比15 dB是中等强度噪声条件既不会让谱峰淹没在噪声里又能体现出不同算法之间的性能差异。4.2 协方差矩阵分解与二维谱估计数据生成之后进入算法核心阶段。这一段对应MUSIC算法的标准流程协方差估计、特征分解、噪声子空间提取、谱扫描。需要补充一个容易踩坑的细节协方差矩阵计算时用T做归一化还是用T−1对特征分解结果几乎无影响工程实现中两种写法都存在。% 协方差矩阵与特征分解 Rxx X * X / T; % 特征分解, 特征值降序排列 [V, D] eig(Rxx); [~, idx] sort(diag(D), descend); V V(:, idx); lambda_vals diag(D); lambda_vals lambda_vals(idx); % 信源数估计: 可用 MDL 或直接指定为 1 num_src 1; En V(:, num_src1 : end); % 取降序后的后 M-num_src 列 EnEnH En * En; % 搜索网格 theta_grid (-90 : 0.5 : 90) * pi / 180; % 角度网格, 步长 0.5 度 r_grid 0.1 : 0.02 : 1.0; % 距离网格, 步长 2cm % 二维空间谱 P zeros(length(theta_grid), length(r_grid)); for ti 1 : length(theta_grid) for ri 1 : length(r_grid) a nearfield_steering_ula(r_grid(ri), theta_grid(ti), ... M, d, c, f); P(ti, ri) 1 / abs(a * EnEnH * a); % MUSIC 伪谱 end end % 谱峰提取 [max_val, lin_idx] max(P(:)); [ti_peak, ri_peak] ind2sub(size(P), lin_idx); theta_est theta_grid(ti_peak) * 180 / pi; r_est r_grid(ri_peak);特征分解部分有一个重要细节eig函数的输出顺序在不同MATLAB版本中有差异因此显式排序是必要的。排序后特征值向量lambda_vals的前num_src个值远大于其余值这是信号子空间与噪声子空间分离的标志。实际应用中如果特征值没有出现明显跳变要么是信噪比太低要么是快拍数不足要么是信源数估计错误这三者都会导致MUSIC谱质量下降。谱扫描网格的划分直接影响估计精度与计算量的平衡。角度网格从−90度到90度、步长0.5度共361个点距离网格从0.1 m到1.0 m、步长2 cm共46个点总搜索点数是361 × 46 ≈ 16600。这个规模的双重循环在中小规模数据下运行时间在几秒量级可以接受。如果希望提高估计精度可以把角度步长缩小到0.1度但计算时间会变为原来的5倍建议先用粗网格定位峰的位置再在峰附近加密搜索。4.3 误差分析与结果可视化谱峰提取之后脚本最后一段负责计算估计误差并输出可视化结果。这一部分看起来简单但对于验证算法的有效性必不可少也是后续修改参数时判断改动效果的依据。% 估计误差 theta_error abs(theta_est - theta_true); r_error abs(r_est - r_true); fprintf(真实角度: %.2f deg, 估计角度: %.2f deg, 误差: %.2f deg\n, ... theta_true, theta_est, theta_error); fprintf(真实距离: %.2f m, 估计距离: %.2f m, 误差: %.2f m\n, ... r_true, r_est, r_error); % 可视化角度-距离谱 figure; imagesc(r_grid, theta_grid * 180/pi, 10*log10(P)); xlabel(距离 (m)); ylabel(角度 (deg)); title(近场 MUSIC 空间谱); colorbar; hold on; plot(r_true, theta_true, r*, MarkerSize, 12); % 真实位置标红 hold off; % 验证: 该方法是否显著优于远场 MUSIC? a_far (theta) exp(-1j * 2*pi*f * d * (0:M-1). * sin(theta) / c); P_far zeros(length(theta_grid), 1); for ti 1 : length(theta_grid) a a_far(theta_grid(ti)); P_far(ti) 1 / abs(a * EnEnH * a); end [~, ti_far] max(P_far); theta_far theta_grid(ti_far) * 180 / pi; fprintf(远场 MUSIC 估计角度: %.2f deg\n, theta_far);这段代码里最值得学习的是最后一部分同样一组接收数据分别用近场导向矢量和远场导向矢量做谱搜索然后对比两者的估计结果。这个对比设计是test.m里最精妙的地方。如果近场条件下远场MUSIC与近场MUSIC的估计差只有0.1度说明声源实际上已经接近远场条件此时直接用远场算法节省计算量如果差了好几度说明近场效应显著远场算法不可用。误差统计中只打印绝对误差这对单次试验来说是够用的但如果要做完整的算法评估需要配合第3.3节的蒙特卡洛循环统计多次试验的RMSE。可视化部分用了imagesc而不是surf是因为二维空间谱用伪彩图呈现更直观峰值位置一目了然。频谱的dB转换可以压缩动态范围让低幅值区域的纹理也可见避免强峰让其余部分全部变暗。5. 近场DOA仿真避坑五个最容易翻车的细节5.1 阵元间距大于半波长导致空间混叠现象空间谱上除了真实位置的主峰之外在镜像角度出现几乎同等高度的伪峰导致角度估计结果随机落在其中一个峰附近。这是做阵列信号处理最先遇到的典型问题。原因均匀线阵的导向矢量在空间采样中遵循与时间采样相同的奈奎斯特定理。阵元间距d与波长λ的关系必须满足d ≤ λ/2否则不同方向的导向矢量之间无法区分产生空间混叠。在近场条件下混叠的情况更复杂因为距离维度也会引入额外的相位变化镜像峰的位置还与真实声源距离有关。解决在设置阵列参数时强制校验d lambda/2不满足就调整阵元间距或降低信号频率。如果频率覆盖范围很宽例如从几百赫兹到几千赫兹可以按最高频率对应的最短波长来约束间距或者将阵列设计成嵌套阵用不同子阵覆盖不同频段。test.m中默认d 0.05 m、f 3400 Hz、λ 0.1 m恰好满足半波长约束。5.2 距离搜索范围没有覆盖真实距离现象距离维谱峰出现在搜索范围边界处且角度估计也出现轻微偏差。看起来像算法失败实际上是搜索网格本身没有覆盖真实声源位置。原因近场MUSIC的距离搜索范围是人为设定的。如果真实声源距离小于搜索下界或大于搜索上界谱函数在这个方向的截面上找不到最大值峰会被钳制在边界。更隐蔽的情况是距离搜索范围包含了真实距离但网格步长太粗导致峰位置落在两个相邻网格点之间估计值系统性偏大或偏小。解决先计算菲涅尔距离r_f 2D²/λ把距离搜索下界设为略小于r_f的1/3上界设为真实距离的1.5倍以上并且预留一定的冗余量。粗搜步长取2 cm左右细搜步长取0.5 cm。如果对真实距离完全未知可以先用延迟求和波束形成做一个粗估再缩小MUSIC的搜索范围。我在自己的仿真里习惯把搜索范围比预估位置放宽30%这样可以避免边界效应带来的干扰。5.3 快拍数太少导致协方差矩阵秩亏现象空间谱出现多个不相关的杂散峰主峰的幅度与这些杂散峰相比没有明显优势而且多次独立试验的估计结果方差很大。原因MUSIC依赖样本协方差矩阵的特征分解。快拍数T小于阵元数M时协方差矩阵不是满秩的噪声子空间的估计严重失真。即便T略大于M如果信噪比很低特征分解得到的噪声子空间仍然不稳定。近场MUSIC还需要在距离维搜索同样的协方差矩阵质量下比远场MUSIC更容易受噪声影响。解决建议T至少大于10M在资源包的单声源场景下M 6T 2000已经非常充裕。如果采集环境导致快拍数有限常见的补救措施是对角加载在协方差矩阵上叠加一个小的单位阵即R_loaded Rxx βIβ通常取为Rxx对角线均值的0.01倍。对角加载牺牲部分分辨力换取估计稳定性在低快拍数场景是值得的。5.4 搜索步长过大导致漏峰或估计精度不足现象角度估计结果在某一档位附近跳跃比如真实角度30度时估计值在28.5到31.5度之间反复变化而不是稳定在30度附近。这说明角度网格步长不足以支撑所需的估计精度。原因MUSIC谱峰的宽度受阵列孔径和信噪比影响。阵列孔径越大峰越尖锐信噪比越低峰越平缓。如果网格步长大于谱峰的半宽搜索点恰好落在峰的两侧斜坡上最大点的位置与真实峰顶之间存在量化误差。在近场MUSIC中距离维也存在同样的问题而且距离维谱峰通常比角度维更平滑对步长更敏感。解决角度网格步长设置为估计精度目标的1/3到1/5。例如需要0.5度精度步长取0.1度到0.2度。距离网格同理如果目标是0.02 m精度步长取0.005 m到0.01 m。为避免全网格细搜的计算开销采用第4.2节提到的两级搜索策略粗搜锁定峰区域细搜在峰附近局部加密。test.m中的两级搜索参数分别是粗网格0.5度/2 cm和细网格0.1度/0.5 cm对比后可以看到细搜的估计误差大约缩小到粗搜的1/3。5.5 蒙特卡洛仿真没有固定随机种子现象同一份代码、同样的参数两次运行得到的RMSE曲线略有不同导致算法对比实验的结论不清晰。新手容易误以为是算法本身的随机性实际是实验控制变量没有做好。原因蒙特卡洛模拟每次循环都重新生成随机噪声矩阵如果没有设置随机数生成器的种子不同运行之间噪声不同统计结果自然有波动。当试验次数较少时这种波动对RMSE的影响可以达到几十个百分点足以改变算法优劣排序。解决在蒙特卡洛循环之前调用rng(42)固定种子。选择哪个数字不重要重要的是保证同一份代码在任何机器上运行都产生完全相同的结果。如果需要测试不同信噪比或不同阵元数配置应该在每个配置下分别固定种子或者使用一个循环变量作为种子偏移。进一步的做法是在蒙特卡洛循环内用rng(trial * 100 7)为每次试验生成可复现但不同的噪声序列这样既保证了整体可复现性又避免了所有试验使用同一组噪声导致的统计偏差。6. 把近场DOA理论验证变成习惯一组快速自检脚本近场DOA仿真做得多了我逐渐形成了一套固定的自检流程每次拿到一个新的近场定位算法或者修改参数后都会先跑一遍这几个检查项确认模型没有在基础环节出错再去看最终的定位精度。第一个检查项是远场退化的对齐验证。把声源距离设到10倍菲涅尔距离以上分别用近场算法和远场算法做估计两组结果的差异应该小于0.1度。如果差异明显说明近场导向矢量的实现有错误比如幅度因子计算有误或者距离计算式多乘了一个系数。这一步能在5秒内暴露代码中最常见的低级错误。第二个检查项是谱峰锐度诊断。在已知真实位置的情况下运行一次MUSIC输出谱峰前后几个网格点对应的伪谱值。如果主峰只比相邻点高出不到1 dB说明信噪比太低或者阵元间距过小需要增强信号功率或者调整阵列参数后再继续实验。狭峰的谱面是可靠的平峰则不值得信任。第三个检查项是不同快拍数的稳定性对比。分别设置T 500、2000、5000看角度估计值的变化幅度。理想情况下T从2000增加到5000估计值的变化应当小于0.2度。如果变化幅度很大说明当前参数下算法处于不稳定区域需要排查信噪比或搜索步长是否合理。我一般会把这三个检查项写成一个独立的selfcheck.m脚本放在test.m的同级目录每次实验之前先跑一遍。形成这个习惯的直接原因是某次实验中近场MUSIC估计的角度偏了8度折腾了半天发现是导向矢量函数里角度单位没有换算弧度与度混用导致整个谱面翻转。从那以后不管代码短到几行我都在改动后强制走一遍自检流程确认基本假设成立再进入正式实验。如果你也打算在近场声源定位方向上深入做下去建议把这份资源里的theory文档读一遍然后逐行理解test.m的每一段再按照上面的自检脚本建立自己的实验流程。近场DOA的数学推导不难难的是在仿真和实测中保持参数一致性、角度约定一致性和随机性可控。希望帮到你。本文还有配套的精品资源点击获取