ARTICLE DETAIL

资讯详情

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

使用MATLAB与Simulink对雷达系统建模和仿真的工程实践

使用MATLAB与Simulink对雷达系统建模和仿真的工程实践 使用 MATLAB 和 Simulink 对雷达系统进行建模和仿真用MATLAB和Simulink做雷达系统的建模与仿真这几年几乎是雷达算法工程师的必修课。无论你是刚接触雷达信号处理的在校学生还是在做雷达样机预研的工程师一套参数可调、模块清晰的Simulink雷达仿真模型能帮你把从波形设计、目标回波模拟到检测输出的完整链路在电脑上先跑通。我自己在项目里前前后后搭过好几版雷达仿真模型包括线性调频、相位编码几种波形也踩过不少模块配置和参数设置的坑。这篇博文会把整体设计思路、关键模块的参数设置、以及几个让我印象深刻的排查经验一次讲清楚照着这套逻辑去搭能少走很多弯路。1. 整体设计思路为什么用 Simulink 搭雷达仿真1.1 纯脚本 vs Simulink 仿真的选型考虑很多人一上来就问MATLAB脚本不是也能做雷达仿真吗phased.LinearFMWaveform、phased.RadarTarget这些系统对象写起来也很快为什么非要再用Simulink搭一遍我的看法是两者定位不一样。纯MATLAB脚本特别适合算法验证你写一个脉冲压缩函数跑一跑看看输出非常灵活。但一旦系统复杂度上来比如发射机旁边要接天线、接收链路要分好几级、还要加各种噪声和杂波模块脚本的代码结构会迅速变得难以追踪。Simulink的核心价值是图形化建模每一个模块对应一个功能单元信号流向直观显示在模型上调试的时候双击模块就能看参数、看波形整个系统的信息流一目了然。另外Simulink的模型具备天然的参数化能力。我可以在Workspace里定义一组结构体把所有雷达参数放在一起模型直接引用这些变量。改一个脉冲重复频率整个模型同步更新不用像脚本那样到处找变量。对于团队协作来说Simulink模型也比脚本更容易分工——你负责发射链路我负责接收链路各拆一个子系统出来接口对上就行。1.2 顶层架构与模块划分雷达仿真模型的顶层架构我习惯按照真实雷达的信号流向来划分而不是按照功能随便堆模块。一套最基本的单基地脉冲雷达从发射到检测大致包含以下几个环节发射链路波形发生器产生调制信号经过发射机放大到目标功率再通过天线辐射出去。传播与目标回波信号在空间中传播碰到目标产生反射回波经过双程衰减后回到接收天线。接收链路接收信号经过低噪声放大、下变频、AD采样变成数字基带信号。信号处理链路数字信号依次经过脉冲压缩、多普勒处理、CFAR检测最后输出目标的距离和速度信息。这四个环节对应到Simulink模型中我会建四个主要的子系统。子系统之间用GoTo和From模块传递信号避免连线交叉混乱。每个子系统内部的参数全部从MATLAB工作空间引用模型本身不放硬编码的数字。这样做的好处非常明显仿真的时候你只需要在MATLAB里改参数、运行模型Simulink里根本不需要动。1.3 工具链准备在开始之前需要确认MATLAB里装了以下几个工具箱Phased Array System Toolbox提供雷达波形、天线、目标、接收机等系统对象和Simulink模块是雷达仿真的核心工具箱。Signal Processing Toolbox提供信号处理相关的函数比如匹配滤波、FFT、窗函数等。DSP System Toolbox提供Simulink里的频谱分析、滤波器等模块处理数字信号链路很方便。版本方面我建议使用R2020b以上版本Phased Array System Toolbox在Simulink里的模块库更完整Radar Target这个模块在R2020b之后还有一些功能更新。如果版本太旧有些模块名称和参数配置界面会不一样照着网上的资料抄作业容易翻车。2. 核心原理雷达方程与回波建模的工程化理解2.1 雷达方程链路预算的起点雷达方程是雷达系统设计的起点它把发射功率、天线增益、目标反射特性、距离和接收灵敏度放在同一个公式里。标准形式的雷达方程如下Pr (Pt * Gt * Gr * λ^2 * σ) / ((4π)^3 * R^4 * L)其中Pr是接收功率Pt是峰值发射功率Gt和Gr分别是发射和接收天线增益λ是波长σ是目标RCS雷达散射截面积R是目标距离L是系统损耗因子。这个公式里面最反直觉的就是R的四次方。信号发出去走一个来回路径衰减是双程的所以距离稍微远一点接收功率掉得特别快。举个例子目标距离从10km增加到20km接收功率要下降16倍也就是12dB。这也是为什么雷达链路预算比通信链路更紧张系统设计的余量必须给足。很多人在仿真里只关注信号处理算法忽视链路预算结果模型做出来信噪比高得离谱目标峰值突出得不行。真实雷达系统哪有这么理想杂波、噪声、损耗都会把信噪比拉下来。所以我强烈建议把雷达方程放在模型里作为一个计算模块用计算结果校验仿真参数设置是否合理。2.2 回波信号建模时延、多普勒与幅度把一个目标放在雷达面前回波信号相对发射信号有三个明显的改变时延、多普勒频移和幅度衰减。时延很好算τ 2R / c。目标在3km处时延就是2 * 3000 / 3e8 20微秒。这个值在脉冲雷达里决定了目标在哪个距离单元出现。多普勒频移是因为目标有径向速度。计算公式是fd 2v / λv是目标相对雷达的径向速度接近为正、远离为负。比如Ka波段35GHz波长约为8.57mm一个目标以100m/s接近多普勒频移大约是fd 2 * 100 / 0.00857 ≈ 23.3 kHz这个频率不算高但对脉冲雷达来说它必须要在相参积累里才能体现出来。幅度衰减就是雷达方程里的R的四次方关系。在基带仿真里我不需要在模型里真的模拟35GHz的载波振荡只需要在复基带包络上做幅度缩放和时延、加多普勒相位旋转就行。Simulink里的Radar Target模块就是这么干的给定发射信号、目标参数和传播距离输出就是加上时延、相位变化、衰减后的回波信号这个模块用起来非常有价值。2.3 噪声、杂波与干扰环境建模没有噪声的雷达仿真就像没有反例的算法演示看着完美其实不够真实。仿真中至少要加上接收机噪声通常用高斯白噪声模拟。在Simulink里AWGN模块可以直接设置信噪比SNRdB或者用噪声功率谱密度来配置。这里有个细节容易弄错AWGN模块的SNR是基于信号功率和噪声功率的比例如果你的信号幅度设的是峰值功率要换算成平均功率再算SNR否则噪声功率就设大了。杂波建模比单纯的高斯噪声复杂很多。地杂波通常用瑞利分布模型海杂波在低擦地角的时候会用K分布或者对数正态分布。对初学者来说最开始用高斯白噪声叠加一点瑞利杂波就够了重点是先把检测链路的逻辑跑通。如果后面要做高逼真度的仿真可以考虑用Phased Array System Toolbox里的杂波仿真系统对象clutter.Simulator它支持面杂波和体杂波两种模式参数非常丰富但运行也相对耗时。3. Simulink 实操从零搭建雷达仿真模型3.1 发射机模块与波形配置打开Simulink新建一个空白模型。在库浏览器里找到Phased Array System Toolbox里面有一个Transmitter模块那就是发射机。发射机模块需要配置的参数主要是峰值功率和损耗。例如一个X波段搜索雷达的峰值功率是50kW模型里相对应地设为50e3。注意这里的功率单位是瓦特Simulink模块内部是按线性功率来处理的不要习惯性地写成dBm不然后面和其他模块对接时会差好几个数量级。波形发生器可以放在发射机前面也可以用Simulink自带的Signal From Workspace模块把波形数据先从MATLAB里生成好再喂进模型。我推荐后一种方式原因很简单波形生成算法在MATLAB里调试非常方便想看波形直接plot觉得不对马上改参数。而Simulink里的波形生成模块要打开参数面板、设置各种字段遇到问题排查起来效率低一些。举个实际配置例子如果我要生成一个线性调频波形% LFM 波形参数 fc 9.4e9; % 载频 9.4 GHz bw 10e6; % 带宽 10 MHz pulse_width 100e-6; % 脉宽 100 us fs 40e6; % 采样率 40 MHz prf 2000; % 脉冲重复频率 2 kHz % 生成基带 LFM 复包络 t 0:1/fs:pulse_width-1/fs; k bw / pulse_width; % 调频斜率 lfm_baseband exp(1j*pi*k*t.^2); % 复包络 % 一个完整的脉冲重复周期 % 填充一个 PRF 周期的采样点数 pri_samples round(1/prf * fs); lfm_pulse [lfm_baseband, zeros(1, pri_samples - length(lfm_baseband))];这段代码在MATLAB里定义了波形对象Simulink模型只需要引用了lfm_pulse这个变量发射机模块按PRF周期去读取脉冲数据就行。3.2 目标与信道场景配置Phased Array System Toolbox里有一个非常关键的Simulink模块叫Radar Target它模拟的就是雷达波照射到目标之后返回回波的全过程。Radar Target模块的配置界面里需要填目标个数、每个目标的距离、速度、RCS、以及目标的径向速度方向。比如我要模拟两个目标一个静止目标距离3km一个运动目标距离5km、以-100m/s的速度接近雷达。参数配置如下表参数目标1目标2距离3000 m5000 m径向速度0 m/s-100 m/sRCS1 平米10 平米方位角0 度0 度俯仰角0 度0 度RCS等于1平米大致相当于一架小型无人机10平米相当于一架小型战斗机。这两个值相差10dB在回波功率上会直接体现出来检测的时候大目标容易出头小目标可能被淹没。这里尤其要注意Radar Target模块输出的信号是经过双程传播时延和幅度衰减的但多普勒频移需要看目标速度的径向分量。如果目标不是正对着雷达飞行需要把速度分解到雷达视线方向上。工程中这个分解经常被忽略导致仿真的多普勒频率和理论计算对不上。3.3 接收链路与信号处理模块连接接收链路的第一个模块是Receiver Preamp配置时主要关注增益和噪声系数。一个典型配置是增益40dB、噪声系数3dB。增益设太低后续信号处理环节看不到目标设太高又会饱和干扰了后级的动态范围。接下来是脉冲压缩。这里有两种做法一是直接调Matched Filter模块配置匹配滤波器的系数为发射波形的时域反转共轭二是在Simulink里用卷积模块自己搭。我推荐用Matched Filter模块因为它的参数配置里经过专门优化支持并行加速跑大规模数据时速度更快。连接顺序建议这样安排Radar Target输出信号 → Receiver Preamp → Matched Filter → 通过Buffer Matrix模块把多个脉冲按PRF组织成二维矩阵 → FFT做多普勒处理 → CFAR检测器输出检测结果。这个链路里Buffer Matrix模块容易让人犯迷糊。它的作用是把沿着时间轴输入的一维信号流切成一个一个的脉冲周期每个脉冲是一行最后输出一个二维矩阵——横轴是距离单元、纵轴是脉冲数。后面的FFT就是沿着脉冲数方向做快速傅里叶变换得到每个距离单元上的多普勒频谱这就是距离-多普勒图的由来。4. 波形设计与信号处理链路的实现细节4.1 波形选型LFM、相位编码各自的应用场景雷达波形设计直接决定了距离分辨率和多普勒分辨率这是一切信号处理的基础。线性调频LFM波形是最常用的一种脉冲压缩波形。发射信号频率在一个脉冲内线性递增或递减信号带宽B越大时宽带宽积越大脉冲压缩后的距离分辨率越高。距离分辨率ΔR c / (2B)。带宽10MHz距离分辨率就是15m带宽50MHz分辨率提高到3m。LFM的缺点是匹配滤波输出带有比较高距离旁瓣通常需要加窗来压制。相位编码波形比如巴克码的特点是分辨率同样由带宽决定但它的旁瓣特性相对先天更好而且不容易被电子侦察系统捕获到明显的调频规律。缺点是它对多普勒频移比较敏感当目标速度较大时脉冲压缩性能会明显下降。所以相位编码波形一般用在多普勒变化不剧烈的场合LFM则更通用。在Simulink里两种波形的生成方法差别不大用MATLAB生成好时间序列通过Signal From Workspace接入模型。切换波形时只需要更换数据源信号处理链路不用动。这也是我把波形生成放在模型外的一个额外理由——波形切换变得非常容易。4.2 脉冲压缩匹配滤波的实现与加窗取舍脉冲压缩的本质是匹配滤波。匹配滤波器的冲激响应是发射信号的时间反转复共轭理论上它能让输出信噪比最大化。LFM信号经过匹配滤波之后窄脉冲的宽度压缩到1/B峰值幅度抬高了√(Bτ)倍这个Bτ就是时宽带宽积。我的LFM脉宽100us、带宽10MHz时宽带宽积就是1000脉冲压缩比也是1000能量集中效果非常明显。不过匹配滤波输出有一个让人头疼的问题——距离旁瓣。LFM对应的匹配滤波输出在时间域上呈现sinc函数形状第一旁瓣大约只比主瓣低13.2dB。也就是说一个大目标的旁瓣可能会把隔壁距离单元的小目标淹没掉。解决办法是加窗。加窗的本质是修正匹配滤波器的频率响应压低旁瓣水平代价是主瓣会变宽一点。常用的窗函数有Hamming和Taylor。Hamming窗能把旁瓣压到-43dB左右但距离分辨率损失约一倍。Taylor窗的旁瓣水平可以按需设计比如-35dB的Taylor窗对主瓣宽度的影响比Hamming小不少。我个人的经验是先不加窗看理想脉冲压缩波形确认理论分辨率满足要求后再考虑加窗去压制旁瓣。不要一上来就加很重的窗有些时候目标本身间隔很大根本不需要那么低的旁瓣加了窗反而白白损失分辨率。4.3 多普勒处理MTI对消与MTD距离-多普勒图MTI和MTD是两个层次的多普勒处理技术。MTI动目标显示用两个或三个连续脉冲对消把静止目标和慢速杂波滤掉。实现起来非常简单二脉冲对消就是上一个脉冲减下一个脉冲在Simulink里一个Delay模块加一个Sum模块就能做完。MTI的好处是计算量小工程里大量使用缺点是它只能判断目标是否在动给不出目标运动速度。MTD动目标检测就要更精细一层。它收集一整个相参处理间隔内的N个脉冲对每个距离单元沿慢时间方向做FFT得到多普勒频率分布。这样目标的速度信息就出来了还能把不同速度的目标分开。N个脉冲做N点FFT多普勒分辨率就是PRF/N。我的PRF是2kHz做64点FFT多普勒分辨率约31.25Hz换算成速度分辨率还需要结合波长。这里有一个盲速问题要特别留意。雷达测速是有模糊的当目标速度对应的多普勒频移恰好等于PRF的整数倍时FFT之后看到的就是0Hz目标会伪装成静止目标。比如Ka波段35GHz、PRF10kHz的时候盲速是v_blind λ * PRF / 2 0.00857 * 10000 / 2 ≈ 42.9 m/s目标以42.9m/s的整数倍速度飞行就会在距离-多普勒图上归到零速位置。工程上解决盲速问题的方法通常是改用多重PRF体制或者用波长更短的波段让盲速超出目标可能的速度范围。在仿真里给PRF选值时就应该考虑这一点不要让盲速落在目标附近。4.4 CFAR 恒虚警检测自适应门限的参数设置CFAR恒虚警率检测的目的是解决固定检测门限在海杂波、干扰变化时导致虚警率不可控的问题。它的思路是在被测距离单元周围取若干参考单元用参考单元的平均功率估计当前背景电平再乘以一个门限因子得到自适应门限。最常用的CA-CFAR单元平均CFAR公式是T α * P_n其中P_n是参考单元的噪声平均功率α是门限因子它与虚警概率P_fa和参考单元数量N的关系是α N * (P_fa^(-1/N) - 1)。举个例子虚警概率设为1e-6参考单元数量取32个那么α 32 * (10^6^(1/32) - 1) ≈ 41.8也就是说门限是参考噪声平均功率的41.8倍约为16.2dB。这个配置在均匀噪声环境下表现很好但如果目标密集目标本身的能量串进参考单元会让门限抬高导致检测性能下降。这时候可以在被测单元两侧留几个保护单元不让信号能量泄漏到参考单元里去。Simulink里有CFAR模块吗DSP System Toolbox在较新版本中提供了CFAR Detector模块但实际使用体验中更多时候我是用MATLAB Function模块自己写一个CA-CFAR逻辑大概三四十行代码。它的好处是算法逻辑完全透明换GO-CFAR还是OS-CFAR都方便调试时还能设断点看中间变量。用MATLAB Function模块写CFAR是应付复杂场景最灵活的一条路。5. 完整场景案例检测两个目标5.1 场景设计与参数表把前面所有内容串起来做一个端到端的完整仿真案例。场景设为一台X波段搜索雷达目标包含一个静止地面金属反射体和一个快速接近的空中目标。雷达和目标的关键参数如下参数数值载频9.4 GHz带宽10 MHz脉宽100 us脉冲重复频率2 kHz采样率40 MHz发射峰值功率50 kW接收机增益40 dB噪声系数3 dB目标1距离 / 速度 / RCS3000 m / 0 m/s / 1 平米目标2距离 / 速度 / RCS5000 m / -120 m/s / 10 平米相参处理脉冲数64虚警概率1e-6这个配置下距离分辨率15m多普勒分辨率约31.25Hz对应速度分辨率v_res λ * Δfd / 2 0.0319 * 31.25 / 2 ≈ 0.5 m/s目标2速度-120m/s对应的多普勒频率约-7.5kHz处在多普勒覆盖范围±1kHz之外会发生多普勒模糊。真正的fd经过PRF折叠后落在fd_visible mod(-7536, 2000) - 1000 ≈ -536 Hz这个在Range-Doppler图上会看到一个离零频有一定距离的目标峰。如果不知道多普勒模糊的原理看到这个峰值位置和理论fd对不上就会卡住排查很久。5.2 运行结果与距离-多普勒图解读在Simulink里跑完仿真用Simulation Data Inspector或者直接把数据记录到工作空间然后用MATLAB画距离-多普勒图。观察这张图正常情况下应该看到两个峰。第一个目标在3km处多普勒频率0Hz对应静止目标第二个目标在5km处多普勒频率约-536Hz对应折叠后的运动目标。提取峰值的具体位置就可以测距和测速。距离维度上校验测得距离是否和真值一致。这里有个细节脉冲压缩后的峰值距离偏移量跟匹配滤波器的时延有关系有些时候仿真里看到目标距离差了一个ΔR的一半那是因为数字匹配滤波引入了固定的群时延校准的时候要扣除。多普勒维度配置检查同样关键如果两个目标的多普勒频率靠得很近FFT分辨率不够两个峰会糊在一起那就要增加相参处理脉冲数N。N从64加到128多普勒分辨率提高一倍两个目标就能分开了。5.3 参数调优思路雷达仿真模型建起来之后参数调优是每天都在做的事情。我总结了几个高频优化方向和手段距离分辨不够加大带宽B。B从10MHz提到20MHz距离分辨率从15m变成7.5m。多普勒分辨不够增加相参脉冲数N或者降低PRF。注意PRF降低要保证不产生距离模糊。旁瓣淹没了小目标给脉冲压缩加窗或者改用展宽旁瓣性能更好的窗函数。虚警太多调高CFAR门限因子或者增加参考单元数量。但参考单元太多可能导致目标密集环境下检测不了。速度模糊改PRF或者改用多重PRF处理必要时换工作波段。每个优化动作背后都有理论公式在支撑所以调参之前先在MATLAB里算一遍预期结果再回到Simulink里改参数跑模型效率会高很多。6. 常见问题与排查技巧实录6.1 仿真速度慢得离谱怎么办这是我被问得最多的问题。Simulink雷达模型跑一次要几分钟甚至几十分钟调个参数重新跑一遍人都快没耐心了。第一优先检查求解器设置。很多默认模型用的是变步长求解器雷达信号含高频调制成分变步长求解器会在信号快速变化的地方疯狂缩小步长仿真速度自然起不来。把求解器换成离散定步长fixed-step discrete步长设为采样周期的倒数比如fs40MHz时步长25ns仿真一下子就快了。第二检查有没有模块在做不必要的连续时间积分。雷达基带仿真是典型的离散系统所有模块都应该用离散采样模式不要出现连续积分器否则求解器会切到连续模式拖慢速度。第三不要记录所有信号跑到工作空间。Simulation Data Inspector如果勾选了太多信号数据量大了内存占用和写入速度都会成为瓶颈。只在关键节点记录信号其他地方就不记录了。6.2 模块端口维度对不上报错刷屏维度不匹配是Simulink雷达模型搭建初期最常见的报错。比如Radar Target输出的是一个多目标矩阵维度是N_samples, N_targets但如果后面的Receiver Preamp配置成只能接收单通道维度就匹配不上。处理这种问题有几个思路。一是用Selector模块把多通道信号拆成单通道或者用Reshape模块转换维度。二是在模块参数对话框里明确勾选输入信号是矩阵还是向量有些模块配置项里写了Input processing选择Columns as channelsframe based就能正确处理矩阵输入。三是干脆把接收链路设计成直接处理矩阵的方式整条链路都按矩阵信号来走减少维度转换的频率。6.3 仿真结果和理论对不上质疑模型哪里错了结果对不上理论九成问题出在参数单位或者坐标系的细节上功率用dBm还是W混用了。Transmitter模块用的是WAWGN模块信噪比设置又是dB两者衔接经常差出30dB。务必统一单位体系。目标速度正负号搞反了。很多初学者分不清接近和远离Simulink里Radar Target模块速度正负的方向约定和理论推导可能不一致这时候直接看Range-Doppler图上的多普勒峰在零频左边还是右边就知道对不对。速度为正对应远离多普勒频移为负FFT之后峰在负频率一侧。距离维度的抽取没有对齐。脉冲压缩之后如果只做FFT而不做距离门对齐测距结果会多出几个采样点的偏差需要用峰值附近的插值算法来精确测距。6.4 工具箱版本和模块可用性的坑不同MATLAB版本里Phased Array System Toolbox的Simulink模块名和参数项有差异。我自己就遇到过一次同一个模型在R2019a里能跑在R2022a里打开Transmitter模块的参数含义变了功率定义从峰值功率改成了平均功率模式导致整个链路预算全乱了。我的建议是同一个项目尽量固定MATLAB版本。如果必须跨版本迁移打开模型时留意模型升级报告逐项检查关键模块的参数特别是Radar Target、Receiver Preamp这几个跟物理量强相关的模块。另外养成把模型参数全部放在MATLAB脚本里的好习惯模型不存硬编码数字版本迁移时只需要核对脚本里的变量定义速度快很多。写在最后的一点个人体会雷达系统仿真确实是个容易上头的工作初看觉得无非是发射、回波、检测三步真正深入下去才发现每个环节都有大量值得琢磨的细节——脉冲压缩的窗函数选型、多普勒盲速的规避、CFAR门限的定标、还有各种数值精度问题。我花了很长时间才意识到仿真模型的精度关键在于对物理过程的理解准确而不是模块堆得有多花哨。始终保持对计算结果的理论校验这才是把仿真做扎实的真正根基。希望我踩过的这些坑、总结出的一些配置经验能帮你用更短的时间搭出可用的雷达仿真模型。后面如果大家对某一块内容感兴趣比如Swerling目标起伏模型怎么建模、或者怎样从Simulink模型做C代码自动生成我再单独开篇细讲。
返回列表