简介:面向无线通信与移动通信领域的学习者和研究者,这份资源围绕自由空间损耗模型、奥村哈塔模型、COST231哈塔模型以及SUI信道模型,完成了理论分析并给出MATLAB仿真实现。压缩包共包含21个文件,其中20个为MATLAB脚本(.m文件),1个为Word论文(.doc文件),总大小仅323KB,轻量便携且下载方便。脚本分别对自由空间损耗、奥村哈塔损耗、COST231哈塔损耗以及802.16标准中的SUI信道进行了仿真,并绘制了信道特性与功率谱密度对比图;Word论文则系统梳理了无线信道的基本概念、各类模型的适用场景和理论公式推导,有助于理解移动通信中的抗干扰与抗衰落策略。目前该资源已有1042人学习下载,特别适合通信工程专业学生在课程设计、毕业设计或信道建模入门阶段参考使用。
1. 无线信道模型仿真,从公式到曲线一次配齐
无线信道里跑出来的路径损耗曲线不对,先怀疑的不是公式,而是函数的写法。这套资源是四个 MATLAB 脚本加一份 word 论文,把自由空间损耗、Okumura-Hata、COST231-Hata 和 802.16 标准的 SUI 信道模型从公式到仿真曲线全部串了一遍。手里没有现成代码、论文又急着出图的人会看得比较舒服,脚本里的参数基本都能直接改。我做链路预算时拿它验证过一组城市宏蜂窝数据,曲线量级和商用覆盖工具基本吻合。适合正在做信道仿真课程设计、毕业论文基础仿真,或者工作中需要快速出路径损耗对比图的读者。
2. 自由空间损耗与 Okumura-Hata:从 Friis 公式到城市宏蜂窝
2.1 自由空间损耗:从 Friis 公式写第一个仿真函数
自由空间损耗是所有路径损耗模型的地基。它描述的是发射机和接收机之间没有任何遮挡、只有电磁波在理想介质中扩散时的能量衰减。严格说这不叫信道模型,而是一个参考基准,其他经验模型都是在它基础上叠加了地形、建筑物、大气等因素的修正项。
仿真里最常用的表达式是 Friis 公式的对数形式:
% a_free_space.m % 自由空间损耗:Friis 公式 function L = free_space_loss(f_MHz, d_km, Gt_dB, Gr_dB) % f_MHz : 载波频率,单位 MHz % d_km : 收发距离,单位 km % Gt_dB : 发射天线增益,单位 dBi,无增益时设为 0 % Gr_dB : 接收天线增益,单位 dBi,无增益时设为 0 L = 32.44 + 20*log10(f_MHz) + 20*log10(d_km) - Gt_dB - Gr_dB; end这个函数里 32.44 是常数项,它由光速、球面扩散和单位换算共同决定,频率用 MHz、距离用 km 时直接套。20log10(f_MHz) 和 20log10(d_km) 说明自由空间损耗和频率、距离都呈对数线性关系,距离每翻一倍,损耗增加约 6dB。
提示:天线增益的符号要注意。Friis 公式里天线增益是加在接收功率上的,所以损耗计算里要减去增益值。脚本参数设 0 就是纯路径损耗,设具体 dBi 值就变成包含天线增益的链路预算。
2.2 Okumura-Hata 模型的城市宏蜂窝公式展开
Okumura-Hata 模型是 Okumura 实测曲线被 Hata 拟合成解析式后的结果,专门用于城市宏蜂窝环境。它的适用频段是 150~1500MHz,基站高度 30~200 米,终端高度 1~10 米,距离 1~20 公里。超出这个范围可以用,但误差会明显变大,仿真论文里一般会标注「结果仅供参考」。
% b_Okumura_Hata_loss.m % Okumura-Hata 模型:城市/郊区/开阔地三类场景 function [L_urban, L_suburban, L_open] = okumura_hata(f_MHz, d_km, hb_m, hm_m) if f_MHz < 150 || f_MHz > 1500 warning('Okumura-Hata 严格适用频段为 150~1500MHz'); end % 终端高度修正因子 a_hm,中小城市场景 a_hm = (1.1*log10(f_MHz) - 0.7)*hm_m - (1.56*log10(f_MHz) - 0.8); % 城市环境基础损耗 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); % 郊区修正:比城市损耗低 L_suburban = L_urban - 2*(log10(f_MHz/28))^2 - 5.4; % 开阔地修正:损耗更低,公式为 Hata 给出的经验修正 L_open = L_urban - 4.78*(log10(f_MHz))^2 + 18.33*log10(f_MHz) - 40.98; end三个输出分别对应城市、郊区、开阔地。参数上最关键的是 a_hm,它是移动台高度修正因子,频率不同时系数不同。如果你在其他教材里看到 a_hm 的表达式不一样,大概率是大城市和小城市的区别:大城市在 f_MHz > 300MHz 时有单独的二次项修正,这里用的是中小城市版本,仿真入门场景够用。
2.3 三个最容易改错的参数位置
第一个是基站高度 hb_m。Okumura-Hata 里基站天线高度取的是天线挂高,不是海拔也不是楼顶高度,如果你把楼高加进去了,13.82*log10(hb_m) 这一项会明显压低损耗曲线。第二个是距离 d_km,代码里没有加距离范围判断,实际使用时要自己保证在 1~20km 内,低于 1km 时曲线会偏陡。第三个是频率 f_MHz,很多同学把 2.4GHz 直接代进来跑 Okumura-Hata,这就是拿错模型了,2.4GHz 应该用 COST231-Hata 或者 SUI 模型。
改完参数后建议先跑一条频率不变、距离从 1 到 20km 的曲线,看斜率是否接近 40dB/decade。Okumura-Hata 的路径损耗指数在 3.5 左右,也就是距离每翻倍损耗增加约 10.5dB,比自由空间的 6dB 明显更陡。看到这个特征基本说明脚本没跑错。
3. COST231-Hata 模型:1.5GHz 以上频段的修正与对比
3.1 为什么要有 COST231-Hata:Okumura-Hata 的频段不够用
Okumura-Hata 到 1500MHz 就到头了,而 GSM1800、3.5GHz 固定无线接入这些场景需要更高频段的路径损耗估计。COST231 项目组在 Hata 公式基础上做了频率修正,把适用频段拓展到 1500~2000MHz,这也是它名字里带 231 的原因。基站高度、终端高度、距离的适用范围和 Okumura-Hata 基本一致,只是系数做了重新拟合。
两者在 1500MHz 附近应当非常接近,这是验证仿真脚本是否正确的重要依据。如果你的代码在 1500MHz 处两条曲线差了 5dB 以上,那一定有一个参数用错了。
3.2 仿真代码与系数说明
% c_COST231_hata_model.m % COST231-Hata 模型,适用 1500~2000MHz 城市宏蜂窝 function L = cost231_hata(f_MHz, d_km, hb_m, hm_m, city_type) % city_type: 'urban' 城市 / 'suburban' 郊区 / 'open' 开阔地 if f_MHz < 1500 || f_MHz > 2000 warning('COST231-Hata 严格适用频段为 1500~2000MHz'); end % 终端高度修正因子,与 Okumura-Hata 形式一致 a_hm = (1.1*log10(f_MHz) - 0.7)*hm_m - (1.56*log10(f_MHz) - 0.8); C = 0; % 大城市中心修正项,中小城市为 0 if strcmp(city_type, 'urban_large') C = 3; % 大城市密集区域附加损耗 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) + C; endCOST231-Hata 和 Okumura-Hata 的差别集中在三个地方。常数项从 69.55 变成 46.3,频率系数从 26.16 变成 33.9,前者是因为频率项权重变大后常数项重新平衡。距离衰减系数 (44.9 - 6.55*log10(hb_m)) 跟 Okumura-Hata 完全一样,说明基站高度对距离斜率的影响规律是一致的。C 是大城市中心修正项,一般取 0 或 3dB,仿真对比时建议把 C=0 和 C=3 的两条线画在一起,可以直观看到密集城区的附加损耗。
3.3 三个模型的频段分工与曲线特征对比
| 模型 | 适用频率 | 适用距离 | 典型场景 | 对数距离斜率特征 |
|---|---|---|---|---|
| 自由空间 | 任意 | 任意 | 视距微波中继 | 20dB/decade |
| Okumura-Hata | 150~1500MHz | 1~20km | 城市宏蜂窝 GSM900 | 约 35~40dB/decade |
| COST231-Hata | 1500~2000MHz | 1~20km | 城市宏蜂窝 GSM1800 | 约 38~45dB/decade |
把这三个模型的曲线画在同一张图里,频率都取 1800MHz 时,自由空间损耗最低,COST231-Hata 最高,Okumura-Hata 介于中间但更接近 COST231。如果频率取 900MHz,Okumura-Hata 要高于 COST231-Hata,因为后者在频段外推时需要谨慎。做课程设计时,这张对比图通常是论文里的核心图,脚本里已经包含了画图逻辑,直接用即可。
注意:COST231-Hata 原版公式里没有开阔地修正项,如果你需要对比开阔地场景,很多教材直接套用 Okumura-Hata 的开阔地修正系数,这在低频段可以接受,高频段建议只画城市和郊区两条线,避免引入不必要的争议。
4. SUI 信道模型:从 802.16 规范到 MATLAB 仿真落地
4.1 802.16 规范的三种地形与五抽头结构
SUI 模型(Stanford University Interim)是 IEEE 802.16 宽带无线接入规范里推荐的信道模型,用于 2.5GHz 频段固定无线接入系统的性能评估。它把传播环境分成三类地形:SUI-1 近似视距的开阔地形,SUI-3 中等衰落地形,SUI-5 典型城市或林区强衰落地形。每一个地形对应一组抽头参数,每个抽头定义了相对时延、功率比例和 K 因子(莱斯因子)。
信道分别与 PSD 仿真脚本就是针对这个模型做的。跟前面两个经验模型最大的区别是,SUI 是宽带多径模型,输出不是一条损耗曲线,而是一组多径抽头的冲激响应或频率响应,再通过 PSD 观察多普勒扩展和频率选择性。
先看最常用的 SUI-3 地形参数:
| 抽头 | 时延(us) | 功率(dB) | K因子(线性) |
|---|---|---|---|
| 1 | 0 | 0 | 1 |
| 2 | 0.4 | -12 | 0 |
| 3 | 0.9 | -12 | 0 |
第一个抽头带 K 因子,代表有直射分量,后面两个是瑞利衰落分量。SUI-5 的功率延迟分布更分散,时延长达 10us。仿真时要重点观察频率选择性,如果相干带宽小于信号带宽,就说明这个信道环境对 OFDM 系统来说需要加均衡或者足够的保护间隔。
4.2 MATLAB 实现:多径信道生成与频率响应
% d_SUI_channel.m % SUI-3 信道模型仿真:生成信道冲激响应和频率响应 function [h_impulse, H_freq] = sui3_channel(fs, num_samples) % fs : 采样率,单位 Hz % num_samples: 样本点数 delays_us = [0, 0.4, 0.9]; % 相对时延,单位 us power_dB = [0, -12, -12]; % 各抽头平均功率,单位 dB k_factor = [1, 0, 0]; % 莱斯K因子,0表示瑞利衰落 % 计算各抽头的幅度 amp = sqrt(10.^(power_dB/10)); h_impulse = zeros(1, num_samples); % 为每个抽头生成独立的复高斯衰落序列 for tap = 1:length(delays_us) delay_samples = round(delays_us(tap) * fs / 1e6); h_complex = (randn(1, num_samples) + 1i*randn(1, num_samples)) / sqrt(2); % 根据K因子叠加直射分量 if k_factor(tap) > 0 k = k_factor(tap); h_complex = sqrt(k/(k+1)) + sqrt(1/(k+1)) * h_complex; end % 写入对应时延位置 idx_start = delay_samples + 1; if idx_start <= num_samples len = min(num_samples - idx_start + 1, num_samples); h_impulse(idx_start:end) = h_impulse(idx_start:end) + ... amp(tap) * h_complex(1:len); end end % 归一化平均功率 h_impulse = h_impulse / sqrt(sum(abs(h_impulse).^2)); H_freq = fft(h_impulse, num_samples); end这段脚本的思路是:先按功率延迟分布确定每个抽头的幅度,再为每个抽头生成独立的复高斯随机序列模拟衰落,K 因子非零时叠加一个常数直射分量。时延换算成采样点用 delay_samples = round(delays_us * fs / 1e6),fs 是采样率,换算不对会导致多径位置全部错位。
归一化那一步很多人会忽略。不归一化的话,仿真得到的信道平均功率不等于 1,后续叠加噪声时信噪比会整体偏移,做 BER 曲线时结果全乱。我一般跑完会检查 sum(abs(h_impulse).^2) 是否等于 1,偏差超过 0.05 就回头查参数。
4.3 多普勒频移与 PSD 仿真的细节
SUI 模型的 PSD 仿真主要看多普勒扩展对信道时变特性的影响。固定无线接入场景下终端不移动,但环境散射体在动,所以多普勒频移不能直接取 0。脚本里典型做法是用经典 Jakes 谱或 flat spectrum 作为多普勒谱,再通过滤波器成形。
常见参数是最大多普勒频移 fD = 2Hz 到 100Hz 之间,802.16 固定接入通常取 2Hz 或 20Hz 两档。多普勒频移越大,信道随时间变化越快,OFDM 符号之间的相关性越低。观察方法就是把 H_freq 的时间序列画成瀑布图或直接看 PSD 形状,Jakes 谱应该是浴盆形,两端翘起中间平坦。
这里最容易翻车的是采样率和符号时长的匹配。fD 取 2Hz 时,相干时间大约 0.5 秒,采样率太低会导致多普勒频谱被混叠。我一般把采样率设为最大多普勒频移的 100 倍以上,比如 fD=20Hz 就至少取 fs=2kHz,不然 PSD 曲线高频段会翘出假峰。
5. 四模型仿真常见问题排查:从波形异常到论文图表对不上
5.1 自由空间损耗曲线在近距离处出现负值
现象:d 取 0.001km 时,损耗算出 6dB 或更小,甚至出现负的损耗值,直觉上不对。
原因:自由空间损耗公式在距离极近时本身趋近于 32.44 + 20log10(f),距离项为负值。这在小数点后几位的近距离仿真里会放大数值误差,而且实际工程中近场区域存在天线近场效应,Friis 公式根本不适用。
解决:给函数加上距离下限判断。常见做法是 d_km 小于 0.01 时直接赋值为 0.01,或者在上层脚本限定仿真距离从 0.1km 起步。论文里如果画了近场曲线,需要在图注注明「近场区域仅作趋势参考」。
5.2 Okumura-Hata 和 COST231-Hata 在 1500MHz 处接不上
现象:两条曲线在 1500MHz 附近有 3~5dB 跳变,看起来像同一个频点出现了两套结论。
原因:两个模型的常数项和频率系数不同,理论上在边界频点会有偏差。COST231 团队当时是对 Hata 公式的拟合修正,并非强制在 1500MHz 处与 Okumura-Hata 严格相等。如果你跑出来的差距超过 5dB,大概率是 a_hm 选了大城市版本或者 C 项加错了。
解决:对比仿真时统一用中小城市修正因子,C 项保持 0。如果论文需要平滑过渡,可以采用线性插值的方式在 1400~1600MHz 之间做模型切换,不过这属于工程处理,不是标准做法,论文里要写清楚否则容易被审稿人质疑。
5.3 SUI 信道冲激响应时延位置错位,多径叠在一起
现象:h_impulse 里三个抽头没有出现在期望位置,时延 0.4us 的抽头跑到了和第一个抽头重叠的位置。
原因:采样率 fs 和时延转换没有统一单位。0.4us 在 fs=1MHz 采样率下只有 0.4 个采样点,取整后变成 0,两路信号直接叠加。
解决:先用 delays_samples = round(delays_us * fs / 1e6) 计算完再检查。建议 fs 至少取 10MHz,这样 0.4us 对应 4 个采样点,时延分辨率足够,冲激响应才能看出清晰的多径间隔。
5.4 PSD 曲线高频端出现明显的假峰
现象:用 pwelch 画信道包络 PSD,低频段符合 Jakes 谱形状,高频段却翘起来一个尖峰。
原因:多普勒频移 fD 设置后,采样率没有相应提高,多普勒谱发生了频谱混叠。另一个常见原因是随机序列波动太大,功率谱估计时没有加窗平均。
解决:把采样率提高到 fD 的 100 倍以上,pwelch 加汉宁窗并做 8 段重叠平均。我一般还会对比两次独立运行的结果,如果 PSD 形状差异很大,说明样本点数不够,需要把 num_samples 增大到 2 万以上。
5.5 论文里的仿真图与 MATLAB 跑出来的图对不上
现象:word 论文里贴的曲线和附带的脚本运行结果不一致,有的参数对不上,有的曲线形状不同。
原因:资源打包时论文可能对应的是某一版参数,脚本后来被修改过又没有同步更新论文。这是课程设计和论文打包最常见的版本管理问题。
解决:拿到资源先跑一遍脚本,核对脚本里的注释参数和论文图表里的标注是否一致。不一致时以脚本为准重新生成图,再替换论文插图。我一般会在脚本顶部加一行注释记录生成时间,下次修改不会被带偏。
6. 验证仿真结果:用信噪比曲线和合并技巧判断模型是否靠谱
很多人拿到脚本跑完就贴进论文,但仿真结果有没有问题,看曲线平滑度是不够的。我习惯做一个最朴素的验证:给信道加上高斯白噪声,画出接收端信噪比随发射功率变化的曲线,看趋势是否与理论值吻合。自由空间模型下,发射功率每增加 3dB,接收信噪比应该增加约 3dB,斜率近似为 1;SUI 多径信道因为有频率选择性衰落,斜率会略低于 1,但不会低到 0.5 以下。
另一个常用的验证是切换地形参数。把 SUI-1 改成 SUI-5,信道冲激响应的时延扩展应当明显变大,频率响应的波动也更剧烈。如果两条曲线的频率响应差别不大,多半是 K 因子或功率延迟分布参数没有真正生效。我碰到过一次 K 因子判断条件写反,瑞利抽头被加上了直射分量,整个仿真结果全变了,从那以后我每次跑完信道仿真都会强制走一遍参数切换对比。
做论文图表时,三个小技巧能省不少返工时间。第一,MATLAB 的 figure 窗口导出图片时把 FontSize 统一调到 10 以上,缩小到 word 单栏宽度(约 8.5cm)后字号才不会模糊到看不清。第二,路径损耗曲线的 y 轴范围建议设成 80~180dB,这能同时容纳四个模型的曲线,不会因为某一条太高而压缩其他曲线的可视范围。第三,SUI 仿真图建议同时画时域冲激响应和频域响应两张子图,审稿人看到这两张图就明白你确实理解了多径信道,而不只是贴了一个脚本输出。
这套资源里的代码结构是按「a 到 d」四个目录组织的,每个目录对应一个模型,配合论文里的图号和公式编号可以快速定位。如果你需要把它扩展成自己的课程设计,最划算的做法是先跑通原始脚本,然后只改频率和距离这两个参数,重新出图后替换论文插图。希望这篇拆解能让你在信道上少走点弯路,祝调试顺利。
本文还有配套的精品资源,点击获取