ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

无线通信信道模型MATLAB仿真:四大路径损耗模型对比与实现

无线通信信道模型MATLAB仿真:四大路径损耗模型对比与实现 无线通信信道建模和MATLAB仿真这个题目看起来像是很多通信工程学生和刚接触网络规划的人都会遇到的一道坎。直接用MATLAB写自由空间损耗模型、Okumura-Hata模型、COST231 Hata模型、SUI信道模型本身并不复杂真正让人头疼的是四个模型的适用条件、参数边界、代码实现细节以及结果曲线怎么解读。这篇文章就把四个模型从公式到代码完整走一遍并且给你一条可以照着复现的MATLAB仿真路径适合正在做课程设计、毕业设计或者刚进入无线网络规划岗位的工程师。我会先解释四个模型分别解决什么问题再给环境准备和参数约定然后一段一段写MATLAB实现最后带你做对比仿真和选型判断。1. 先搞清楚这4个模型各自解决什么问题1.1 大尺度衰落模型的基本逻辑无线信道里的信号衰减可以粗略分成大尺度衰落和小尺度衰落。小尺度衰落描述的是几十个波长范围内信号快速起伏比如多径干涉导致的快衰落。而自由空间损耗、Okumura-Hata、COST231 Hata、SUI这些模型主要描述的是大尺度衰落也就是信号在较长距离传播后平均功率的下降规律。大尺度衰落模型的核心作用是回答一个问题当发送端和接收端相距一定距离工作频率、天线高度、地形环境都已知时接收端信号强度大概是多少。这个数值直接决定链路预算、覆盖半径、基站密度以及小区边缘速率能不能达标。四个模型里自由空间损耗模型最简单Okumura-Hata和COST231 Hata是传统蜂窝网络中用到最多的经验模型SUI模型则是面向宽带无线接入系统的场景化模型。它们不是互相替代的关系而是覆盖不同频段、不同场景、不同工程目的。1.2 自由空间、Hata系列、SUI模型的核心差异先看自由空间损耗。它的物理含义是没有障碍物、没有反射折射、只有电磁波球面扩散带来的损耗。公式本身很容易算但它代表的是信道损耗的下限也就是“理想情况下的最小损耗”。实际环境里的实测损耗通常高于它除非是卫星通信链路、微波接力链路或者室外视距传输。Okumura-Hata模型是奥村等人通过大量实测数据归纳出来的经验模型后来被Hata公式化。它适用于150MHz到1500MHz频段基站天线高度30米到200米移动台1米到10米距离1公里到20公里。这个范围正好覆盖早期蜂窝系统比如GSM900。COST231 Hata模型是Okumura-Hata的高频扩展版把适用频率从1.5GHz扩展到2GHz覆盖GSM1800和部分PCS1900系统。它的形式与Hata非常接近只是频率项系数、常数项和有城市中心修正因子不同。SUI信道模型来自斯坦福大学的研究面向IEEE 802.16宽带无线接入系统适用频率范围通常认为是2GHz到6GHz。它把地形分成A、B、C三类A类地形起伏大且树木茂密B类中等C类平坦开阔。除了路径损耗SUI还包含对数正态阴影衰落项和接收天线高度修正项比前三者更贴近宽带无线系统规划需求。2. 仿真前的环境准备与参数约定2.1 MATLAB版本、工具箱与脚本组织方式这四个模型实现只需要MATLAB基础功能base workspace和绘图函数就够了。R2016a之后的版本都能正常跑不需要额外装Communication Toolbox也不依赖LTE Toolbox。如果你用R2022b、R2023a、R2024a这些较新版本注意脚本编码格式建议统一用UTF-8避免中文注释在某些英文版操作系统上乱码。我的建议是不要把所有代码写在一个脚本文件里。按照函数拆分属于四个模型的路径损耗计算函数放到独立.m文件仿真主脚本只负责定义参数、调用函数、绘制曲线。这样当你修改某个模型时不会影响其他部分。推荐目录结构channel_model_sim/ ├── main_simulation.m ├── free_space_loss.m ├── okumura_hata_loss.m ├── cost231_hata_loss.m ├── sui_loss.m └── results/把仿真结果图片统一存到results目录日志输出到Command Window方便回头整理。2.2 公共仿真参数与输入输出定义实现之前先明确每个模型的输入输出。所有路径损耗模型的输出单位都是dB输入参数包括频率、距离、基站天线高度、移动台天线高度、地形类型或者环境修正因子。为了做四模型对比我会统一使用一组基准参数参数数值说明频率 f900 MHz / 1800 MHz / 2500 MHz根据模型适用频段选择距离 d0.1 km 到 20 km步进0.1km基站天线高度 hb30 m宏蜂窝典型值移动台天线高度 hm1.5 m手持终端典型值地形类型B类或城市用于SUI和Hata模型频率要特别注意。自由空间模型任何频率都能算。Okumura-Hata在150到1500MHz之间才严格适用COST231 Hata在1500到2000MHz之间有效SUI模型虽然标准上覆盖2到6GHz但频率低于2GHz时修正项需要特殊处理。四个模型对距离的定义都是水平距离不是斜距。如果你的仿真场景存在较大高度差比如基站挂在30米高度而终端在1.5米高度在近距离小区内斜距和水平距差异可能达到几米到十几米。严格来说应该用直线距离但对于1公里以上的宏蜂窝这个误差通常可以忽略。如果需要做室内或微蜂窝就要换成其他模型。3. 四个模型的MATLAB实现与注释3.1 自由空间损耗模型自由空间损耗公式L_fs(dB) 20 * log10(d_km) 20 * log10(f_MHz) 32.44注这个公式基于d以km为单位f以MHz为单位。如果你用频率单位Hz、距离单位m公式要变成20 * log10(4pid/lambda)。我在MATLAB里是一个函数function L free_space_loss(f_MHz, d_km) % FREESPACE_LOSS 自由空间损耗模型 % 输入 % f_MHz - 频率单位 MHz % d_km - 距离单位 km % 输出 % L - 路径损耗单位 dB % % 适用条件无遮挡视距传播实际损耗的下限 if any(f_MHz 0) error(频率必须大于0); end if any(d_km 0) error(距离必须大于0); end L 20 * log10(d_km) 20 * log10(f_MHz) 32.44; % dB end单点调用f 900; % MHz d 5; % km L free_space_loss(f, d); fprintf(频率 %d MHz距离 %d km自由空间损耗 %.2f dB\n, f, d, L);运行结果大约是频率 900 MHz距离 5 km自由空间损耗 105.51 dB这里有个容易犯的错误有的同学会直接使用公式L 20log10(4pi*d/lambda)但d和lambda单位不统一得到的结果离谱。建议固定使用km加MHz的工程公式。调通之后如果你有多个距离点直接把d_km传成1xN的数组MATLAB会自动做向量运算。3.2 Okumura-Hata模型Okumura-Hata模型的城市公式L_urban 69.55 26.16log10(f) - 13.82log10(hb) - a(hm) (44.9 - 6.55*log10(hb)) * log10(d)其中a(hm)是移动台天线高度修正因子。中小城市a(hm) (1.1log10(f) - 0.7) * hm - (1.56log10(f) - 0.8)大城市且f 300MHz时a(hm) 3.2 * (log10(11.75*hm))^2 - 4.97如果处理郊区和开阔地需要在城市损耗基础上做额外修正。我在函数里加一个环境参数用字符串区分urban、suburban、openfunction L okumura_hata_loss(f_MHz, hb_m, hm_m, d_km, env_type) % OKUMURA_HATA_LOSS Okumura-Hata路径损耗模型 % 输入 % f_MHz - 频率单位 MHz适用 150 ~ 1500 % hb_m - 基站天线有效高度单位 m适用 30 ~ 200 % hm_m - 移动台天线高度单位 m适用 1 ~ 10 % d_km - 距离单位 km适用 1 ~ 20 % env_type - urban(默认) / suburban / open % 输出 % L - 路径损耗单位 dB % % 注意本函数是经验模型超出参数范围后结果仅供参考 if nargin 5 env_type urban; end if any(f_MHz 150) || any(f_MHz 1500) warning(Okumura-Hata模型严格适用范围为150MHz ~ 1500MHz); end if any(d_km 20) || any(d_km 1) warning(Okumura-Hata模型严格适用范围为1km ~ 20km); end % 移动台高度修正因子默认按中小城市计算 a_hm (1.1 * log10(f_MHz) - 0.7) .* hm_m - (1.56 * log10(f_MHz) - 0.8); % 如果你要支持大城市则根据频率分支处理 % 如果频率大于等于300MHz大城市使用 % a_hm 3.2 * (log10(11.75*hm_m)).^2 - 4.97; % 如果频率低于300MHz大城市使用 % a_hm 8.29 * (log10(1.54*hm_m)).^2 - 1.1; L_urban 69.55 26.16 * log10(f_MHz) ... - 13.82 * log10(hb_m) - a_hm ... (44.9 - 6.55 * log10(hb_m)) .* log10(d_km); % 环境修正 switch lower(env_type) case urban L L_urban; case suburban % 郊区修正 L L_urban - 2 * (log10(f_MHz/28)).^2 - 5.4; case open % 开阔地修正 L L_urban - 4.78 * (log10(f_MHz)).^2 ... 18.33 * log10(f_MHz) - 40.94; otherwise error(env_type仅支持urban、suburban、open); end end单点验证f 900; hb 30; hm 1.5; d 5; L okumura_hata_loss(f, hb, hm, d, urban); fprintf(Okumura-Hata城市模型损耗: %.2f dB\n, L);同样距离下Okumura-Hata结果会明显高于自由空间损耗这是正常的。城市环境里建筑遮挡和地面反射导致额外损耗。这个模型里最需要留意的是“基站天线有效高度”这个概念。它不等于站址海拔或铁塔物理高度而是基站天线高度减去移动台周围地面的平均海拔。在山区基站天线有效高度可能和纸面高度相差很大直接影响计算精度。3.3 COST231 Hata模型COST231 Hata模型公式L 46.3 33.9log10(f) - 13.82log10(hb) - a(hm) (44.9 - 6.55*log10(hb)) * log10(d) Cm其中Cm在中等城市和郊区为0dB大城市中心区域为3dB。a(hm)的计算方式和Okumura-Hata基本一致。function L cost231_hata_loss(f_MHz, hb_m, hm_m, d_km, city_center) % COST231_HATA_LOSS COST231 Hata路径损耗模型 % 输入 % f_MHz - 频率单位 MHz适用 1500 ~ 2000 % hb_m - 基站天线高度单位 m适用 30 ~ 200 % hm_m - 移动台天线高度单位 m适用 1 ~ 10 % d_km - 距离单位 km适用 1 ~ 20 % city_center - 逻辑值true表示大城市中心false表示中等城市/郊区 % 输出 % L - 路径损耗单位 dB if nargin 5 city_center false; end if any(f_MHz 1500) || any(f_MHz 2000) warning(COST231 Hata模型严格适用范围为1500MHz ~ 2000MHz); end % 移动台高度修正因子频率400MHz时大城市使用 a_hm 3.2 * (log10(11.75 * hm_m)).^2 - 4.97; % 城市中心额外损耗 if city_center Cm 3; % dB else Cm 0; % dB end L 46.3 33.9 * log10(f_MHz) ... - 13.82 * log10(hb_m) - a_hm ... (44.9 - 6.55 * log10(hb_m)) .* log10(d_km) Cm; end如果你要做郊区场景可以在主脚本里对结果再减去一个修正量。COST231标准本身给出的郊区修正和Okumura-Hata很像但不建议改动参考模型太多因为每加一层修正就多一层不确定性。需要注意COST231 Hata的频率项系数是33.9不是Okumura-Hata的26.16。这是模型标定的结果不能混用。很多人拿着COST231公式但频率系数抄成26.16出来的曲线明显偏低。3.4 SUI信道模型SUI模型不像Hata系列那样只给一个经验损耗值它还要考虑地形类型和阴影衰落。完整形式PL A 10gammalog10(d/d0) Xf Xh s其中A是参考距离d0处的自由空间损耗d0一般取100mgamma是路径损耗指数由地形类型和基站高度决定Xf是频率修正项Xh是接收天线高度修正项s是阴影衰落随机项单位dB地形参数表地形类型abc阴影衰落s(dB)A类4.60.007512.610.6B类4.00.006517.19.6C类3.60.005020.08.2gamma a - b*hb c/hbA 20log10(4pid0f/c)这里d0100mf和c单位要统一。Xf当f2000MHz时Xf 6*log10(f/2000)否则为0。XhA类地形-10.8*log10(hm/2)B类地形-10.8*log10(hm/2)C类地形-20.0*log10(hm/2)注意坐标基准。SUI模型的参考距离是100m不是1km。所以在做曲线时距离轴不要从一开始就按Hata的1km来画。function [L_det, L_shadow] sui_loss(f_MHz, hb_m, hm_m, d_km, terrain_type, use_shadow) % SUI_LOSS SUI信道模型路径损耗 % 输入 % f_MHz - 频率单位 MHz适用 2000 ~ 6000 % hb_m - 基站天线高度单位 m典型 20 ~ 40 % hm_m - 接收天线高度单位 m典型 1 ~ 10 % d_km - 距离单位 km % terrain_type - A / B / C地形类型 % use_shadow - 逻辑值是否叠加对数正态阴影衰落 % 输出 % L_det - 确定性路径损耗单位 dB不含阴影衰落 % L_shadow - 叠加阴影衰落后的损耗单位 dB if nargin 6 use_shadow false; end c_light 3e8; % 光速 m/s % 地形参数 switch upper(terrain_type) case A a 4.6; b 0.0075; c 12.6; s_sigma 10.6; case B a 4.0; b 0.0065; c 17.1; s_sigma 9.6; case C a 3.6; b 0.0050; c 20.0; s_sigma 8.2; otherwise error(terrain_type 必须是 A、B、C 之一); end d0 0.1; % 参考距离 100m 0.1km f_hz f_MHz * 1e6; % 转成Hz lambda c_light / f_hz; % 波长 m % 参考距离处的自由空间损耗 A 20 * log10(4 * pi * d0 * 1000 / lambda); % 路径损耗指数 gamma a - b * hb_m c / hb_m; % 频率修正 if f_MHz 2000 Xf 6 * log10(f_MHz / 2000); else Xf 0; end % 接收天线高度修正 if upper(terrain_type) C Xh -20.0 * log10(hm_m / 2); else Xh -10.8 * log10(hm_m / 2); end % 确定性路径损耗 L_det A 10 * gamma * log10(d_km / d0) Xf Xh; % 阴影衰落 if use_shadow L_shadow L_det s_sigma * randn(size(L_det)); else L_shadow L_det; end endSUI模型最需要注意的地方是它的“损耗指数”概念和Hata模型不一样。Hata模型把地形环境塞进修正项里SUI模型则通过gamma反映不同地形。A类地形gamma大路径损耗随距离增长快这是因为多径反射少、绕射损耗大C类地形gamma小传播条件更接近自由空间。4. 同场景对比仿真一组参数看4条损耗曲线4.1 对比实验代码现在把四个模型放一起跑。由于频率适用范围不同我会分两组对比一组用900MHz常规蜂窝频段比较自由空间、Okumura-Hata、SUI另一组用1800MHz比较自由空间、COST231 Hata。如果要强制放在同一张图频率只能统一到一个模型的有效范围内。主脚本如下。% main_simulation.m % 无线通信信道模型对比仿真 % 对比自由空间、Okumura-Hata、COST231 Hata、SUI clear; clc; close all; % ---------- 通用参数 ---------- f_MHz 900; % 频率 MHz hb_m 30; % 基站天线高度 m hm_m 1.5; % 移动台天线高度 m d_km 0.1:0.1:20; % 距离 km % ---------- 自由空间损耗 ---------- L_fs free_space_loss(f_MHz, d_km); % ---------- Okumura-Hata 城市 ---------- L_oh okumura_hata_loss(f_MHz, hb_m, hm_m, d_km, urban); % ---------- COST231 Hata 城市 ---------- L_co cost231_hata_loss(f_MHz, hb_m, hm_m, d_km, false); % ---------- SUI B类地形 ---------- L_sui_det sui_loss(f_MHz, hb_m, hm_m, d_km, B, false); % 绘图 figure(Color,w,Position,[100 100 900 600]); plot(d_km, L_fs, b-, LineWidth, 1.5); hold on; plot(d_km, L_oh, r-, LineWidth, 1.5); plot(d_km, L_co, g-, LineWidth, 1.5); plot(d_km, L_sui_det, m-, LineWidth, 1.5); grid on; xlabel(距离 (km)); ylabel(路径损耗 (dB)); title(900 MHz 信道模型路径损耗对比); legend(自由空间,Okumura-Hata,COST231 Hata,SUI-B类,Location,northwest); saveas(gcf, fullfile(results, compare_models_900MHz.png));跑完这张图后你能看到几个很直观的现象。第一自由空间损耗曲线最低四个模型里它永远是下界。第二Okumura-Hata在900MHz的典型宏蜂窝距离内损耗明显高于自由空间中距离后斜率也更陡。第三COST231 Hata虽然严格适用1800MHz以上但如果你把900MHz喂进去它也能给出一个结果只是会有警告而且曲线基本贴近Okumura-Hata的上方。我建议你把图分开画至少再加一张1800MHz的对比这样COST231 Hata和Okumura-Hata的差异更明显。4.2 结果如何解读判断模型输出是否合理不能只看“有没有报错”还要看几个指标。先看单点数值。900MHz、距离5km、基站高度30m、移动台1.5mOkumura-Hata城市模型算出来大概在150dB附近。这个数字是否符合预期要和你所在场景的实测均值对比。再看曲线斜率。自由空间损耗斜率是固定20dB/十倍程。Okumura-Hata和COST231 Hata在中远距离上的斜率受(44.9-6.55*log10(hb))影响基站越高斜率越小因为高天线能看到更远、绕射能力更强路径损耗随距离增长得更慢。SUI模型的斜率由gamma决定B类地形在30m站高下gamma大约是4.0-0.0065*3017.1/30约4.35左右也就是43.5dB/十倍程明显比Hata在中远距离上的斜率更陡。这在高频宽带系统里是符合预期的频率高、波长短对遮挡更敏感。阴影衰落是SUI模型特有的参数。你如果单次调用use_shadowtrue每次结果都会不同这是随机过程导致的不是BUG。要验证SUI的统计特性应该跑多次仿真然后看损耗分布直方图而不是看一次取值。5. 模型选型什么时候用哪个边界在哪5.1 按频段、距离、站高选型选型逻辑可以按一个简单流程确定。先看频段。如果频率在150到1500MHz优先用Okumura-Hata。如果频率在1500到2000MHz优先用COST231 Hata。如果频率在2GHz以上比如2.3GHz、2.5GHz、3.5GHzOkumura-Hata和COST231都不再适用这时SUI模型是更合适的选择。再看距离。Hata系列严格适用1到20kmSUI模型的参考距离是100m所以在小于1km的微蜂窝、微微蜂窝场景里SUI更有工程参考意义。但SUI也不是为室内或密集城市街道环境设计的如果你要仿真室内部署应该转用ITU-R P.1238或者3GPP的中高频路径损耗模型。再看基站高度。Hata系列在30到200m范围内依赖站高低于30m时外推结果可能偏大。SUI模型的gamma公式里包含hb项在20到40m基站高度范围内比较合理但如果你把基站高度设为10mgamma结果会严重偏离实测。5.2 工程化场景中的补充考量实际做项目时四个模型都是起点而不是终点。覆盖预测系统里通常还需要加入地形遮挡模型、建筑穿透损耗、人体损耗、雨衰或大气吸收损耗等修正。以COST231 Hata为例它只给了宏观平均损耗不包含树木、建筑物穿透、车辆遮挡等额外衰减。如果你做室内到室外的链路预算还要在模型结果上叠加一个建筑穿透损耗典型值在8到15dB之间具体取决于墙体和窗户类型。SUI模型的A、B、C地形分类在工程里应该尽量对照实际地形数据库。A类可以对应山地、密林B类对应丘陵、混合植被C类对应平原、城市路网相对平坦的区域。不要为了图简单全部设置成B类那样很可能低估了山区基站的覆盖半径也可能高估了平原乡村的损耗。模型参数是否越界也要记得检查。很多教材里说“这个模型适用于1到20km”但实际论文里有人把它外推到30km、50km。如果你的设计场景是农村广覆盖距离达到30kmHata模型只是趋势参考最好同时用其他模型做交叉验证或者引入实测数据做校准。6. 调参、排查和工程化落地6.1 常见报错与排查顺序我在帮别人调试MATLAB脚本时发现错误大多不是模型公式本身而是代码层面的小问题。最常见的错误是log10参数出现负值或零。比如你传入d_km0自由空间损耗公式里的log10(0)会变成-inf绘图中就会出现曲线断裂或数值警告。检查一下脚本里距离序列是否从0开始通常应该从0.1km开始。第二个常见问题是数组维度不匹配。比如hb_m、hm_m是标量d_km是1x200向量MATLAB在标量乘向量时没问题但如果你把频率也定义成向量那么所有项都要用点乘。我建议在函数内部统一使用.*、./和.^这样即使传入数组也不会因为运算符问题报错。第三个常见问题是COST231 Hata里的大城市修正。我在代码里把a_hm固定为大城市公式这会导致中小城市场景下结果偏高约几dB。如果你要精确仿真中小城市需要把a_hm改成中小城市表达式。第四个问题是SUI模型的参考距离。如果你知道SUI模型的d0100m但你没有把d_km除以0.1直接用了log10(d_km)曲线会整体偏高。公式里的log10(d/d0)必须写完整。排查顺序我一般这样定先看报错是在定义阶段、计算阶段还是绘图阶段。再看传入参数的量纲和数组尺寸。然后用一组已知数值做单点验证比如900MHz、5km、30m站高手工估算一个合理范围。最后再跑批量仿真确认曲线形态没有突变。6.2 从单点计算到批量扫参和链路预算当你把四个模型的基本函数跑通后下一步可以做批量扫参。比如你关心基站天线高度从20米到80米变化时5km小区边缘处的路径损耗下降多少。这时可以写一个循环hb_list 20:10:80; L_oh_list zeros(size(hb_list)); for i 1:length(hb_list) L_oh_list(i) okumura_hata_loss(900, hb_list(i), 1.5, 5, urban); end plot(hb_list, L_oh_list, o-); xlabel(基站天线高度 (m)); ylabel(5km处路径损耗 (dB));这个结果能帮你判断增高天线带来的增益是否值得。再进一步你可以把路径损耗模型接到链路预算公式里Pr(dBm) Pt(dBm) Gt(dBi) Gr(dBi) - L(dB)其中L就是模型计算的路径损耗。反向用还可以算最大允许路径损耗然后反推覆盖半径。这个操作在网络规划工具里很通用MATLAB里只需要把求解距离的任务转成数值求解。如果要做蒙特卡洛仿真SUI模型的阴影衰落项s可以每次生成一个随机量然后统计小区覆盖概率。比如跑10000次统计接收功率高于灵敏度的比例这个比例就是覆盖概率。这种统计仿真在Hata模型里很难直接做因为Hata模型不包含随机阴影项需要另外叠加对数正态随机变量。SUI模型把阴影衰落融进模型本身使用起来更方便。工程化落地时我建议把模型输出和真实路测数据做校准。经验模型本质是统计回归公式不同城市的建筑密度、道路宽度、植被情况都会造成偏差。你可以用路测数据反推出一个校正偏置量比如实测平均比模型低6dB那么后续仿真就在模型结果上加上这个偏置。这样得到的结果比直接套公式更接近实际。最后留几个我自己排查时会优先看的点。先看输入距离序列是否从0开始。很多人直接把d_km定义成0:0.1:20结果自由空间模型在0公里处出现-inf整个曲线被拉坏。从0.1km开始或者用max(d_km,0.001)做下限保护。再看输出单位。所有模型输出都是dB如果你要转成W或mW记住用10^(dBm/10)换算mW再用1e-3乘到W。链路预算里dBm和dBmW容易混淆建议统一用dBm。最后看适用频率。900MHz加载COST231 Hata虽然能跑但严格讲已经超出了适用范围结果只能作为趋势参考。如果你的仿真报告里涉及模型选型一定要说明每个模型的适用频段和参数范围这是评审专家和面试官最爱盯的点。这轮代码和思路跑下来你会发现信道建模本身不复杂难的是模型选型和参数边界。先把四个模型在每个典型场景下的损耗值记住再去看覆盖和干扰问题思路会清楚很多。
返回列表