ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MATLAB常见雷达信号仿真:LFM、Barker、FMCW与步进频全解析

MATLAB常见雷达信号仿真:LFM、Barker、FMCW与步进频全解析 简介本资源是一套面向雷达系统初学者与信号处理工程师的MATLAB实践代码集聚焦连续波、脉冲、FMCW、相位调制、CDMA及数字波形等六类典型雷达信号的建模与仿真解决理论理解与工程实现脱节问题。压缩包共13个.m文件涵盖LFM线性调频、BPSK/FSK/QPSK相位与频率调制、chirp与NLFM非线性调频、脉冲压缩及通信复合波形等核心算法脚本每个文件均实现信号生成、调制、加噪与基础分析功能便于快速复现与二次开发。资源体积仅12KB轻量高效适合作为课程设计、毕设仿真或算法验证的起点。目前已有2543人学习下载代码结构清晰、注释规范配套完整信号链路发射—传播—接收—处理可直接运行观察时频域特性显著降低雷达信号仿真实践门槛。 做雷达信号处理这些年我桌上最常用的软件就是MATLAB。不管是刚入门的学生还是已经接触雷达系统设计的工程师几乎都会经历一个绕不开的步骤把常见的雷达信号先仿真一遍。所谓常见基本就是线性调频、相位编码、调频连续波、步进频这几种。它们看起来只是几个数学表达式但真正放进MATLAB里跑起来你会发现一堆细节——时间轴怎么取、采样率选多少、匹配滤波输出峰值为什么偏了、频谱为什么“乱”得看不懂。这篇文章我想把几种最常见的雷达信号仿真从头到尾拆一遍既给可以直接跑的代码也把背后的参数选择和踩坑经验讲透。如果你正在做信号处理相关的课程设计、毕业设计或者想快速验证某种雷达波形这篇文章应该能帮你省不少时间。1. 仿真前先搞懂雷达信号在MATLAB里到底要仿什么1.1 雷达信号仿真在工程里的真实位置雷达系统设计里信号仿真通常处于最前端。你要验证一种波形能不能达到预期的距离分辨率、测速精度不可能一上来就上硬件成本太高周期太长。用MATLAB把发射信号、回波信号、接收处理链路完整走一遍可以在几秒钟内看到波形的“脾气”。这也是为什么很多公司招雷达信号处理工程师时MATLAB仿真几乎是必考项。所谓常见的雷达信号本质上就是给载波叠加不同的调制方式线性调频让频率在脉冲内线性变化相位编码让相位按照某种码型跳变调频连续波则用连续的频率扫描实现测距测速步进频又通过多个窄带脉冲合成大带宽。仿真的是什么不是那份数学公式而是这些信号的时域波形、频谱特征以及经过匹配滤波或混频处理后能输出什么样的结果。仿真结果能直接回答三个问题这个波形能不能用分辨率大概是多少在目标有一定速度时会不会出问题1.2 参数选择的几个原则带宽、时宽与采样率不是拍脑袋很多初学者上来就写代码参数随便填最后仿出来的图“看着像”但是经不起推敲。我建议先花五分钟把参数想清楚仿真才有意义。雷达信号里有几组参数是绕不开的。第一组是带宽和时宽。带宽B直接决定距离分辨率公式是ΔR c / (2B)。时宽T决定脉冲能量T越大平均功率一定时脉冲能量越高探测距离越远。传统单载频矩形脉冲很难兼顾这俩所以后来才出现LFM、相位编码这些脉冲压缩信号本质就是用大带宽换取高分辨同时用长时宽保证能量再用匹配滤波把能量“压”回窄脉冲。第二组是采样率。基带复信号可以按信号带宽B来采样Nyquist采样率也就是fs ≥ B。如果直接把实信号采下来需要满足fs ≥ 2(f0 B/2)这个频率在几百MHz甚至更高数据量会非常大。所以在仿真雷达基带信号时大家普遍把载频去掉只在零中频做复信号仿真采样率一般取带宽的2到5倍就够用。第三组是脉冲重复周期和脉冲数。如果仿真的不是单个脉冲而是脉冲多普勒体制还需要考虑PRF是否满足最大不模糊距离和速度。不过这篇文章主要讲单脉冲级的常见信号所以PRF这块先不展开。我在仿真前习惯列一张参数表类似这样参数常用取值影响信号带宽 B1 MHz ~ 50 MHz距离分辨率脉冲宽度 T1 us ~ 100 us脉冲能量、作用距离采样率 fs(2~5)×B频谱保真度载频 f00基带仿真是否引入载频项调频斜率 KB/T频率变化快慢你可以先把表格填好再开始写代码。后面每一步都问自己改这个参数波形会怎么变如果答不上来说明还没真正理解这个信号。2. 线性调频LFM信号仿真雷达信号处理的“万金油”2.1 LFM的数学模型与脉冲压缩背后的物理意义LFM信号也叫Chirp信号是雷达里最常用的脉冲压缩波形。它的数学形式可以写成s(t) rect(t/T) exp(jπKt²)其中K是调频斜率K B / T。rect(t/T)表示脉冲在[-T/2, T/2]内取1其他位置为0。瞬时频率是相位对时间求导再除以2π也就是f(t) Kt说明频率在脉冲内从-B/2线性增长到B/2。这也是为什么听感上像“啾”的一声频率在往上爬。为什么要用这种频率线性变化的信号因为匹配滤波之后输出主瓣宽度大约为1/B比发射脉宽T小得多。举个例子发射脉宽10us带宽10MHz脉压后主瓣宽度约0.1us相当于把时间分辨率提高了100倍。对应距离分辨率是c/(2B)15米。这就实现了“长脉冲大能量大带宽高分辨”的效果。脉冲压缩的本质是接收端用一个与发射信号共轭匹配的滤波器把相位变化带来的频偏积累成主瓣。我经常用生活类比就像一群人同时从同一起点跑步速度各不相同终点分散得很开。如果给他们都发一块表让他们按某个速度梯度跑然后统一在校准时刻“对齐”就能把一群分散的人重新聚拢。LFM的匹配滤波做的就是类似的时间对齐。2.2 基于MATLAB的LFM信号生成代码与参数推导下面是一份非常简洁的LFM基带信号生成代码。我刻意把参数都显式列出来方便你改成自己的取值。%% LFM基带信号生成 c 3e8; % 光速 B 10e6; % 带宽 10 MHz T 10e-6; % 脉宽 10 us fs 100e6; % 采样率 100 MHz10倍带宽 K B / T; % 调频斜率 % 时间轴对称取[-T/2, T/2] t -T/2 : 1/fs : T/2; N length(t); % 复基带LFM信号 lfm exp(1j * pi * K * t.^2); % 画时域波形和频谱 subplot(2,1,1); plot(t*1e6, real(lfm)); xlabel(时间/us); ylabel(幅度); title(LFM时域实部); freq linspace(-fs/2, fs/2, N); subplot(2,1,2); plot(freq/1e6, fftshift(abs(fft(lfm)))); xlabel(频率/MHz); ylabel(幅度); title(LFM频谱);代码里的exp(1j * pi * K * t.^2)是最常见的LFM表达形式。这里用pi而不是2pi是因为瞬时频率等于Kt而K本身已经是B/T。如果你在某些文献里看到exp(1j*2*pi*(f0*t 0.5*K*t²))那是把载频f0也写进去了。两种写法规约不同但物理上等价。我自己习惯只用基带形式省去载频不仅计算量小后续做匹配滤波也更干净。运行后你能看到时域实部是一个频率逐渐变密的振荡波形频谱则近似一个矩形宽度约为10MHz。如果频谱矩形边缘不够陡通常是因为时间窗太短边界截断效应。2.3 匹配滤波仿真为什么输出主瓣那么“窄”生成LFM只是第一步真正体现“脉冲压缩”威力的是接收端的匹配滤波。%% LFM匹配滤波 matched_filter conj(fliplr(lfm)); % 匹配滤波器的冲激响应 y conv(lfm, matched_filter); % 卷积实现脉压 y y / max(abs(y)); % 归一化 % 取主瓣附近 t_out (-N1 : N-1) / fs; % conv输出对应时间 figure; plot(t_out*1e6, 20*log10(abs(y))); xlabel(时间/us); ylabel(归一化幅度/dB); title(LFM匹配滤波输出); axis([-1 1 -50 0]);匹配滤波器的冲激响应是发射信号时间反转后的共轭也就是conj(fliplr(lfm))。用发射信号和它做卷积相当于对信号做了一次自相关。理论上输出主瓣宽度是1/B0.1us放到图上就是主瓣非常尖旁边的旁瓣约-13.2dB。这个旁瓣水平很多时候不够用可以加窗处理比如Hamming窗代价是主瓣展宽大约1.3到1.5倍。我在实际项目里基本都会加窗尤其是后面还要做目标检测时旁瓣低一点会少很多虚假目标。注意一个细节conv输出的长度是2N-1时间轴也要对应地从发射信号起点到匹配滤波器终点重新构造不然峰值位置会明显“偏到一边”。这个坑后面第5章还会细说。3. 相位编码信号仿真Barker码的高分辨与多普勒“脾气”3.1 相位编码信号原理用相位跳变携带信息相位编码信号和LFM一样属于脉冲压缩信号但它的调制方式完全不同。LFM是频率连续变化相位编码则是在一个脉冲内把时间分成若干码片每个码片根据编码序列的不同让载波相位在0和π之间跳变。简单说就是用一串二进制序列去控制发射信号的相位。常见码型是Barker码。Barker码的自相关函数副瓣很低码长N的Barker码峰值旁瓣比理论上是20log10(1/N)。工程上能用到的Barker码长度有2、3、4、5、7、11、13。超过13就没有Barker码了这是一个数学上证明过的结论所以很多系统直接采用13位Barker码。它的编码序列是1 1 1 1 1 -1 -1 1 1 -1 1 -1 1每一位对应一个码片。相位为0时幅度取1相位为π时幅度取-1。如果基带仿真可以直接用这个序列作为信号的“包络”然后在每个码片时间上填充矩形脉冲。相位编码的好处是实现简单、压缩比高、峰值旁瓣低而且信号具有一定的低截获特性。缺点是它对多普勒频移比较敏感目标速度一大脉压输出就会明显恶化。后面我会实际验证。3.2 基于MATLAB的13位Barker码发射与匹配滤波下面给出13位Barker码的基带仿真代码。我同样采用复信号形式把码型转换成矩形脉冲序列。%% 13位Barker码信号生成与匹配滤波 barker13 [1 1 1 1 1 -1 -1 1 1 -1 1 -1 1]; % 13位Barker码 T_c 1e-6; % 码片宽度 1 us fs 100e6; % 采样率 t_total 13 * T_c; % 总时宽 % 每个码片对应的采样点数 samples_per_chip round(T_c * fs); seq kron(barker13, ones(1, samples_per_chip)); t (0:length(seq)-1) / fs; % 基带复信号 barker_signal seq(:).; % 匹配滤波 matched conj(fliplr(barker_signal)); y conv(barker_signal, matched); y y / max(abs(y)); % 画脉压结果 t_out (-length(barker_signal)1 : length(barker_signal)-1) / fs; figure; plot(t_out*1e6, 20*log10(abs(y))); xlabel(时间/us); ylabel(归一化幅度/dB); title(13位Barker码脉压输出); axis([-8 8 -40 0]);运行后你会看到主瓣旁边有规律地分布着若干个小旁瓣峰值旁瓣比约-22.3dB和理论值20log10(1/13)非常接近。如果旁瓣电平不对多半是码片采样点数没对齐或者用plot时只看了局部导致归一化位置偏移。这里有个实操建议Barker码的时宽和带宽并不是独立的。码片宽度T_c越窄等效带宽越大距离分辨率越高。13位码的总时宽是13*T_c。在匹配滤波前最好把信号长度和延迟对齐好否则后面加目标回波时会算错距离。3.3 多普勒敏感性实测什么时候不能用BarkerBarker码最大的坑在多普勒敏感性。我做了一个简单测试给Barker码信号乘上一个多普勒频移项再去匹配滤波看主瓣变化。%% 多普勒频移对Barker码脉压的影响 fd 50e3; % 50 kHz多普勒频移 doppler exp(1j * 2 * pi * fd * t); rx_doppler barker_signal .* doppler; y_doppler conv(rx_doppler, conj(fliplr(barker_signal))); y_doppler y_doppler / max(abs(y_doppler)); figure; plot(t_out*1e6, 20*log10(abs(y_doppler))); xlabel(时间/us); ylabel(归一化幅度/dB); title(带多普勒频移的Barker码脉压输出); axis([-8 8 -40 0]);当多普勒频移达到50kHz时脉压主瓣已经明显降低、展宽甚至可能出现“假峰”。原因很容易理解Barker码的相位跳变本身是一次性固定编码多普勒项会在脉压积分过程中破坏码片之间的相位关系相当于给信号加了一个未知的相位调制。对于13位码只要多普勒频移接近1/T_c码片速率量级压缩性能就会严重下降。所以什么时候不能用Barker目标高速运动、需要长时间相参积累的场景我一般不会用Barker码。相比之下LFM对多普勒不那么敏感多普勒频移只是让匹配滤波输出峰值产生一个时延偏移幅度恶化不大。如果既要脉压又要抗多普勒可以考虑LFM和相位编码的混合波形当然那是另一个话题了。4. 从FMCW到步进频工程里常见的两种“变种”信号仿真4.1 FMCW三角波差频测距的核心调频连续波FMCW在车载雷达、物位计、高度表里用得非常多。它和脉冲雷达不同不追求把脉冲压得很窄而是连续发射频率变化的信号通过发射信号和回波信号混频产生一个差频信号再从这个差频信号的频率里解算距离。先看三角波FMCW。发射信号可以写成s_tx(t) exp(jπKt²)如果目标在距离R处回波延迟τ 2R/c回波信号近似为s_rx(t) exp(jπK(t-τ)²)混频后得到差频信号s_bb(t) s_tx(t) * conj(s_rx(t)) exp(j2πKτt)差频频率就是f_b Kτ K * 2R / c。只要通过FFT估计出差频f_bR c f_b / (2K)。这个关系简单直观也是FMCW雷达的核心。下面是一段完整的点目标仿真%% FMCW点目标测距仿真 c 3e8; B 50e6; % 扫频带宽 T_chirp 100e-6; % 扫频周期 K B / T_chirp; fs 5e6; % 差频信号采样率 R_target 30; % 目标距离 30 m tau 2 * R_target / c; t 0 : 1/fs : T_chirp; tx exp(1j * pi * K * t.^2); rx exp(1j * pi * K * (t - tau).^2); bb tx .* conj(rx); % 差频信号 Nfft 2^14; % FFT点数 spec fft(bb, Nfft); f_axis (0:Nfft-1) / Nfft * fs; % 单边谱频率轴 % 找峰值 [~, idx] max(abs(spec(1:Nfft/2))); f_b f_axis(idx); R_est c * f_b / (2 * K); fprintf(真实距离: %.2f m估计距离: %.2f m\n, R_target, R_est);实际运行会发现估计距离和真实距离非常接近误差主要来自FFT的频率分辨率。FFT频率分辨率是1/T_chirp换算成距离就是c/(2B)。这给了一个重要结论FMCW的距离分辨率同样由扫频带宽B决定扫频周期T_chirp长一点FFT的频率分辨率就好一点但系统响应速度会变慢。工程上需要在分辨率和刷新率之间折中。4.2 步进频信号用多个脉冲拼出大带宽步进频信号Stepped Frequency不是发射一个超宽带脉冲而是发射一串窄带脉冲每个脉冲的载频依次增加一个固定频率步进Δf。接收时对这N个脉冲的基带信号做IFFT就能合成一个高分辨距离像。假设一共发射N个脉冲第n个脉冲的频率为f_n f0 nΔf。一个点目标在距离R处产生回波每个频点的相位差为φ_n 2π f_n * 2R/c。对频域采样数据做IFFT就会在时域出现一个峰值峰值位置对应目标距离。合成带宽B_total NΔf距离分辨率同样是c/(2B_total)。Matlab仿真可以做得很简单%% 步进频点目标距离像仿真 N 16; % 脉冲个数 df 1e6; % 频率步进 1 MHz f (0:N-1) * df; % 各脉冲频率 c 3e8; R 120; % 目标距离 % 理想点目标在各频点的相位响应 phase exp(-1j * 2 * pi * f * 2 * R / c); range_profile ifft(phase); % 画距离像 r_axis (0:N-1) * c / (2 * N * df); figure; plot(r_axis, abs(range_profile)); xlabel(距离/m); ylabel(幅度); title(步进频IFFT距离像);这段代码里没有给信号加窗所以距离像会出现比较高的旁瓣。实际工程里会在IFFT前加Hamming或Kaiser窗降低旁瓣但主瓣会变宽。步进频信号对目标运动非常敏感因为每个脉冲之间有时间间隔如果目标在这个间隔里移动各频点之间的相位就不连续距离像会畸变。我在仿步进频时最喜欢验证的就是目标运动对距离像的影响。把相位项里加上一个速度分量比如R R0 vt再看IFFT结果主瓣会明显展宽甚至出现“走动”。这也是很多毫米波雷达在实际测量高速目标时必须做运动补偿的原因。4.3 几种常见信号的横向对比与选型建议做完整轮仿真最好先停下来做个对比。下面这张表是我自己常用来做波形选型的列几个常见维度信号类型优点缺点典型应用线性调频LFM多普勒容限好技术成熟旁瓣需要加窗抑制警戒、搜索雷达Barker相位编码旁瓣低实现简单多普勒敏感码长受限目标相对静止的场合FMCW硬件成本低连续波测距简单收发隔离难多目标耦合车载雷达、液位计步进频用窄带系统合成大带宽对运动敏感处理复杂高分辨成像雷达选型时我通常会先问两个问题目标会不会高速运动如果需要做多普勒处理LFM相对更合适。系统是不是严重受限于瞬时带宽如果硬件只能发窄带步进频可以通过多次发射合成大带宽。如果只是近距离测距FMCW结构最简单成本最低。这些判断不是只靠理论而是仿真跑完以后自然得出的。5. 雷达MATLAB仿真高频踩坑点从频谱“乱了”到峰值“偏了”5.1 时间轴到底该不该对称——一个影响相位的细节初学LFM时最容易出现的一个问题是时间轴取法不一样导致频谱和脉压结果对不上。比如有的人用t 0 : 1/fs : T构造LFM有的人用t -T/2 : 1/fs : T/2。这两个写法都能看到频率变化但初始相位是不同的。用t0:T时相位在t0处从0开始用t-T/2:T/2时相位在脉冲中心为0。如果你后续要做相位类的测量、多普勒补偿或系统级仿真这种相位差异会直接影响结果。我在项目里的习惯是基带LFM统一用对称时间轴即t -T/2 : 1/fs : T/2。这样频谱中心正好在0Hz便于观察。如果做的是带通信号仿真或者要和工具箱接口对齐再看具体函数定义。关键是同一个仿真链路里所有信号的参考时间必须一致不能一会从0开始一会从-T/2开始。FFT频谱轴也经常出错。fft输出是0到fs的频谱如果你画的是实信号频谱需要做fftshift才能看到正负频率。很多同学画出来频谱“对称但中心不在0”其实不是仿真错而是没对坐标轴做平移。我建议把频率轴定义为freq (-N/2 : N/2-1) * fs / N然后对应fftshift后的幅度谱这样一眼就能看出信号中心频率在哪。5.2 匹配滤波输出峰值位置不对时延、补零和卷积边界匹配滤波看起来简单但我在带新人时发现峰值位置对不上是最常见的报错点。原因很多核心是对卷积的时间关系没理解透。用conv(signal, matched)做匹配滤波时输出长度是N M - 1其中N是信号长度M是匹配滤波器长度。如果匹配滤波器由发射信号反转共轭得到那么当输入信号本身没有任何时延时峰值对应的输出索引应该在N处而不是0或N1。如果你用filter代替conv会因为滤波器初始状态不同峰值位置又差一大截。一个稳妥的做法是显式地把时延建模出来。发射信号为tx回波是rx [zeros(1, delay) tx]然后再做匹配滤波。这样对比一下峰值位置和delay是否一致能很快定位问题。补零也要注意fft补零只是增加插值密度让频谱看起来更平滑并不能提高真实分辨率。真实分辨率由信号时宽和带宽决定。所以不要指望通过疯狂补零把两个靠得很近的目标“分开”补零不会改变物理极限。要提升分辨能力只有增大带宽。5.3 从脚本到工具箱Phased Array System Toolbox的补充作用纯手写代码能够帮助理解原理但在做大型系统仿真时MATLAB的Phased Array System Toolbox能省不少事。比如要生成LFM波形我只要写waveform phased.LinearFMWaveform( ... SampleRate, fs, ... PulseWidth, T, ... SweepBandwidth, B); x waveform();Barker码也有对应的phased.BarkerCodeFMCW有phased.FMCWWaveform。工具箱的好处是接口统一、参数不容易写错还能直接和后续的发射阵列、接收波束形成模块联动。但我的建议是先用自己写的代码把每种信号跑通再切换到工具箱。因为只有手写过一遍你才知道SweepBandwidth对应什么、PulseWidth改变后对频谱是什么影响。否则工具箱在你眼里就是个黑盒子出问题都不知道去哪里排查。我自己带项目时也常做“双轨验证”手写结果和工具箱结果对比偏差超过1%就说明某个环节理解错了。最后再分享一个小体会雷达信号仿真看着是纯数字游戏但每一个参数都对应物理世界的真实约束。别嫌这些基础波形简单很多复杂的系统级问题追根溯源最后都回到LFM和相位编码这两类基础信号上。你把这些仿真吃透了后面做目标检测、测距测速、SAR成像都会顺畅很多。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进