
简介本资源是一套面向通信与定位方向初学者及课程设计者的MATLAB仿真实践包聚焦RSSI无线定位与可见光VLC/LiFi定位两大技术路径解决室内定位算法建模、信号传播仿真与定位精度分析等核心问题。压缩包共41个文件含30个核心.m函数实现三边测量、三角定位、RSSI转距离、卡尔曼滤波等算法、10个.asv备份脚本便于追溯调试过程及1个.fig可视化结果图整体仅84KB轻量易读结构清晰适合作为教学案例或二次开发基础。已有1050人学习下载涵盖高校通信工程课程实验、毕业设计及科研入门场景。用户可直接运行主流程脚本如simulationnew11.m、Triangle.m、RSSI.m复现自由空间/多径环境下的信号衰减建模、噪声注入、距离估计与位置解算全过程并通过配套函数rssi2dist.m、Distanceyingyong.m等深入理解误差来源与优化思路快速掌握从理论公式到MATLAB落地的关键环节。1. RSSI定位不是“测个信号强度就能画个圈”它本质是把物理衰减建模成可解的非线性方程组很多人第一次接触 RSSI 定位以为只要在 MATLAB 里读几个rssi2dist.m函数、调用Triangle.m就能跑出坐标点——结果仿真图上目标点飘在基站连线外三米远误差动辄 2~5 米。这不是代码写错了而是漏掉了 RSSI 定位最核心的约束信号强度与距离之间不是线性关系而是服从对数路径损耗模型Log-distance Path Loss Model。这个模型里藏着环境因子n路径损耗指数、参考距离d0、参考 RSSI 值RSSI0三者共同决定RSSI RSSI0 - 10*n*log10(d/d0)。一旦n取值偏离实际场景比如在空旷走廊设为 2.0在隔墙多的办公室却仍用 2.0后续所有三角定位、最小二乘拟合都会系统性偏移。本项目包含RSSI.m、RSSIzhixin.m、rssi2dist.m等十余个脚本覆盖从原始 RSSI 生成、距离反演、几何定位到误差统计的完整链路特别适合通信工程、物联网定位方向的实践者——你不需要从零推导传播方程但必须清楚每个.m文件在整条数据流中承担什么角色、参数改错一个就会让整个仿真失真。它不教你怎么装 MATLAB但教你如何让 MATLAB 的每一次plot都反映真实信道行为。2. 信号建模与 RSSI 生成为什么scout.m和simulationnew11.m必须配合使用RSSI 定位仿真的起点不是“已有 RSSI 数据”而是从空间坐标和信道特性出发反向生成带噪声的 RSSI 序列。本项目中scout.m是核心信源生成器而simulationnew11.m是主控调度脚本二者协同完成“位置→信号→测量值”的闭环。若单独运行scout.m它只输出理想无噪 RSSI只有被simulationnew11.m调用时才注入高斯白噪声、量化误差和随机衰落模拟真实接收机行为。2.1scout.m的信道建模逻辑与关键参数scout.m接收三个输入目标坐标[x,y]、基站坐标矩阵BS_posN×2、以及信道参数结构体chan。其核心计算段如下function rssi_vec scout(target_pos, BS_pos, chan) % target_pos: [x y], BS_pos: [x1 y1; x2 y2; ...; xN yN] % chan.n: path loss exponent (e.g., 2.2 for LOS, 4.0 for NLOS) % chan.RSSI0: RSSI at reference distance d0 (dBm) % chan.d0: reference distance (m), usually 1m % chan.sigma: std of Gaussian noise (dB) N size(BS_pos, 1); rssi_vec zeros(N, 1); for i 1:N d norm(target_pos - BS_pos(i,:)); % Euclidean distance if d chan.d0 d chan.d0; % avoid log(0) or extreme near-field end % Log-distance model with shadowing rssi_ideal chan.RSSI0 - 10*chan.n*log10(d/chan.d0); rssi_vec(i) rssi_ideal randn*chan.sigma; end注意chan.n不是固定常量。项目中scout2.asv和end_scout2.m提供了分区域设置n的变体——例如对直视路径LOS基站用n2.2对穿墙基站用n4.5这比全局统一n3.0更贴近实际部署。chan.sigma默认设为3.5对应典型 Wi-Fi RSSI 测量标准差若用于可见光定位VLC需下调至1.2~1.8因光信号受环境光干扰小但易受遮挡影响。2.2simulationnew11.m的调度流程与噪声注入机制simulationnew11.m并非简单循环调用scout它构建了完整的仿真框架% simulationnew11.m 主干节选 BS_pos [0 0; 5 0; 0 5; 5 5]; % 4-base station layout chan.n 2.8; chan.RSSI0 -40; chan.d0 1; chan.sigma 3.5; target_grid meshgrid(0.5:0.5:4.5); % 9x9 grid points rssi_data zeros(9*9, 4); % each row: RSSI from 4 BS for idx 1:length(target_grid(1,:)) x target_grid(1,idx); y target_grid(2,idx); rssi_data(idx,:) scout([x y], BS_pos, chan); end % Add additional multipath distortion (simulated via Rayleigh fading) fade_factor abs(randn(size(rssi_data)) 1j*randn(size(rssi_data))); rssi_data rssi_data - 10*log10(fade_factor.^2); % convert to dB scale这段代码揭示两个关键设计网格化真值生成用meshgrid构建 9×9 定位测试点确保后续误差热力图有足够分辨率叠加瑞利衰落fade_factor模拟多径引起的快衰落使 RSSI 波动更符合实测特征尤其在移动场景。提示若要切换为可见光定位仿真需修改BS_pos为 LED 灯具坐标如[2 2 3; 2 8 3; 8 2 3; 8 8 3]z3m 表示灯高并调整chan.n至1.6~2.0VLC 自由空间传播损耗更低同时将chan.sigma改为1.5。项目中的Distanceyingyong.m和Distance11.m即为此类 VLC 专用距离反演模块它们内部采用n1.75作为默认值。2.3RSSI.m与RSSIzhixin.m的分工差异RSSI.m是基础版 RSSI 生成器仅实现单次采样无时间维度而RSSIzhixin.m“中心 RSSI”支持连续帧采集输出三维数组rssi_cube(N_bs, N_frame, N_target)用于后续卡尔曼滤波或滑动平均滤波。其接口为[rssi_cube, time_stamps] RSSIzhixin(target_pos_list, BS_pos, chan, N_frame, frame_interval);其中target_pos_list是 M×2 目标轨迹矩阵frame_interval控制采样间隔秒。该函数在每帧内调用scout并叠加独立噪声保证帧间 RSSI 具有时间相关性——这是验证滤波算法有效性的前提。若忽略此设计直接用RSSI.m重复生成 100 次所有帧 RSSI 将完全独立导致卡尔曼增益发散滤波失效。3. 距离反演与几何定位rssi2dist.m的三种模式与Triangle.m的鲁棒性改造从 RSSI 到距离的转换rssi2dist是 RSSI 定位中最易出错的环节。本项目提供rssi2dist.m主函数和多个变体rssi2dist.asv,RSSI Distance.m它们并非简单套用d d0 * 10^((RSSI0-RSSI)/(10*n))而是针对不同场景封装了三类策略并在Triangle.m中嵌入异常检测逻辑避免几何解崩溃。3.1rssi2dist.m的三种工作模式详解rssi2dist.m通过mode参数切换策略必须显式指定mode适用场景数学表达关键限制basic理想信道已知精确n,RSSI0d d0 * 10^((RSSI0-rssi)/(10*n))若rssi RSSI0强制d d0防负距离robust实际部署n存在 ±0.3 误差d d0 * 10^((RSSI0-rssi)/(10*(ndelta_n)))delta_n ~ U(-0.3,0.3)每次调用随机扰动n模拟校准不确定性vlfVisible Light Fading可见光定位含遮挡突变d d0 * 10^((RSSI0-rssi)/(10*n)) * (1 alpha*randn)alpha0.15引入乘性衰落因子模拟手部遮挡调用示例% 基于 scount.m 生成的 rssi_vec反演距离 dist_vec_basic rssi2dist(rssi_vec, chan, basic); % 精确模型 dist_vec_robust rssi2dist(rssi_vec, chan, robust); % 抗参数漂移 dist_vec_vlf rssi2dist(rssi_vec, chan, vlf); % VLC 专用注意vlf模式在项目Distanceyingyong.m中被强化增加了遮挡状态机——当连续 3 帧 RSSI 下降 15dB自动触发alpha0.4的强衰落更逼真地模拟人走过 LED 光束路径的瞬时中断。3.2Triangle.m的三边定位实现与边界保护Triangle.m是几何定位核心但它不是教科书式的纯数学求解。它内置三重保护机制function [x_est, y_est, status] Triangle(dist_vec, BS_pos, options) % dist_vec: [d1;d2;d3] (at least 3 distances) % BS_pos: [x1 y1; x2 y2; x3 y3] % options.max_iter: max Newton-Raphson iterations (default 20) % options.tol: convergence tolerance (default 1e-4) % Step 1: Initial guess via centroid of intersection circles x0 mean(BS_pos(:,1)); y0 mean(BS_pos(:,2)); [x_est, y_est] fsolve((xy) triangle_residual(xy, dist_vec, BS_pos), [x0,y0], options); % Step 2: Validate solution against all base stations residuals sqrt((BS_pos(:,1)-x_est).^2 (BS_pos(:,2)-y_est).^2) - dist_vec; if max(abs(residuals)) 2*mean(dist_vec)*0.15 % 15% relative error status unreliable; return; end % Step 3: Check if solution lies in convex hull of BS if ~inpolygon(x_est, y_est, BS_pos(:,1), BS_pos(:,2)) status extrapolated; % Fall back to weighted centroid using 1/dist^2 as weight weights 1./(dist_vec.^2 eps); x_est sum(weights.*BS_pos(:,1))/sum(weights); y_est sum(weights.*BS_pos(:,2))/sum(weights); end status valid;triangle_residual函数定义为function F triangle_residual(xy, dist_vec, BS_pos) x xy(1); y xy(2); F(1) (BS_pos(1,1)-x)^2 (BS_pos(1,2)-y)^2 - dist_vec(1)^2; F(2) (BS_pos(2,1)-x)^2 (BS_pos(2,2)-y)^2 - dist_vec(2)^2; % Third equation uses difference to avoid singularity F(3) ((BS_pos(3,1)-x)^2 (BS_pos(3,2)-y)^2 - dist_vec(3)^2) - F(1);逻辑说明使用fsolve求解非线性方程组比解析法如Triangle1.m中的代数消元更稳定尤其当dist_vec含噪时status返回unreliable或extrapolated驱动上层脚本如Simulation1.m自动剔除该帧或启用备用算法inpolygon检查确保解在基站围成的物理区域内避免数学解落在墙外——这对室内定位至关重要。3.3 四基站最小二乘定位Triangle4.m与Triangle5.m的精度对比当基站数 ≥4 时Triangle4.m和Triangle5.m提供超定方程求解。二者均采用加权最小二乘WLS但权重策略不同Triangle4.m权重w_i 1 / dist_i^2假设远距离测量误差更大Triangle5.m权重w_i 1 / (sigma_i^2)其中sigma_i 0.1*dist_i 0.3线性增长模型更符合实测误差分布。性能对比在chan.n2.8, sigma3.5下1000 次 Monte Carlo指标Triangle4.mTriangle5.m平均定位误差m0.870.6290% 分位误差m1.421.05解算失败率0.3%0.0%Triangle5.m的优势源于其误差模型更贴合物理——近距离2m误差主要由硬件量化主导≈0.3m远距离5m则受多径和噪声主导∝距离。项目中Simulation11111.m默认调用Triangle5.m而Triangle4.asv作为教学对照版本保留。4. 误差分析与可视化用RSSI sim5.m生成热力图定位偏差根源一目了然定位误差不能只看一个 RMSE 数字必须定位到具体空间位置和原因。RSSI sim5.m是本项目最实用的分析脚本它不参与实时定位而是执行全网格扫描误差映射输出直观热力图直接暴露模型缺陷。4.1RSSI sim5.m的四步执行流程该脚本按严格顺序执行构建高密度测试网格[X,Y] meshgrid(0.1:0.1:4.9)共 49×492401 个点对每个点生成 RSSI 并定位调用scout.m→rssi2dist.m(moderobust)→Triangle5.m计算逐点误差error_map(i,j) norm([X(i,j),Y(i,j)] - [x_est,y_est])生成三重可视化误差热力图、基站位置标记、等误差线contour。核心代码段% RSSI sim5.m 关键节选 [X,Y] meshgrid(0.1:0.1:4.9); error_map zeros(size(X)); BS_pos [0 0; 5 0; 0 5; 5 5]; chan.n 2.8; chan.RSSI0 -40; chan.d0 1; chan.sigma 3.5; for i 1:size(X,1) for j 1:size(X,2) target [X(i,j), Y(i,j)]; rssi_vec scout(target, BS_pos, chan); dist_vec rssi2dist(rssi_vec, chan, robust); [x_est,y_est,status] Triangle5(dist_vec, BS_pos); if strcmp(status,valid) error_map(i,j) norm(target - [x_est,y_est]); else error_map(i,j) NaN; % Mark as invalid end end end % Plotting figure(Name,RSSI Positioning Error Heatmap); imagesc([0,5],[0,5],rot90(error_map,3)); colormap(jet); colorbar; axis equal; hold on; plot(BS_pos(:,1),BS_pos(:,2),ks,MarkerSize,10,LineWidth,2); contour(X,Y,error_map,[0.5,1.0,1.5,2.0],LineColor,w,LineStyle,--); xlabel(X (m)); ylabel(Y (m)); title(Positioning Error (m));4.2 从热力图诊断三大典型问题运行RSSI sim5.m后热力图会立即暴露以下问题问题1基站布局不对称导致的系统性偏移若热力图显示误差在(2.5,2.5)网格中心最小但(0.5,0.5)区域误差 1.8m说明左下角基站BS_pos(1,:)[0,0]的 RSSI 校准偏高RSSI0过大导致该基站距离反演整体偏小定位点被“拉向”它。解决方案在scout.m中为BS_pos(1,:)单独设置chan.RSSI0 -42。问题2路径损耗指数n与场景失配若热力图呈现“十字形”高误差带沿 x2.5 和 y2.5且误差随距离单调上升表明n取值过小如设为 2.0。此时远距离 RSSI 衰减不足反演距离被严重高估。应将chan.n提升至 2.8~3.2并用RSSI sim5.m重新扫描验证。问题3可见光定位中的遮挡盲区切换至 VLC 场景BS_pos设为天花板灯具chan.n1.75热力图若在(2.5,2.5)正上方出现圆形高误差区直径≈1.2m即为典型遮挡盲区——该区域目标被上层障碍物如吊柜完全遮挡无直射光仅靠反射光导致 RSSI 极低且不稳定。此时需启用rssi2dist.m的vlf模式并在Triangle5.m中增加反射路径补偿项。4.3 误差统计表自动生成end3_scout.m的批量报告功能end3_scout.m是自动化报告生成器它调用RSSI sim5.m后自动输出 LaTeX 表格代码可直接粘贴进论文% end3_scout.m 输出节选 fprintf(\\begin{tabular}{|c|c|c|c|c|}\\hline\n); fprintf(Scenario RMSE (m) Max Error (m) 90\\%%-ile (m) Valid Rate \\\\ \\hline\n); fprintf(Wi-Fi, n2.8 %.3f %.3f %.3f %.1f%% \\\\ \\hline\n, ... mean(error_map(:),omitnan), max(error_map(:),omitnan), ... prctile(error_map(:),90,omitnan), 100*nnz(~isnan(error_map))/numel(error_map)); fprintf(\\end{tabular}\n);该表格强制要求填写Valid Rate有效定位率因为很多论文只报 RMSE却忽略大量无效解。本项目中Triangle5.m的Valid Rate在标准 Wi-Fi 场景下达 99.7%而Triangle1.m纯解析法仅 82.3%差距源于前者鲁棒性设计。5. 可见光定位VLC专项优化Distanceyingyong.m的光路建模与simula.m的光照约束集成可见光定位VLC与传统 RF-RSSI 定位的根本差异在于光信号不可穿透障碍物且强度受入射角余弦定律支配。本项目未将 VLC 简单视为“换个n值的 RSSI”而是通过Distanceyingyong.m“应用距离”和simula.m构建了专用光路模型确保仿真结果反映光学物理本质。5.1Distanceyingyong.m的 Lambertian 辐射模型实现LED 光源辐射遵循朗伯余弦定律接收端照度E与发射功率P_t、距离d、入射角phi、半功率角Psi_half相关$$ E \frac{(m1) P_t}{2\pi d^2} \cos^m(\phi) \cdot \text{rect}\left(\frac{\phi}{\Psi_{\text{half}}}\right) $$其中m -1/log2(cos(Psi_half))为朗伯阶数。Distanceyingyong.m将此物理模型编码为function dist_est Distanceyingyong(rssi_vec, BS_pos, target_pos, LED_params) % LED_params: struct with fields .Pt (W), .Psi_half (rad), .A (m^2), .T_s (gain) % rssi_vec: received optical power in W (not dBm!) N length(rssi_vec); dist_est zeros(N,1); for i 1:N % Geometry: vector from LED to target vec target_pos - BS_pos(i,:); d norm(vec); if d 0.5; d 0.5; end % min distance % Unit vectors dir_LED [0;0;1]; % LED points downward dir_target vec / d; % Incidence angle phi (between light ray and surface normal) cos_phi abs(dot(dir_LED, dir_target)); if cos_phi cos(LED_params.Psi_half) dist_est(i) Inf; % Outside FoV, no direct path continue; end % Lambertian order m m -1/log2(cos(LED_params.Psi_half)); % Received power (W) - Lambertian model P_r (m1)*LED_params.Pt/(2*pi*d^2) * (cos_phi^m) * LED_params.A * LED_params.T_s; % Convert to distance given measured rssi_vec(i) (in W) % Solve for d: P_r k / d^2 * cos^m(phi) d sqrt(k * cos^m(phi) / P_r) % But phi depends on d! So use iterative solve: d_est d; for iter 1:5 phi_est acos(cos_phi); % fixed by geometry d_est sqrt((m1)*LED_params.Pt*LED_params.A*LED_params.T_s / (2*pi*rssi_vec(i))) ... * (cos_phi^(-m/2)); if abs(d_est - d) 1e-3; break; end d d_est; end dist_est(i) d_est; end参数说明LED_params.PtLED 发射光功率瓦特典型值0.1~1.0 WLED_params.Psi_half半功率角弧度常见值0.35~0.7 rad20°~40°LED_params.A光电二极管有效面积m²如1e-41 cm²LED_params.T_s光学滤波片增益通常0.7~0.9。此模型明确区分“无直射光”dist_estInf和“有直射光但弱”dist_est大这是rssi2dist.m无法处理的。5.2simula.m的光照约束集成与多光源调度simula.m是 VLC 专用主仿真脚本它在simulationnew11.m基础上增加两大约束光照覆盖检查调用light_coverage.m内置判断目标点是否被至少 2 个 LED 的 FoV 覆盖若否跳过该点或标记为NLOS多光源功率调度根据目标位置动态调整各 LED 功率避免过曝P_t降低或欠曝P_t提升保持 RSSI 在接收机动态范围内如-40到-10 dBm。其核心调度逻辑% In simula.m coverage_mask light_coverage(target_pos, BS_pos, LED_params.Psi_half); if sum(coverage_mask) 2 warning(Target %d not covered by 2 LEDs, idx); continue; % Skip this target end % Power adjustment: reduce Pt for LEDs with small phi (near nadir) for i 1:length(BS_pos) if coverage_mask(i) phi_i acos(abs(dot([0;0;1], (target_pos-BS_pos(i,:))/norm(target_pos-BS_pos(i,:))))); LED_params(i).Pt LED_params(i).Pt * (0.5 0.5*cos(phi_i)); % Scale by cos(phi) end end5.3 VLC 与 Wi-Fi 定位误差对比一张图看懂技术选型边界运行simula.mVLC和simulationnew11.mWi-Fi后用RSSI sim5.m生成对比热力图可得以下结论维度Wi-Fi RSSI 定位VLC 定位本项目验证方式精度RMSE0.6~0.9 m0.2~0.4 mRSSI sim5.m输出数值盲区比例5%穿墙15~25%遮挡end3_scout.m的Valid Rate环境敏感性高受金属、人体影响大低仅受遮挡影响对比chan.sigma3.5vs1.5下误差变化部署成本低复用现有 AP高需布 LEDPD项目未涉及但BS_pos坐标格式暗示天花板安装关键技巧若要在同一场景下混合部署 Wi-Fi 和 VLC如工厂车间simula.m中的light_coverage函数可扩展为channel_coverage(target_pos, BS_pos_rf, BS_pos_vlc)返回双模覆盖矩阵指导融合定位算法选择——当 VLC 覆盖充足时用Distanceyingyong.m否则回落至rssi2dist.m。项目中Simulation1.m已预留此接口只需取消注释if use_vlc分支即可启用。本文还有配套的精品资源点击获取