简介:面向调频连续波(FMCW)雷达仿真需求的Matlab源码包,适合雷达信号处理初学者、电子工程相关专业学生以及需快速验证FMCW原理的研发人员。这套源码包聚焦调频连续波雷达的建模与信号处理,特别适合课程设计、期末项目或入门科研时作为可运行的参考实现。资源围绕调频连续波雷达的典型仿真流程,帮助使用者理解距离与速度估计、差拍信号处理等关键环节,解决从原理到代码实现之间的衔接问题。包内共有六个文件,以Matlab主程序(.m)为核心,配合四张运行结果JPG图以及一份Word版仿真报告,压缩包整体约989KB,体量轻巧便于下载和本地运行。目前已有117人学习下载。资源可直接运行查看效果,结果图直观展示波形与处理输出,报告对仿真过程进行说明,适合边看代码边对照实验现象,能帮助读者快速掌握FMCW雷达的基本仿真方法,并为后续参数调整或算法改进提供可修改的源码基础。
1. FMCW雷达仿真:差频信号决定一切
做车载77GHz雷达信号处理的人,第一课通常是同一个结论:FMCW从不直接测量回波的飞行时间,它测的是发射信号与回波信号的瞬时频率差。这个差频只有几十kHz到几MHz,用几兆采样率的ADC就能采下来,不需要像脉冲雷达那样处理纳秒级的时间间隔。这份仿真资源里的main.m做的就是这条完整链路:生成锯齿波调频信号、构造延时回波、混频去斜、FFT提取差频,再换算成距离和速度。压缩包里附带了运行结果截图和一份FMCW仿真报告,适合正在做雷达课程设计、刚接触雷达信号处理、或者要在Matlab里快速验证测距测速链路的人。
2. 从调频斜率到差频:FMCW测距测速原理与参数选型
2.1 锯齿波扫频下的差频推导
FMCW发射信号是频率随时间线性变化的连续波,最常见的调制形式是锯齿波。发射频率可以写成:
f_tx(t) = fc + S·t
其中fc是载频,S = B/T是调频斜率,B是扫频带宽,T是单个chirp的扫频周期。信号发射后经过延时τ = 2R/c到达目标再反射回来,接收端收到的回波频率是发射频率在(t - τ)时刻的值:
f_rx(t) = fc + S·(t - τ)
收发信号同时送入混频器做去斜处理,混频器输出的差频频率为两者之差:
fb = f_tx - f_rx = S·τ = S·(2R/c) = 2BR/(cT)
这就是FMCW测距的核心关系:差频与距离成正比。目标越远,回波延时越长,同一时刻发射与回波的频率差就越大。仿真中最重要的一步就是把这个fb从时间信号里提出来,再反解距离。
如果目标是运动的,延时τ本身随时间变化,τ(t) = 2(R + v·t)/c,差频表达式会多出一项:
fb = 2SR/c + 2v/λ
λ = c/fc是波长。第一项来自距离,第二项来自多普勒。这意味着单看一个chirp的差频,距离和速度是耦合在同一个频率点上的,无法区分。这也是为什么实际雷达用三角波或者帧内多个chirp做二维处理,而不是靠单chirp定全部参数。
2.2 参数选型:带宽、chirp周期与采样率
仿真和真实系统一样,参数之间互相锁死。调整一个参数,往往会牵动其他约束,下表是main.m这类仿真里最常用的几组参数及其物理意义。
| 参数 | 符号 | 参考值 | 作用 | 主要约束 |
|---|---|---|---|---|
| 载频 | fc | 77 GHz | 决定波长,影响多普勒灵敏度 | 频段与器件成本 |
| 扫频带宽 | B | 200 MHz | 决定距离分辨率 ΔR = c/(2B) | 带宽越大分辨率越高 |
| chirp周期 | T | 100 us | 决定调频斜率和多普勒PRF | 影响最大不模糊速度 |
| 采样率 | fs | 8 MHz | 决定最大可测差频 | fs ≥ 2·S·(2Rmax/c) |
| chirp数 | Nchirp | 128 | 决定速度分辨率 | 帧越长分辨率越高 |
选参时最常犯的错误是只盯着距离分辨率。把B设得很大,ΔR确实变小了,但S也跟着变大,同样的目标距离下差频fb变大,采样率必须同步提高,数据量也随之上涨。反过来,为了测高速目标把T压短,PRF提高后最大不模糊速度变大,但距离维的差频同样上升。我一般先根据场景写出约束不等式,再用Matlab脚本扫描一组可行参数,而不是拍脑袋填数。
对于上面的参考值:B=200MHz时ΔR=0.75m;fs=8MHz、T=100us时S=2×10^12Hz/s,对应的最大不模糊距离约为Rmax = c·fs·T/(4B) ≈ 300m;77GHz波长约3.9mm,vmax = λ/(4T) ≈ 9.7m/s。如果目标速度要覆盖到30m/s以上,T需要压到40us左右,代价是距离维差频更大,对采样率的要求更高。
3. main.m去斜与FFT测距实现:从信号建模到距离提取
3.1 发射信号与回波信号的基带建模
拿到main.m第一步先看参数定义区。常见写法是把载频、带宽、chirp周期、采样率全部集中在文件头部,后面所有计算都引用这些变量,这样改参数不需要动算法部分。信号建模有两种粒度:带载频的完整模型和去掉载频的基带模型。去斜之后,载频项对静止目标退化为常数相位,不影响差频频率提取,所以很多仿真代码直接写基带形式。为了更贴近工程验证,这里先给出完整模型:
%% 参数定义 fc = 77e9; % 载频 77 GHz B = 200e6; % 扫频带宽 200 MHz Tchirp = 100e-6; % 单chirp时长 100 us S = B / Tchirp; % 调频斜率 2e12 Hz/s fs = 8e6; % 采样率 8 MHz N = round(fs * Tchirp);% 单chirp采样点数 800 c = 3e8; R0 = 100; % 目标距离 100 m v = 5; % 目标速度 5 m/s t = (0:N-1) / fs; % 快时间轴 % 发射信号:线性调频,相位包含载频和调频项 tx = exp(1j * 2*pi * (fc*t + 0.5*S*t.^2)); % 回波信号:延时 tau 后的发射信号 tau = 2*R0 / c; rx = exp(1j * 2*pi * (fc*(t-tau) + 0.5*S*(t-tau).^2)); %% 去斜混频:发射与回波共轭相乘 beat = tx .* conj(rx); % 理论差频 = S * tau fb_theory = S * tau; fprintf('理论差频: %.3f kHz\n', fb_theory/1e3);代码里tx是本地参考信号,rx是回波信号,用tx点乘conj(rx)实现混频。exp指数里的相位是载频项2πfc·t加上调频项πS·t²,混频后载频项相减,剩余相位中包含πS·t²和πS·(t-τ)²的差,展开后得到与τ成比例的线性相位项S·τ·t,对t求导就是差频。fc·τ在这一步表现为常数相位,静止目标下它不会改变谱峰位置,但在运动目标测速时必须保留,因为慢时间维的速度信息全部藏在这项里。
参数上需要注意的是fs必须满足奈奎斯特条件。按上面的数值,目标100m时τ≈0.67us,S·τ≈1.33MHz,fs=8MHz远大于2倍差频,没问题。如果fs设小了,FFT后频谱会混叠,峰值位置直接算错。
3.2 FFT频谱分析与距离峰值提取
差频信号是一条单频正弦线,对它做FFT就能看到谱峰,谱峰对应的频率就是fb。实际代码里不会直接对原始beat做FFT,而是先加窗再变换,否则矩形窗的频谱泄漏会抬高旁瓣,目标多时弱目标会被强目标旁瓣盖住。
%% 加窗 + FFT win = hamming(N)'; beat = beat .* win; Xf = fft(beat, N); % 单边频率轴 f_ax = (0:N-1) * fs / N; % 只取正半轴找峰值 [~, idx] = max(abs(Xf(1:N/2))); fb_est = f_ax(idx); % 差频反推距离:R = c*Tchirp*fb / (2*B) R_est = c * Tchirp * fb_est / (2*B); fprintf('估计差频: %.3f kHz, 估计距离: %.2f m\n', ... fb_est/1e3, R_est);Hamming窗在这里的作用是把主瓣展宽约1.5倍、旁瓣压低到-43dB左右,代价是距离分辨率轻微恶化。对单目标场景用矩形窗也行,但仿真报告里通常会画多目标谱图,那时矩形窗旁瓣会把小目标淹没。f_ax这行代码把FFT的bin序号映射到物理频率,idx取的是幅度最大点的索引。由于beat是复信号,频谱能量集中在单个边带上,只搜索前N/2个bin足够覆盖正频率范围,也顺便避开镜像区域。
峰值提取之后的反推公式可以顺手记成R_est = c·fb/(2·S),本质上和代码里的表达式是同一个。仿真报告里如果看到"estimated range"这一行,一般就是对这一段输出的结果。
4. 二维FFT距离-多普勒处理:把速度和距离解耦
4.1 单chirp的局限:距离与速度耦合
第2章已经推导过,运动目标的差频里同时掺着距离项和多普勒项。请看下面这组数字:目标在100m处以5m/s远离雷达,λ=3.9mm,多普勒项2v/λ≈2.56kHz;而100m距离本身对应的差频是S·2R/c≈1.33MHz。多普勒项相对距离项是小量,单看一个chirp的FFT峰值,约1.33MHz多一点,无法判断这多出来的2.56kHz是距离多了约1m还是速度带来的。这就是距离-速度耦合的本质。
解耦的办法是发射一帧内包含Nchirp个完全相同的chirp,每个chirp间隔时间Tchirp。目标在慢时间维移动了很小的距离,但回波相位随慢时间线性变化,这个相位变化率就是多普勒频率。先在每个chirp上做距离维FFT,再沿慢时间维做第二次FFT,就得到距离-多普勒二维谱。
4.2 二维FFT的Matlab实现
构造差频信号矩阵时,行方向是快时间,列方向是慢时间。和3.1节静止目标建模的区别是,延时τ必须包含慢时间项,并且混频后的相位不能丢掉fc·τ项:
%% 帧参数 Nchirp = 128; % 一帧内chirp数 frame_t = zeros(Nchirp, N); % 差频信号矩阵 % 对每个chirp构造回波 for i = 1:Nchirp t1 = (0:N-1) / fs; % 快时间 ts = (i-1) * Tchirp; % 慢时间 tau_i = 2 * (R0 + v*(ts + t1)) / c; % 时变延时 frame_t(i,:) = exp(1j*2*pi*(fc*tau_i + S*tau_i.*t1)); % 完整去斜信号 end %% 距离维FFT(每行) rd_win = hamming(N); frame_w = frame_t .* rd_win; Rfft = fft(frame_w, N, 2); %% 速度维FFT(每列) dop_win = hamming(Nchirp); Rfft_w = Rfft .* dop_win'; Dfft = fftshift(fft(Rfft_w, Nchirp, 1), 1); %% 坐标轴 range_ax = c * (0:N-1) * fs / N / (2*S); vel_ax = (-Nchirp/2 : Nchirp/2-1) / Nchirp * c / fc / (2*Tchirp);这段代码里frame_t的构造是核心。fc·tau_i展开后包含2·fc·R0/c这个常数项、2·fc·v·ts/c这个慢时间线性项,以及2·fc·v·t1/c这个快时间小量。其中2·fc·v·ts/c = 2v·ts/λ,就是多普勒相位积累项,速度维FFT依靠它测速。S·tau_i·t1展开后主要由2S·R0·t1/c决定距离维频率,剩下的2S·v·ts·t1/c是距离-多普勒交叉项,目标速度不太高时可以忽略。
逐行逐列做两次FFT之后,Dfft矩阵就是距离-多普勒谱。数值检查也很直观:R0=100m时,距离维峰值应落在range_ax接近100m的bin上;v=5m/s时,速度维峰值应落在vel_ax接近5m/s的bin上。
4.3 距离-多普勒谱的读取规则
| 处理阶段 | 变换方向 | 峰值坐标含义 | 对应物理量 |
|---|---|---|---|
| 距离维FFT | 快时间轴(行) | 差频频率 | 目标距离 |
| 速度维FFT | 慢时间轴(列) | 多普勒频移 | 目标径向速度 |
| 二维峰值搜索 | 矩阵行列 | 同时给出行列索引 | 一组(R, v)估计 |
速度维FFT后的峰值位置除以2/λ即可反解径向速度,代码里range_ax和vel_ax已经做了坐标映射,直接用即可。需要留意速度模糊:多普勒FFT的PRF等于1/Tchirp,最大不模糊速度vmax=λ/(4Tchirp)。一旦目标速度超过vmax,峰值会折叠到负速度区,仿真中表现为一个快速接近的目标突然变成"远离"。解决方法是压缩Tchirp,或者用多chirp组合算法解模糊,两种做法都会增加系统复杂度。
5. 从运行结果反推参数:三组容易误设的约束
拿到压缩包里的运行结果图,先不要急着对着曲线感叹。每张图都能反推出仿真参数设得是否合理,下面三个点是最容易出问题的地方。
5.1 时域图看混叠窗口
第一张结果图如果画的是发射/回波时域波形,注意观察回波相对于发射的平移量。这个平移量除以2再乘光速就是目标距离。如果平移量超过chirp周期的百分之几,说明目标距离设置得过远,差频信号在采样窗口内已经不完整,FFT谱峰会明显展宽。此时应该提高fs或降低S,而不是去改目标距离迁就代码。
5.2 频谱图验证距离分辨率
距离维FFT结果图里,两个峰能否分开,取决于ΔR=c/(2B)与目标间距的相对大小。B=200MHz时ΔR=0.75m,如果仿真里设了两个间距只有0.5m的目标,频谱图上会看到一个鼓包而不是两个峰,这是物理极限,不是代码bug。反推方式很简单:数一下两个峰之间的bin数,乘以fs/N得到频率间隔,再换回距离间隔,和c/(2B)对比。
5.3 二维谱的对称性检查
运行结果里的距离-多普勒图(通常是二维热力图或三维网格图),检查谱峰是否关于速度零轴对称。单目标匀速场景下,峰值应该是一个紧凑的亮点,旁瓣沿纵轴方向对称展开。如果发现谱峰在速度维上错位,最常见的原因是慢时间维没有加窗,或者帧内chirp数目太少导致速度分辨率不够。此时把Nchirp从128提高到256,速度分辨率会从约0.15m/s提升到约0.08m/s,谱峰更尖锐。
调参时建议用一组已知量做闭环验证,例如设置R0=100m、v=5m/s,跑完二维FFT后把峰值坐标与理论值做差。误差在0.75m和0.15m以内说明链路是通的;如果差得远,优先检查fc·tau_i是否被意外省略,这是运动目标仿真里最常见的丢项错误。
本文还有配套的精品资源,点击获取