免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

无线信道建模实战:四种路径损耗模型详解与MATLAB实现

无线信道建模实战:四种路径损耗模型详解与MATLAB实现 无线通信仿真的起点往往不是调制解调而是信道。很多人第一次在MATLAB里搭通信链路下意识会把注意力放在QPSK、LDPC、OFDM这些“显眼”的模块上信道就简单用AWGN带过。但一旦涉及覆盖预测、系统级仿真、基站选址、链路预算路径损耗模型就躲不开了。我最早做蜂窝网络仿真时就是直接拿自由空间损耗算接收功率结果输出和同事用商业网规软件算的相差二三十dB排查了半天才发现问题不在算法而在信道模型选错了场景。信道建模要解决的核心问题是在给定频率、距离、天线高度和传播环境的条件下尽量准确地估计电磁波从发端到收端经历的功率衰减。重要的是没有任何一个模型能普适所有场景。每个模型都自带一组假设环境是城区还是郊区距离范围是几百米还是几十公里频率是900MHz还是2.6GHz收发天线是高架站还是贴近地面的终端如果这些假设没对上公式再怎么精确结果也只是一组精确的错误。这篇文章会围绕自由空间损耗、Okumura-Hata、COST231 Hata、SUI信道模型四个经典模型从原理、边界、MATLAB实现到工程落地把信道建模这条路完整走一遍。1. 信道建模不是套公式而是理解“传播假设”1.1 路径损耗模型到底在算什么路径损耗模型做的事情用一句话概括就是给定发射功率和收发信机之间的距离估算接收端还能收到多大功率。在MATLAB仿真里这个值通常以dB形式出现在链路预算中接收功率(dBm) 发射功率(dBm) 天线增益(dB) - 路径损耗(dB) - 其他损耗(dB)所以路径损耗直接决定了覆盖半径、小区边缘速率、干扰信号强度以及系统级仿真里的信噪比和信干噪比。很多人觉得它简单无非是距离越远损耗越大频率越高损耗越大。但工程里难的不是方向而是“大多少”。不同模型的差距可能远比你想象的大。同一个900MHz、基站高30米、距离1公里的场景自由空间损耗大约91.5dB而Okumura-Hata城市模型大约是127dB两者相差35dB以上。35dB意味着接收功率相差几千倍这在覆盖规划里是“有覆盖”和“没覆盖”的差别。1.2 理论模型和经验模型的定位差异自由空间损耗是理论模型它只考虑电磁波在真空中扩散导致的功率密度下降不反射、不绕射、不吸收。这个模型很有价值不是因为它在真实环境中准确而是因为它给出了一个“完美情况”的下限任何实际传播环境的路径损耗都不会低于自由空间损耗。你可以把它理解为一条理想基线。Okumura-Hata、COST231 Hata、SUI模型都属于经验模型或半经验模型。它们基于大量实测数据回归得到把城市建筑、树木、地形起伏、大气吸收等因素通过修正项打包进公式。这类模型的优势是计算简单适用于工程快速评估代价是适用条件很窄频率、距离、天线高度超出范围后误差会急剧增大。所以channel modeling的第一步不是打开MATLAB写公式而是先回答我的仿真场景到底属于视距还是非视距是宏蜂窝还是微蜂窝频率落在哪个频段地形是城市、郊区还是开阔地只有先明确这些前提模型选择才有意义。2. 四个模型怎么选从自由空间到SUI的演进逻辑2.1 自由空间损耗所有模型的理论起点自由空间损耗模型来自Friis传输公式在无遮挡、无反射的理想视距条件下成立。工程上常用公式PL_free(dB) 20 * log10(d) 20 * log10(f) 32.44其中d的单位是kmf的单位是MHz。注意这个公式默认收发天线各向同性没有考虑天线高度。它不依赖基站高度、终端高度和地面反射所以适合卫星通信、高空无人机中继、开阔区域短距离点对点等场景。在蜂窝网络中它通常只作为理论参考或者作为视距分量叠加在多径模型里。在MATLAB里实现它非常简单function PL free_space_loss(d_km, f_MHz) % d_km距离单位km % f_MHz频率单位MHz PL 20*log10(d_km) 20*log10(f_MHz) 32.44; end2.2 Okumura-Hata城市宏蜂窝的经验标杆Okumura-Hata模型是早期基于东京城区大量测量数据得到的经验模型后来被Hata整理成便于计算的解析式。它适用于150MHz到1500MHz基站有效天线高度30到200米移动台高度1到10米距离1到20公里。典型场景是城市宏蜂窝覆盖。城市地区Okumura-Hata的公式如下PL_OH_city(dB) 69.55 26.16*log10(f) - 13.82*log10(hb) - a(hm) (44.9 - 6.55*log10(hb))*log10(d)其中f 是工作频率单位MHzhb 是基站有效天线高度单位mhm 是移动台天线高度单位ma(hm)是移动台天线高度修正因子在城市环境里a(hm) (1.1*log10(f) - 0.7)*hm - (1.56*log10(f) - 0.8)对于郊区和开阔地Hata模型还给出了修正项。郊区修正PL_suburban PL_city - 2 * (log10(f/28))^2 - 5.4开阔地修正PL_open PL_city - 4.78*(log10(f))^2 18.33*log10(f) - 40.94这个模型在城市宏蜂窝规划里作用很大直到今天仍是很多教材和工程工具的默认参考。但它最大的限制是频率上限1500MHz后来3G/4G普遍工作在1800MHz以上于是有了COST231 Hata。2.3 COST231 Hata把经典模型扩展到2GHzCOST231 Hata是欧洲COST231委员会在Hata模型基础上扩展的版本适用频率扩展到1500MHz到2000MHz基本覆盖了2G GSM1800、3G WCDMA、部分4G LTE低频段。城市宏蜂窝公式PL_COST(dB) 46.3 33.9*log10(f) - 13.82*log10(hb) - a(hm) (44.9 - 6.55*log10(hb))*log10(d) Cm其中Cm是城市中心区域修正项大城市中心等密集城区取3dB中等城市和郊区取0dB。为什么COST231 Hata和Okumura-Hata看起来很像因为它本来就是Hata公式的频段扩展保留了“平坦费斯奈尔区”和“等效高度”等宏蜂窝传播假设。两者在900MHz附近有重叠但在1800MHz以上的适用性明显更好。需要提醒的是COST231 Hata不太适合低频段比如450MHz或者700MHz也不要拿它做微蜂窝或室内覆盖因为那些场景的传播机制完全不同。2.4 SUI模型面向固定无线接入的三种地形SUI模型全称Stanford University Interim模型最初是为了研究固定无线接入比如IEEE 802.16 WiMAX提出的。它把地形按障碍物密度和植被深度分成三类地形A丘陵、中等以上树木密度路径损耗指数n较高地形B中等起伏、树木密度中等适合典型的郊区宏蜂窝地形C平坦、树木稀少近似开阔地。SUI模型的基本路径损耗公式为PL_SUI(dB) A 10*n*log10(d/d0) X_f X_h s其中d0是参考距离通常取100mA是参考距离处的路径损耗按自由空间损耗计算n是不同地形的路径损耗指数X_f是频率修正因子和f/2000相关X_h是接收天线高度修正因子s是阴影衰落因子服从对数正态分布。在后面的MATLAB实现里我会给出一组常用的参考参数。但这里必须强调SUI模型并不是一个“全世界统一”的模型不同标准和文档里的地形分类、n值、修正因子描述可能略有出入。落地时要以你正在用的系统标准文件为准代码里的参数应该可配置。2.5 横向对比速查表模型频率范围距离范围场景定位主要输入自由空间损耗任意任意视距理想视距基线距离、频率Okumura-Hata150~1500 MHz1~20 km宏蜂窝城市/郊区/开阔地距离、频率、基站高度、终端高度、环境类型COST231 Hata1500~2000 MHz1~20 km宏蜂窝城市密集区/城区/郊区距离、频率、基站高度、终端高度、环境类型SUI模型2~3 GHz附近0.1~几十km固定无线接入三类地形距离、频率、基站高度、终端高度、地形类别这张表最直接的用途是帮你建立第一道筛选先看频率范围再看场景最后才是调参数。3. 用MATLAB把四种模型变成可复用代码3.1 环境准备与函数设计MATLAB里实现这些模型不需要额外工具箱只要基础环境就可以。我更建议的做法不是写一个脚本草草跑一遍而是把每个模型封装成独立函数统一输入输出格式这样后续做批量仿真、参数扫描、模型对比都会方便很多。统一接口可以定义成PL ModelName(d_km, f_MHz, hb_m, hm_m, env)其中d_km收发机距离单位kmf_MHz频率单位MHzhb_m基站天线有效高度单位mhm_m移动台天线高度单位menv环境标识例如urban、suburban、open、A、B、C。这样定义的好处是当你需要更换模型时只需要改函数名不用改外部调用逻辑。这在参数扫描和Monte Carlo仿真里会省下大量时间。3.2 四个模型的MATLAB实现自由空间损耗已经在前面给出这里直接看其余三个。Okumura-Hata函数function PL okumura_hata_loss(d_km, f_MHz, hb_m, hm_m, env) % Okumura-Hata模型 % env可选urban, suburban, open a_hm (1.1*log10(f_MHz) - 0.7)*hm_m - (1.56*log10(f_MHz) - 0.8); PL 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 env case suburban PL PL - 2*(log10(f_MHz/28))^2 - 5.4; case open PL PL - 4.78*(log10(f_MHz))^2 18.33*log10(f_MHz) - 40.94; % case urban 不修正 end endCOST231 Hata函数function PL cost231_hata_loss(d_km, f_MHz, hb_m, hm_m, env) % COST231 Hata模型 % env可选urban大城市中心Cm3dB或 medium中等城市/郊区Cm0dB a_hm (1.1*log10(f_MHz) - 0.7)*hm_m - (1.56*log10(f_MHz) - 0.8); if strcmp(env, urban) Cm 3; else Cm 0; end PL 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; endSUI模型函数采用一组常见的参考参数实际使用时以标准文档为准function PL sui_loss(d_km, f_MHz, hb_m, hm_m, terrain) % SUI模型terrain可选A、B、C d0 0.1; % 参考距离单位km即100m lambda 3e8 / (f_MHz * 1e6); % 波长单位m A 20*log10(4*pi*d0*1000/lambda); % 参考距离处的自由空间损耗 switch terrain case A n 4.6; case B n 4.0; case C n 3.6; otherwise error(terrain must be A, B or C); end Xf 6.0 * log10(f_MHz / 2000); if strcmp(terrain, A) || strcmp(terrain, B) Xh -10.8 * log10(hm_m / 2); else Xh -20.0 * log10(hm_m / 2); end s 0; % 阴影衰落先取0需要时再加正态随机数 PL A 10*n*log10(d_km/d0) Xf Xh s; end注意SUI模型中包含一个随机阴影衰落项s。在确定性的路径损耗曲线里我们先把它设为0在做链路级或系统级仿真时可以给它加一个均值为0、标准差为8~10dB的正态随机数这会让接收功率更接近真实衰落环境。3.3 画一条对比曲线验证模型差异代码写好了现在用一条仿真曲线看四个模型的差异。这里要特别小心不能把频率适用范围不同的模型强行放在同一个频段对比否则结论没有工程意义。更合理的做法是分两个场景第一个场景用900MHz对比自由空间损耗和Okumura-Hata城市模型clear; clc; d_km 0.5:0.1:10; f_MHz 900; hb_m 30; hm_m 1.5; PL_free free_space_loss(d_km, f_MHz); PL_oh okumura_hata_loss(d_km, f_MHz, hb_m, hm_m, urban); figure; plot(d_km, PL_free, b-, LineWidth, 1.5); hold on; plot(d_km, PL_oh, r-, LineWidth, 1.5); xlabel(距离 (km)); ylabel(路径损耗 (dB)); legend(自由空间, Okumura-Hata城市); title(900MHz 路径损耗对比); grid on;第二个场景用2.5GHz对比SUI模型的三种地形并可以加入COST231 Hata在2GHz附近作为参考d_km 0.2:0.1:10; f_MHz 2500; hb_m 30; hm_m 1.5; PL_sui_a sui_loss(d_km, f_MHz, hb_m, hm_m, A); PL_sui_b sui_loss(d_km, f_MHz, hb_m, hm_m, B); PL_sui_c sui_loss(d_km, f_MHz, hb_m, hm_m, C); figure; plot(d_km, PL_sui_a, r-); hold on; plot(d_km, PL_sui_b, g-); plot(d_km, PL_sui_c, b-); xlabel(距离 (km)); ylabel(路径损耗 (dB)); legend(SUI A-丘陵树木, SUI B-中等, SUI C-平坦); title(2.5GHz SUI模型路径损耗对比); grid on;从曲线上能看到地形越复杂路径损耗指数越高距离越远时损耗差异越大。这种可视化其实是一种很好的“模型健壮性检查”如果两条曲线在该场景下几乎重合说明当前场景对模型选择不敏感如果差异巨大那模型选错就会导致仿真结果完全不可信。4. 仿真一路绿灯实测却对不上排查这些边界很多人在MATLAB里把模型跑通后会以为大功告成。但真正放到工程里问题往往不是模型公式错误而是使用边界和输入条件没搞清楚。下面几个坑我基本都踩过。4.1 模型选错比参数不精更致命模型选择是最大误差来源。比如用自由空间损耗做城市覆盖误差可能达到几十dB用Okumura-Hata做1.8GHz以上的系统频率已经超出适用范围误差也会迅速增大。排查思路是先确认当前场景的频率范围落在哪个模型适用范围再确认环境是城区、郊区、还是开阔地最后确认是宏蜂窝还是微蜂窝宏蜂窝用Hata类模型微蜂窝通常要考虑街道波导和绕射损耗。如果场景是室内、隧道、地下车库那这四种模型都不适合需要走射线追踪或统计模型。4.2 天线高度不是你填的那个海拔Hata类模型里的hb是基站“有效天线高度”不是基站海拔高度也不是铁塔的物理高度。有效高度的定义通常是基站天线相对周围地面平均高度的差值。比如基站建在山顶上天线离地面50米但山体比周围城区高100米那周围区域的有效高度就可能是负值。直接把天线物理高度填进公式计算出来的损耗会完全失真。移动台高度同理Hata模型假设移动台在1到10米之间也就是手持终端或车载终端。如果你仿真的是无人机、飞行器或者贴地传感器不能直接用这个模型。4.3 距离到底是水平距离还是斜距在自由空间模型中距离是收发点之间的直线距离斜距。但在Hata类宏蜂窝模型里公式中的d通常指水平覆盖距离因为经验模型回归时用的是基站到移动台的水平距离投影。如果终端在室内或高楼附近实际传播路径可能有很大的高度差直接拿三维几何距离代入宏蜂窝模型会产生明显偏差。使用前要阅读模型原始定义确定它到底基于斜距还是水平距离。4.4 别忽视频率适用范围和单位这四个模型的公式里频率、距离、高度的单位都要严格匹配。我在看一些仿真代码时经常发现有人把频率填成了GHz距离填成了米结果算出来的数值是天文数字然后怀疑MATLAB精度有问题。建议做法是在函数入口做一次单位校验或显式注释。比如% f_MHz频率单位MHz % d_km距离单位km % hb_m基站高度单位m % hm_m终端高度单位m哪怕只是简单注释也能避免隔几个月后回读代码时的单位混乱。4.5 单点计算没问题不代表批量仿真没问题如果你的仿真不是画一条曲线而是要在1000个用户位置、多个基站候选站址之间循环计算路径损耗那就要考虑两点第一输入向量化。MATLAB里log10和加法都是向量化的可以直接传向量或矩阵避免用for循环逐点计算。上面示例里的d_km本身是向量函数完全兼容。第二异常值处理。距离不能为0否则log10为负无穷SUI模型里距离小于参考距离d0时公式中的log10(d/d0)为负得出的损耗可能低于自由空间损耗这在物理上不合理。需要在调用前加判断if any(d_km d0) error(SUI模型要求距离不小于参考距离d0); end第三随机阴影衰落项不要每次都在同一个位置重新生成。做系统级仿真时通常对每个用户位置生成一次阴影衰落然后固定多次快照叠加。否则每次循环得到的结果随机漂移太大无法判断系统性能变化是来自信道还是来自算法。5. 从“能跑”到“能用”沉淀自己的信道建模工具箱5.1 统一接口才是工具的第一步如果你只是临时算一个数写脚本没问题。但如果要长期做无线仿真我强烈建议把信道模型做成一个工具箱而不是散落各处的脚本。一个简单的封装思路是写一个主入口函数用参数选择模型function PL pathloss_model(model, d_km, f_MHz, hb_m, hm_m, env) switch model case free PL free_space_loss(d_km, f_MHz); case okumura_hata PL okumura_hata_loss(d_km, f_MHz, hb_m, hm_m, env); case cost231_hata PL cost231_hata_loss(d_km, f_MHz, hb_m, hm_m, env); case sui PL sui_loss(d_km, f_MHz, hb_m, hm_m, env); otherwise error(Unknown model: %s, model); end end这样上层仿真代码只需要调用一个函数后续加新模型也不会影响已有代码。更进一步可以把天线增益、馈线损耗、连接器损耗、人体损耗、穿透损耗都做成独立模块统一加到链路预算里。这样信道模型就真正成了整个仿真系统的基础设施。5.2 用路测数据反向校准模型工程上最忌“模型贴上去就不管”。真实环境千变万化经验模型只是统计平均结果。如果手头有路测数据一定要用路测数据反向校准模型参数。校准的基本流程是在目标频段收集若干点位的实际接收功率从路测数据中反推出每个点位的实测路径损耗用MATLAB拟合出最适合当前环境的路径损耗指数n和阴影衰落标准差对比标准模型参数和实测拟合参数的差异把修正后的参数固化到仿真配置里。比如SUI模型中的n标准参考值有4.6、4.0、3.6等但某个城市区域实测下来n可能只有3.2这很常见。修正后的模型会比原模型可靠得多。5.3 建模只是起点真正难的是保持“模型意识”回到文章开头的问题信道建模从来不是“一个公式套一下”那么简单。自由空间损耗、Okumura-Hata、COST231 Hata、SUI模型各有各的假设、边界和工程场景。掌握它们的最好方式不是把公式背下来而是把每个模型都放回到它诞生的环境里理解它为什么长这样它忽略了哪些效应超出什么条件会失效用MATLAB把这些模型写出来只是最低门槛。真正有价值的能力是拿到一个仿真需求时能迅速判断当前场景应该选哪个模型、哪些参数必须修正、仿真结果和真实环境的偏差大概有多大。这种判断力需要靠一次次实践、一次次对比实测数据来积累。如果你刚开始接触无线通信仿真我的建议是从这四个模型入手把每个模型写成MATLAB函数画一条完整的路径损耗曲线再手动改一两个参数看看曲线随距离和频率如何变化。这个过程做完你对信道建模的理解会扎实一大截。
返回列表