十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

频率步进雷达仿真:从模糊函数到距离像与测角

频率步进雷达仿真:从模糊函数到距离像与测角 简介这是一份面向雷达信号处理与MATLAB学习者的频率步进仿真资源围绕频率步进雷达的波形设计、高分辨距离像合成与测角处理展开适合高校学生、科研人员及工程初学者用于理解模糊图、距离像拼接和单/多目标测角原理。压缩包共125个文件约523KB其中27个.m源文件承担核心仿真逻辑56个.bmp和7个.jpg用于展示模糊图、距离像及测角结果图像20个.asv为备份版本另有.vsd、.emf等图表与说明文档辅助理解。目前已有352人学习浏览。通过运行MATLAB脚本可直观获得频率步进信号模糊函数图、距离像生成与允余去除拼接过程并完成单目标及多目标雷达测角仿真有助于快速掌握参数设置、数据处理流程与结果可视化方法适合作为课程设计或科研入门的参考实现。1. 频率步进雷达仿真的第一个对象画出信号的模糊图像频率步进雷达的核心不是“把连续波扫频改成点频”也不是简单堆一批频点做 IFFT 就能拿到理想距离像。真正的工程起点是先看信号的模糊函数——它告诉你这套步进参数能分辨多少个目标、距离和速度会不会耦合、旁瓣会不会掩盖小目标。很多人直接用ifft画距离像画出来还很漂亮却不知道旁瓣斜率来自哪里换一组频点间隔或脉冲重复周期波形就彻底变形。这篇按一条主线做先画出模糊图确定频率步进的“分辨边界”再生成距离像处理冗余去除与拼接最后把测角接进来单目标和多目标都用同一个信号框架验证。Matlab 仿真不是跑通一个函数而是把参数和物理边界对照起来。2. 模糊图的matlab生成时延轴的选取和多普勒轴的扫描2.1 频率步进信号的基带模型频率步进发射一串载频均匀递增的窄带脉冲通常每个脉冲是简单矩形脉冲基带形式可以写为$$s(t)\sum_{n0}^{N-1} \mathrm{rect}\left(\frac{t-nT_r}{T_p}\right) e^{j2\pi n\Delta f (t-nT_r)}$$这里 (N) 是步进频点数(\Delta f) 是频点间隔(T_p) 是脉冲宽度(T_r) 是脉冲重复周期。注意基带频率是表示在第 (n) 个脉冲自身的相对时间里所以指数项带的是 (t-nT_r)不能写成全局时间乘以 (n\Delta f)否则相位不连续后面的模糊函数计算会出现虚假峰值。模糊函数定义为 (\chi(\tau, \nu)\int_{-\infty}^{\infty} s(t) s^*(t-\tau) e^{j2\pi \nu t} dt)(\tau) 是时延轴(\nu) 是多普勒轴。对于频率步进信号这个积分可以在时域直接数值计算但信号跨了 (N) 个脉冲重复周期采样点数大双重循环慢到不可接受。我一般先把s按全局时间轴构造出来然后只对 (\tau) 在脉冲宽度和几个脉冲周期间扫而不是全时延范围扫否则算出来的模糊图几乎看不到主峰。2.2 可跑的模糊函数计算代码下面这段代码用N64个频点、df1 MHz、脉冲宽度0.2 us、重复周期1 us构造基带信号并在时延轴-Tp:Tp和多普勒轴-df:df上扫描。% 参数设置 N 64; % 步进频点数 df 1e6; % 频点间隔 Hz Tp 0.2e-6; % 脉冲宽度 s Tr 1e-6; % 脉冲重复周期 s fs 100e6; % 采样率取 100 MHz 远大于带宽 % 构造总时间轴覆盖 N 个周期末尾预留一点余量 t_all 0 : 1/fs : N*Tr - 1/fs; s_all zeros(1, length(t_all)); % 逐脉冲叠加基带波形 for n 0:N-1 t_local t_all - n*Tr; valid (t_local 0) (t_local Tp); s_all(valid) s_all(valid) exp(1j * 2*pi * n*df * t_local(valid)); end % 模糊函数扫描网格 tau_axis linspace(-Tp, Tp, 201); nu_axis linspace(-df, df, 201); AF zeros(length(tau_axis), length(nu_axis)); for m 1:length(nu_axis) for k 1:length(tau_axis) delay tau_axis(k) * fs; % 换算为采样点 s_delay zeros(1, length(s_all)); if delay 0 s_start round(delay) 1; s_delay(s_start:end) s_all(1:end - s_start 1); elseif delay 0 s_start -round(delay) 1; s_delay(1:end - s_start 1) s_all(s_start:end); else s_delay s_all; end AF(k, m) abs(sum(s_all .* conj(s_delay) ... .* exp(1j*2*pi*nu_axis(m)*t_all))); end end % 归一化并画图 AF AF / max(AF(:)); imagesc(nu_axis/1e6, tau_axis/1e-6, AF); xlabel(多普勒 / MHz); ylabel(时延 / us); colormap(hot); colorbar; axis xy;这段代码的思路是逐个时延构造延迟信号再和多普勒旋转因子做内积。s_delay的构造没有用circshift因为循环移位会把尾部信号绕到头部造成模糊函数在边界出现伪相关峰直接按线性移位截断才符合物理定义。delay为正表示回波晚到信号右移为负表示早到信号左移。多普勒扫描范围取到 ±(\Delta f) 是因为频率步进的频点间隔决定了多普勒模糊周期超过这个范围看到的只是重复的尖峰簇。2.3 从模糊图读出的三个关键参数运行代码后中心是主峰周边有周期性的斜栅瓣。第一个观察点沿多普勒轴的主峰宽度约等于总信号时宽的倒数也就是 (1/(N T_r))约 15 kHz。第二个观察点时延轴上的栅瓣间隔是 (1/\Delta f)对应距离上就是 (c/(2\Delta f))这就是不模糊距离范围。第三个观察点栅瓣会随着多普勒偏移而移动因为频率步进信号本身存在“距离-多普勒耦合”如果你仿真的目标速度高距离像的峰值会偏离真实位置这就是模糊图像上斜线的来源。有一类错误是直接把s_all用auto相关函数计算模糊图但没有乘以多普勒旋转因子结果只能得到零多普勒切面。实际项目中我习惯先在模糊图上看零多普勒切面确定距离旁瓣再看对角切片确定多普勒容差。代码里把扫描范围缩窄也是这个目的放大主瓣附近的细节。3. 用逆FFT把频域采样变成高分辨距离像3.1 为什么频率步进要做IFFT频率步进每个脉冲只对目标取一个复数采样点这个点的相位包含目标的距离。把所有频点的采样值按顺序排列得到的是目标回波在频域上的离散采样序列。对这串序列做 IFFT相当于把频域样本变换回时延域也就是合成出高分辨距离像。这个过程和 OFDM 的频域信道估计很像但物理含义完全不同IFFT 输出的每个“抽头”代表一个距离单元距离轴间隔由总带宽 (N \Delta f) 决定。目标回波在第 (n) 个频点的表达式为$$Y(n)\sigma \exp\left(-j\frac{4\pi (f_0n\Delta f)R}{c}\right)W(n)$$把Y当作频域序列ifft(Y)之后峰值位置 (m) 对应的距离由 (R m c / (2 N \Delta f)) 给出。这里的核心是 (f_0) 在 IFFT 前不影响峰值位置只影响恒定相位因为 (f_0) 项造成的是整体相位旋转不会改变幅度峰的位置但如果有多个目标(f_0) 项会影响各目标之间的干涉相位所以不能忽略。3.2 最小可复现的IFFT距离像代码f0 10e9; % 起始载频 10 GHz df 0.5e6; % 频点间隔 0.5 MHz N 64; % 频点数 c 3e8; R 1000.5; % 目标距离故意带 0.5 m 偏置 v 0; % 径向速度先忽略多普勒 k (0:N-1).; phase -4*pi*(f0 k*df) * R / c; Y exp(1j*phase); % 理想点目标回波幅度归一化 % 补零到 256 点再做 IFFT M 256; hrr ifft(Y, M); % 距离轴每个索引对应的单程距离 r_axis (0:M-1) * c / (2 * N * df); figure; plot(r_axis, 20*log10(abs(hrr) / max(abs(hrr)))); xlabel(距离 / m); ylabel(归一化幅度 / dB); ylim([-60 0]); grid on;代码里Y是频域序列IFFT的点数M大于N后输出距离像会插值得更光滑但分辨率没有真正提高。距离分辨率完全由总带宽 (N\Delta f) 决定这里为 32 MHz分辨率约 (c/(2 \cdot 32e6)4.69 m)。目标距离 1000.5 m在距离轴上应出现在第 (m R \cdot 2N\Delta f/c \approx 213.4) 个采样点补零后插值能看出主峰在第 213 点附近。一个常被忽略的参数是Y的相位是否做了去斜。如果某个频点的回波混频时本振是固定的f0而不是随频点变化的f0 k*df那么Y中还残留一个二次相位项直接 IFFT 后峰会变宽并出现偏置。因此实际仿真时建议把混频方式写进注释里如果是“频率步进去斜”Y已经是基带复包络可以直接 IFFT如果是“逐个频点采样”必须确认本振对齐到当前频点。3.3 窗函数、补零和距离轴刻度的三个坑距离像的旁瓣由有限频点数的矩形窗决定第一旁瓣约 -13.3 dB。要压低旁瓣可以对Y加hamming或hanning窗再做 IFFT但主瓣会变宽峰值附近的距离估计偏差也会增大。我通常在仿真阶段先不加窗确认多目标位置后再加窗看旁瓣影响。补零改变的是 IFFT 的样点间隔不改变真实距离分辨能力。很多初学者把M设得很大误以为能分辨两个距离差低于 (c/(2N\Delta f)) 的目标这是不对的。补零只能让峰变圆滑两个目标的合成包络依然只有一个峰。要真正分辨更近的目标得扩大总带宽也就是增加N或增大df。距离轴的刻度容易算错。ifft输出第m个点对应的相位变化率是 (2\pi m / (N\Delta f))换算成距离要除以 (2)因为回波走的是双程。还有fftshift的问题如果Y的频点是从负频偏到正频偏排列而不是从 0 开始升序那么 IFFT 前需要fftshift(Y)否则距离像会在两端劈开。4. 冗余去除与拼接让距离像覆盖更宽的不模糊范围4.1 子带拼接为什么会产生冗余单个频率步进信号的总带宽受限于发射机瞬时带宽和接收机采样率。为了覆盖更宽带工程上会把整个频段切成多个子带分别发射每个子带用独立的频率步进模式。拼接时子带之间通常留有一段重叠频点用于配准重叠部分就是“冗余”。还有一种冗余来自距离像本身频率步进的不模糊距离为 (R_u c/(2\Delta f))如果目标距离超过这个值距离像会周期折叠折叠部分和真实距离在多普勒维上混在一起需要通过多个重复频率或粗测距来去模糊。这里说的“允余去除拼接”在仿真中通常指第一种子带重叠频点去除。具体做法是把两个子带的频域采样序列在公共频点上对齐把重叠部分只保留一个然后拼接成完整的频域序列再做 IFFT 得到高分辨距离像。重叠区域用来估计两个子带之间的相位差这个相位差由子带起始频率和本振的不确定度产生。4.2 重叠频点去冗余的最简 matlab 流程假设子带 1 频点从 0 到 (N_1-1)子带 2 从 (N_1 - L 1) 到 (N_1N_2-L)重叠长度为 (L)。目标回波在子带内满足相位连续条件时可以直接拼接。但一般仿真需要人为加一个相位偏置来模拟本振失配拼接前做一下最小二乘估计。% 两个子带的频域采样 N1 64; N2 64; L 8; f0_1 10e9; f0_2 10e9 (N1 - L) * df; R 1000; k1 (0:N1-1).; k2 (0:N2-1).; Y1 exp(-1j*4*pi*(f0_1 k1*df) * R / c); Y2 exp(-1j*4*pi*(f0_2 k2*df) * R / c); % 模拟子带2的本振相位误差 Y2 Y2 * exp(1j * 0.3); % 取重叠段做相位差估计 overlap1 Y1(N1-L1:N1); overlap2 Y2(1:L); phase_diff angle(mean(conj(overlap1) .* overlap2)); % 对子带2整体补偿相位再去掉重叠点拼接 Y2_c Y2 * exp(-1j * phase_diff); Y_combined [Y1; Y2_c(L1:end)]; % 拼接后距离像 M 256; hrr_combined ifft(Y_combined, M); r_axis (0:M-1) * c / (2 * length(Y_combined) * df); plot(r_axis, 20*log10(abs(hrr_combined)/max(abs(hrr_combined)))); xlabel(距离 / m); ylabel(归一化幅度 / dB);phase_diff的估计是通过重叠频点上两个复数的共轭相乘取角度完成的。这里没有除以 (2\pi)因为相位差本身就是两个子带在同频点上回波的相位差值。补偿完后再拼接目标距离像的峰就不会因为相位不连续而解散成两个小峰。如果目标不在零距离子带起始频率不同会导致目标相位随频点在重叠区出现斜率差。这个斜率差在窄带条件下近似为常数但如果总带宽较大最好用一阶多项式对重叠区相位差做拟合而不是只取平均。上面的代码用于带宽不超过几百 MHz、目标距离在波束内的情况是足够的。4.3 拼接后分辨率与无模糊距离的验证拼接后频点总数从N1变成了约N1N2-L总带宽增大距离分辨率提升。可以用两个距离相距 3 m 的目标来验证拼接前两个目标在距离像上合并成一个宽峰拼接后能被区分开。但要注意df并没有变所以不模糊距离 (c/(2\Delta f)) 不变拼接解决的是分辨率不是模糊距离。如果需要同时解决模糊距离常见的做法是在两个不同的df1、df2上分别测距利用余数定理反解真实距离。Matlab 仿真里可以先把目标距离设成超过 (c/(2\Delta f))观察距离像的折叠位置再用另一组 (df) 做第二次测距两两对比解出真实距离。这个步骤不属于拼接本身但和“允余去除”的另一个含义有关。5. 雷达测角仿真单目标用相位比较法就够了5.1 单脉冲测角的数学模型雷达测角有很多分支单目标场景下最简单的是相位比较法也叫干涉仪测角。两根接收天线相距 (d)目标回波到达两天线的波程差为 (d \sin\theta)对应的相位差为$$\Delta\phi \frac{2\pi d \sin\theta}{\lambda}$$解出角度 (\theta \arcsin(\Delta\phi \lambda/(2\pi d)))。问题在于相位差只测得主值范围 ([-\pi,\pi])当 (d \lambda/2) 时会出现测角模糊因此 (d) 通常取 (\lambda/2) 或更小。在频率步进框架里测角不需要独立设计信号。把每个频点的回波同时用两根天线接收得到两个频域序列Y1、Y2先对Y1做距离像找到目标所在的距离单元再在该距离单元上估计两个天线的相位差。这个思路比直接对时域波形的相位差取平均更稳定因为频率步进先完成了距离分辨多目标在距离上被分开后单目标测角公式可以并行应用到每个距离单元。5.2 单目标测角的 matlab 代码% 两根天线间距为半波长 lambda c / f0; d lambda / 2; theta_true 10 * pi/180; % 目标真实角度弧度 % 两个天线接收到的频域回波 % 天线1相位同上天线2额外有波程差 Y1 exp(-1j*4*pi*(f0 k*df) * R / c); Y2 Y1 .* exp(-1j*2*pi*d/lambda*sin(theta_true)); % 距离像找到峰值索引 hrr1 ifft(Y1, M); [~, idx] max(abs(hrr1)); % 在该距离单元上估计相位差 phi1 angle(hrr1(idx)); phi2 angle(ifft(Y2, M, idx)); % 伪代码实为ifft(Y2,M)后取idx上面第二行取角度不标准需要改写成hrr2 ifft(Y2, M); phi2 angle(hrr2(idx)); phase_diff angdiff(phi1, phi2); % 处理 ± pi 跳变的差值 theta_est asin(phase_diff * lambda / (2*pi*d));angdiff是 MATLAB 自带函数返回 ([-π,π]) 之间的相位差。如果两个天线的相位噪声较强可以取峰值附近若干个距离单元的相位差加权平均减少孤立点噪声影响。测角精度受信噪比影响仿真时给Y1、Y2加上复高斯噪声观察 100 次蒙特卡洛后的均方根误差能验证在 10 dB 信噪比下误差是否小于 1 度。5.3 相位比较法的边界和失效情况当目标角度接近 0 时(\sin\theta \approx \theta)相位差线性度好测角误差小。当角度接近 ±90 度时(\sin) 曲线斜率趋于 0同样的相位差会产生很大的角度误差所以天线波束通常限制在 ±60 度以内。如果d大于半波长相位差会出现多值估计出的角度可能落在错误的栅瓣上。另一个失效场景是目标在距离像上占据多个连续单元这些单元的相位差因为目标本身的幅度起伏而不一致。这种情况多发生在目标尺寸超过距离分辨率时需要使用比幅单脉冲或阵列信号处理。单目标相位比较法只适合点目标下面多目标测角走另一条路。6. 多目标测角的matlab实现从MUSIC到距离-角度联合多目标测角不能再用单脉冲相位差因为两个目标在同一个距离单元内时相位差是两者矢量的叠加直接取angle得到的是错误角度。常见做法是使用均匀线阵用 MUSIC 算法做超分辨测角再用频率步进的距离像把不同距离单元上的目标分开。这样两个目标即使角度接近只要距离不同MUSIC 可以逐距离单元工作。% 阵列参数8 元均匀线阵半波长间距 N_ant 8; array_factor exp(-1j*2*pi*d/lambda * (0:N_ant-1). * sin(theta)); % 两个目标角度分别为 -5° 和 15° theta1 -5*pi/180; theta2 15*pi/180; a1 exp(-1j*2*pi*d/lambda * (0:N_ant-1). * sin(theta1)); a2 exp(-1j*2*pi*d/lambda * (0:N_ant-1). * sin(theta2)); % 回波在目标所在距离单元上每个天线接收到的复数值 x a1 * amp1 a2 * amp2 noise; % 构造协方差矩阵并做特征分解 Rxx x * x; % 多快拍时用 x 矩阵这里示意 [~, S, V] svd(Rxx); noise_sub V(:, 3:end); % 8元阵2个目标噪声子空间 6 维 % 角度扫描 theta_scan linspace(-90, 90, 1801) * pi/180; spectrum zeros(size(theta_scan)); for ii 1:length(theta_scan) a exp(-1j*2*pi*d/lambda * (0:N_ant-1). * sin(theta_scan(ii))); spectrum(ii) 1 / abs(a * noise_sub * noise_sub * a); end plot(theta_scan*180/pi, 10*log10(spectrum));这段代码省去了多频点回波的距离单元选择实际仿真里应先对每个天线接收到的Y分别做ifft在距离像峰值所在的索引上取复数构成 8 维快拍。MUSIC 的空间谱峰值就是目标角度。多目标场景的关键是目标个数先验可以通过特征值大小判断频率步进的距离分辨已经让目标不在同一距离单元时MUSIC 只需要在单距离快拍上工作角度维分辨不受目标接近限制。本文还有配套的精品资源点击获取
返回列表