做无人机通信仿真的人都知道信道模型是整套算法验证的根基。最近我把“无人机-船舶毫米波MIMO极化信道模型”在Matlab里完整复现了一遍起因是手头一个海上无人机中继项目需要评估28GHz频段下空地链路的信道容量、波束成形增益和极化分集收益。这套代码不依赖任何专用工具箱用纯Matlab函数实现了3GPP TR 38.901风格的信道生成逻辑支持双极化阵列、任意天线布局、动态位置和速度参数输出就是可以直接喂给预编码和检测算法的信道矩阵H。正在做无人机通信、海上无线回传、毫米波波束赋形仿真验证的同学可以直接跟我这套框架走一遍。1. 无人机到船舶这条链路跟普通空地链路差在哪1.1 高频段带来的几个硬约束无人机-船舶通信通常工作在毫米波频段我选了28GHz作为默认载频。这个频段的波长只有1厘米出头天线阵列可以在很小的物理尺寸内集成几十个阵元但代价是路径损耗极大、绕射能力极差、对遮挡物特别敏感。自由空间损耗公式算一下就清楚了在500米水平距离、无人机高度100米、船高10米的场景下斜距约为510米自由空间路径损耗约是20log10(4πd/λ) 20log10(4π×510/0.0107)算出来约为115.6dB。这个数值意味着发射功率、天线增益、接收机灵敏度都得精打细算任何额外的雨衰和大气吸收都会直接吃掉链路余量。大气吸收在28GHz还属于温和区域每公里大约0.1~0.2dB的氧气和水汽吸收如果换成60GHz的氧气吸收峰值每公里能到15dB以上那就完全不是一回事了。所以我这个模型默认用28GHz而不是60GHz就是为了把注意力放在信道结构建模上而不是被大气损耗的物理问题拖住。1.2 海面环境对多径结构的影响跟城市完全两回事城市环境里散射体密密麻麻NLOS径非常丰富海面上几乎只有两种东西平滑的海面和偶发的船舶上层建筑。这就带来一个特点一阶镜面反射径特别显著而且海面的反射系数和粗糙度直接决定多径能量分配。海水在毫米波频段的相对介电常数大约在εr ≈ 50 − j30的量级受盐度、温度影响用菲涅尔公式算出来的垂直极化反射系数模值接近0.9左右水平极化稍低一些但都表明镜面反射会携带相当一部分能量。这种强镜面反射对MIMO系统是福也是祸好的一面是反射径可以被当作“辅助链路”使用甚至可以用极化来控制多径坏的一面是海面反射的角延展非常小信道空间自由度有限天线阵列实际上只能“看到”有限的几个方向。另外无人机和船都在动无人机巡航速度按20m/s算28GHz对应的最大多普勒频移是v/λ 20/0.0107 ≈ 1869Hz如果加上船的5m/s合成多普勒在相干时间内变化非常快。等高相干时间的假设在毫米波海上信道里往往不成立信道仿真必须带时间维和多普勒维而不是只给一个静态矩阵。1.3 建模目标代码到底要输出什么我给自己定的输出目标非常明确分两个层面第一层是时变的MIMO信道矩阵H(t)维度是接收天线数乘发射天线数每个元素是复信道系数所有路径损耗、阴影、极化旋转和散射衰落都折算进去第二层是归一化的“纯小尺度信道矩阵”功率期望为1用于单独观察MIMO空间相关性和极化特性。两个矩阵分开给后处理的灵活性就很大比如验证算法时用归一化矩阵做链路预算时再乘上大尺度因子。整套代码分四个文件参数配置、阵列初始化、信道生成、容量与波束仿真职责分离很清晰。2. 极化毫米波MIMO信道建模的关键方程2.1 双极化阵列的场响应建模从天线开始。我采用均匀平面阵UPA每个阵元位置用三维坐标表示阵元间距取半波长。发射端8×8共64个阵元接收端4×4共16个阵元每个阵元都是双极化的也就是同时具备垂直极化V和水平极化H两个端口所以发射端的虚拟天线数实际是128接收端是32。极化导向矢量很简单垂直极化分量的端口响应是(1, 0)水平极化分量的端口响应是(0, 1)但这只是天线端口层面的定义实际电磁波在信道中传播时极化方向会发生旋转和交叉耦合这就要靠信道的极化传输矩阵来描述了。阵列的相位响应公式我写成这样。假设某个子径的发射方位角为φ_t、俯仰角为θ_t阵元位置向量为r_n那么该阵元相对参考点的相位偏移就是exp(j·2π/λ·(r_n·u_t))其中u_t是波传播方向的单位矢量。把所有阵元串成一个列向量就是该子径的阵列导向矢量a(φ, θ)维度为阵元数。双极化端口的完整天线响应就是每个阵元上的2×1极化向量拼起来实际写成矩阵操作时会用Kronecker积来组织维度这些细节在代码里都会体现。2.2 散射簇与极化传输矩阵信道小尺度部分是经典的簇-射线双层结构。我默认生成8个散射簇每个簇内包含10条子径子径的功率集中在拉普拉斯分布的角度谱内。每条子径的时延按照指数分布折算功率按照时延的指数衰减律分配这个逻辑跟3GPP 38.901的簇模型是一致的。关键在极化传输矩阵。对于第n簇第m子径信道传输系数不是单个复标量而是一个2×2的复矩阵行的索引是接收端极化方式列的索引是发射端极化方式。矩阵主对角元素对应共极化传输交叉项对应交叉极化传输。共极化路径上的复增益幅度是sqrt(P_n/M)分布取复高斯随机交叉极化项额外乘一个sqrt(XPD_inv)的衰减因子。XPD是交叉极化鉴别度单位是dB海上镜面反射场景XPD通常较高大约15~25dB但粗糙海面会把XPD压到5~10dB这一步直接决定了极化分集的可用性。相位处理上每条子径的四个极化通道相位完全独立不受角度影响这符合非相关散射假设。加上子径的多普勒相移exp(j2πf_d·t)f_d由无人机速度和子径到达方向共同决定就得到了完整的时变信道系数。这套结构本质上就是GBSM只是我把3GPP里大量查表参数压缩成了工程上的默认值降低复现门槛。2.3 大尺度衰落和海面反射的折入方式路径损耗我按自由空间加修正项处理PL 20log10(4πd/λ) α_atm·d_km。α_atm在28GHz取0.15dB/km500米距离下只有0.075dB确实很小但代码里保留了这一项方便以后换频段。阴影衰落服从对数正态分布标准差设置为2dB左右但海上链路阴影主要由远距离天气造成我让用户决定是否启用默认关闭是因为海上开阔环境阴影变化比城市慢得多。值得单独说的是海面镜面反射分量。我并没有像标准GBSM那样只靠随机簇来表达全部多径而是额外加了一个确定性反射径它的发射仰角、接收仰角由几何关系算出幅度乘上菲涅尔反射系数Γ和粗糙度衰减因子。粗糙度假设为海水波高0.3米毫米波海面反射的能量损失用瑞利判定法近似折算粗糙度因子ρ exp(-2(2πσ_h sinψ/λ)²)其中ψ是掠射角。这一笔斜射分量在极低仰角时非常强海上通信的波束跟踪算法必须把它当成主径来处理。3. Matlab复现的完整代码框架3.1 全局参数配置参数配置做成一个函数返回结构体这样在主脚本里改参数是最直观的维护方式。我把核心参数列出来做个对照表方便你复制时核对参数默认值说明fc28e9 Hz载频BW100e6 Hz带宽h_uav100 m无人机高度h_ship10 m船舶天线高度dist_2d500 m水平距离v_uav20 m/s无人机巡航速度v_ship5 m/s船舶航速N_tx64发射阵元数8×8N_rx16接收阵元数4×4pol_modedual双极化N_cluster8散射簇数M_sub10每簇子径数XPD15 dB交叉极化鉴别度对应代码开头大概这样function p init_ch_params() p.fc 28e9; p.c 3e8; p.lambda p.c / p.fc; p.BW 100e6; p.dist_2d 500; p.h_uav 100; p.h_ship 10; p.v_uav 20; p.v_ship 5; p.N_tx 64; p.N_rx 16; p.pol_mode dual; % single 或 dual p.pol_type VH; % V/H 双极化 p.N_cluster 8; p.M_sub 10; p.XPD_dB 15; p.atm_loss_db_km 0.15; p.shadow_std_db 0; % 默认关闭阴影 p.roughness_sigma 0.3; % 海面波高米 p.ttl_steps 200; % 仿真时隙数 p.frame_gap 0.5e-3; % 时隙间隔单位秒 end这里要特别提醒一个习惯问题所有涉及功率的参数我都以dB为单位保存在代码用到时再换算成线性值避免在初始化阶段就把单位搞混。时隙数和时间间隔决定了多普勒采样的分辨率20m/s最大多普勒约1869Hz采样周期需要满足奈奎斯特条件0.5ms的帧间隔对应2000Hz采样率刚好够用。如果你的无人机速度更快一定要把frame_gap调小不然多普勒会混叠。3.2 天线阵列初始化的实现阵列初始化做三件事生成阵元坐标、计算角度范围的导向矢量表、初始化极化端口映射。阵元坐标用meshgrid快速生成8×8 UPA的横向间距和纵向间距都是半波长代码里我直接给出了三维坐标矩阵。function [pos, numel] gen_upa(num_x, num_y, lambda) dx lambda / 2; dy lambda / 2; [xx, yy] meshgrid((0:num_x-1)*dx, (0:num_y-1)*dy); pos [xx(:), yy(:), zeros(num_x*num_y, 1)]; numel size(pos, 2); end导向矢量生成函数也不复杂但需要把方位角和俯仰角都算进去。我习惯把角度遍历做成一个网格用于后面的波束扫描和信道计算function a steer_vec(pos, az, el, lambda) % az: 方位角单位弧度 % el: 俯仰角单位弧度 az az(:).; el el(:).; [AZ, EL] meshgrid(az, el); ux cos(EL(:)).*sin(AZ(:)); uy cos(EL(:)).*cos(AZ(:)); uz sin(EL(:)); u [ux, uy, uz].; a exp(1j * 2*pi/lambda * (pos. * u)); end多数人在这步容易犯的错是方位角和俯仰角的定义跟传播方向的投影关系对不上。我这里用的是球坐标下的标准定义方位角从x轴起算俯仰角从水平面起算。如果你的几何模型是angle-of-departure在球坐标参数化一定先画个草图把角度投影确认好不然后面所有相位都对不上。3.3 散射簇生成与信道矩阵核心函数信道生成是整个代码的核心。流程分四步走第一步生成簇的时延和功率第二步生成子径的角度第三步构建每个子径的极化传输矩阵第四步把所有子径累加成最终的H矩阵。簇的时延我按照负指数分布生成第n簇的相对时延τ_n由随机指数变量决定然后做归一化让平均时延等于给定值码元带宽100MHz下时延扩展设置成30ns这个量级在海上其实偏乐观但当作默认值足够。子径角度的生成用拉普拉斯分布每条簇有自己中心角度子径在中心附近随机抖动方位角扩展设为5度俯仰角扩展设为2度海面环境下俯仰角度扩展确实很小因为反射都集中在低仰角方向。把角度和时延都造好之后极化传输矩阵的构建自然用2×2复矩阵完成function X gen_pol_matrix(P_scaled, xpd_lin, M) % P_scaled: 该簇可分配功率线性 % xpd_lin: XPD线性值 % M: 子径数 g sqrt(P_scaled / M) * (randn(2,2) 1j*randn(2,2)) / sqrt(2); X g; X(1,2) X(1,2) * sqrt(1/xpd_lin); X(2,1) X(2,1) * sqrt(1/xpd_lin); end这里对角线元素是VV和HH的共极化增益交叉项是VH和HV的交叉极化增益。注意幅度因子除以了sqrt(2)是为了让实部和虚部各占一半能量保证复高斯变量的模平方期望为1。如果你是在做单极化仿真XPD直接设成很大的dB值即可交叉项自动趋近于0。最后把全部子径叠加。每个子径的贡献是三项的乘积发射导向矢量在某角度下的响应、极化传输矩阵、接收导向矢量在某角度下的响应再乘上多普勒相位exp(j2πf_d·t)。多普勒频率按发射和接收两端运动的矢量分解来算船的运动速度按5m/s沿径向无人机按20m/s沿某个航向角函数输入这两个速度向量做点乘。这一步如果不小心把无人机和船的速度方向搞反了多普勒偏移就会反向直接影响相干时间的仿真结果。给出信道生成的核心循环function H gen_channel_matrix(p, pos_tx, pos_rx, uav_vel, ship_vel) N_t size(pos_tx,2); N_r size(pos_rx,2); H complex(zeros(N_r*p.N_pol, N_t*p.N_pol, p.ttl_steps)); for t 1:p.ttl_steps time (t-1) * p.frame_gap; Ht complex(zeros(N_r*p.N_pol, N_t*p.N_pol)); for n 1:p.N_cluster for m 1:p.M_sub % 获取该子径角度和时延 az_t ...; el_t ...; az_r ...; el_r ...; at steer_vec(pos_tx, az_t, el_t, p.lambda); ar steer_vec(pos_rx, az_r, el_r, p.lambda); X gen_pol_matrix(P_cluster(n), xpd_lin, p.M_sub); % 多普勒 fd (uav_vel(:). * u_dir ship_vel(:). * s_dir) / p.lambda; phase exp(1j*2*pi*fd*time); Hbulk (ar * X * at) * phase; Ht Ht Hbulk; end end H(:,:,t) Ht; end end实际工程中角度、时延、功率参数都是预先算好存在结构体里的循环内只做相位旋转和累加不要在每时隙重新生成随机量否则随机过程完全不连续多普勒谱也是错的。3.4 大尺度折算与信道容量计算小尺度信道矩阵生成之后大尺度因子折算我单独做了一个函数。斜距根据几何坐标直接算路径损耗是自由空间损耗加大气吸收再考虑是否启用对数正态阴影。所有折算下来得到一个标量PL_linear把H矩阵承上sqrt(PL_linear)就是包含全链路功率的信道矩阵如果不乘H矩阵就是归一化功率的。建议把两个版本都存在工作区内名字后续加_norm和_full区分后面处理预编码和波束图形绘制都用得上。信道容量计算是复现项目最常用的后处理。对双极化64×16维度等效MIMO矩阵是32×128信噪比按接收端单天线噪声功率算。经典容量公式是C log2(det(I (SNR/N_t)·H_norm·H_norm))SNR用线性值N_t用发射端口数128。我建议多测几个SNR点做成曲线并且配合不同距离画一组曲线组能直观看出距离大尺度损耗对容量的压制到底有多严重。主流程脚本结构很清晰先初始化参数再生成双端阵列调用信道生成函数得到全尺寸H矩阵然后调用容量函数绘图。整个跑一遍在我机器上不到两分钟200个时隙、8簇、10子径的规模实际很轻量。4. 仿真结果与实际工程结论4.1 距离对信道容量的影响我先把距离从300米跑到1500米固定载频28GHzSNR参数以接收端0dBm参考灵敏度为基准来定义。结果印证了毫米波的宿命300米距离下64×16双极化系统的100MHz带宽容量可以到6.2Gbps附近但距离拉升到1500米时自由空间损耗增加了约14dB容量迅速掉到1.8Gbps左右。这还只算了自由空间损耗如果凑上海浪遮挡风险实际可用距离会更短。这个趋势就是为什么无人机中继在海上的部署策略必须强调“低空前出”——把中继高度降下来缩短斜距比一味加大发射功率实惠得多。多普勒和时间相关性的影响同样直观200个时隙、间隔0.5ms的单次仿真相干时间大概在几百微秒量级也就是说码块在时间维度上的相关性衰减得非常快。信道矩阵的前几时隙和后几时隙相关性几乎为零这对块状预编码方案非常不友好必须考虑基于瞬时CSI的逐时隙预编码或鲁棒波束成形。4.2 极化分集到底能吃多少红利对比双极化和单极化配置时我发现XPD参数对增益的影响比预想的大。当XPD为20dB时双极化相对单极化的容量增益约为25%~35%主要来自信道矩阵秩的提升当XPD被压到5dB时增益骤降到8%左右因为交叉极化泄漏把两个偏振态搅浑了MIMO秩反而回到单极化水平。海上粗糙度对XPD很敏感换个波高0.8米的模拟条件增益就要腰斩。所以工程上做极化分集方案时先测海况再定策略盲目上双极化可能亏在阵元数和射频成本上。波束成形的图形也很有说服力。用导向矢量做发射端扫描接收端固定指向船舶方向归一化接收功率图会看到一个清晰的峰值旁边还有一个低仰角的旁瓣峰那就是海面镜面反射径的贡献。这个旁瓣峰的高度和主瓣的差距基本在8dB以内说明海上毫米波链路不能忽略反射径波束跟踪算法最好同时维护两个波束方向而不是只锁主径。5. 调试中的几个典型问题和排查实录5.1 维度错乱与阵列导向矢量方向搞反我最常遇到的问题是H矩阵维度乘错。双极化之后Nt要乘2如果某一步忘记了极化端口维度矩阵乘法就会直接抛错或者隐含地把两路极化叠加成一列。排查方法很简单在每一个函数返回的地方加size检查尤其盯住循环累加的Ht维度输出N_r×N_pol 行、N_t×N_pol 列才算正确。导向矢量的符号问题也很隐蔽。很多人把发射阵列为相位延迟方向写反了导致波束峰值指向反方向容量仿真倒是没什么大影响但绘制的方向图无论如何都不对。我的经验是先写一个单径验证脚本一条无散射径、已知角度发射一个导向矢量接收端匹配该角度检测输出能量的峰值出现在正确角度上再跑完整信道数据自洽就有保障了。5.2 随机种子、多普勒和复数的归一化信道仿真的随机性若不加控制两个方法之间的对比评测根本没法看。我在主脚本开头用rng(42)固定种子并把所有随机簇数据生成封装到独立函数保证不管跑多少次结果一致。这样调整参数后才谈得上做性能对比不然同一组配置跑两遍出来的期望都不一致。复高斯归一化问题在代码细节里反复出现。我见到不少人把单变量复高斯直接乘上sqrt(P)结果功率比期望大出一倍因为忘了除sqrt(2)。只要用gen_pol_matrix里的归一化方式即(randn 1j·randn)/sqrt(2)乘以幅度因子会使得功率期望被正确控制为P/M后面容量计算才不会虚高。数值上H_norm的大尺度平均值最后要检查是否接近1如果不接近说明归一化某处又出问题了。5.3 参数校准先单径后簇、先后Processing后时变我的调试习惯是从简到繁一步步做先把N_cluster设成1、M_sub设成1关掉XPD交叉项代码里只剩下一条视距径和一片海面反射径这时得到的H矩阵应该和理论导向矢量的外积完全一致然后放开簇数再放开极化最后放开时变。每放开一层参数就跑一遍对比实验能很快定位问题是出在几何角度、极化矩阵还是多普勒上。这个顺序对新手尤其有价值别一上来就跑全套出了错根本不知道从哪儿排。如果仿真的多普勒谱看起来是“一团乱麻”而不是清晰的峰展宽多半是速度向量和子径方向向量之间的夹角没有按运动关系更新。海上场景下无人机航向变化很快我在循环里每隔几个时隙重新计算速度向量与子径方向的夹角保证多普勒轨迹连续变化。6. 这套代码还能怎么扩展目前默认配置是海上点对点链路但代码结构其实是泛化的改几个地方就能迁移到别的场景。把海面反射径关掉、阴影标准差调到4dB左右再改改簇的角度扩展可以直接模拟城市无人机中继场景把船舶高度改成无人机地面站高度、增强XPD到20dB以上就能近似机载末端到地面接入点的信道连主循环都不用动。如果你后面要接OFDM测频域选择性可以结合带宽和簇时延生成多个子载波上的信道矩阵只要在H生成时插入exp(-j2πf_subcarrier·τ_n)的频域相位即可。我个人后续打算在代码里加一套波束跟踪闭环把主导路径的AoD/AoA估计出来用卡尔曼滤波预测下一时刻的到达角度再把导频间隔、预测误差和波束指向延迟串起来仿真。做毫米波海上通信的人最关心的其实就是这个静态信道模型只是第一步动态跟踪才是真正上系统之前要过的关。如果你在跑这套代码时也遇到奇怪的角度指数问题或者维度爆炸欢迎留言聊聊。信道建模这种活自己手推一遍公式再上手Matlab跟直接拿来用人家的工具箱完全是两种体验后者会让你对每个坑都印象深刻。
阅读完成 · 觉得有帮助?