脉冲压缩雷达与连续波雷达是现代雷达系统的两大主流架构,它们在目标探测、距离分辨率、抗干扰能力等方面各有优劣。这个开源仿真项目通过Matlab/Python实现了完整的雷达信号处理链路,特别聚焦于线性调频(LFM)信号的脉冲压缩处理。对于雷达算法工程师而言,这类仿真系统就像厨师的"试菜厨房"——在实际硬件投入前,所有信号处理算法都可以在这里验证效果。
我在军工院所工作时,曾用类似系统验证过某型舰载雷达的动目标检测算法。当时通过仿真发现了匹配滤波器旁瓣抑制不足的问题,避免了后期数百万的硬件返工成本。这个项目特别有价值的地方在于:它同时集成了脉冲和连续波两种模式,并提供了从信号生成、信道建模到脉冲压缩的完整源码。下面我将拆解其中最关键的三个技术模块。
线性调频信号的核心在于瞬时频率随时间线性变化。其复数表达式为:
matlab复制s(t) = rect(t/T) * exp(j2π(f0*t + 0.5*K*t^2))
其中K=B/T是调频斜率(B为带宽,T为脉宽)。在项目中,lfm_waveform.m这个函数通过以下关键参数控制信号特征:
python复制def generate_lfm(f0, B, T, fs):
t = np.arange(-T/2, T/2, 1/fs)
phase = 2*np.pi*(f0*t + 0.5*(B/T)*t**2)
return np.exp(1j*phase) * (np.abs(t) <= T/2)
关键经验:采样率fs至少需要满足2*(f0+B)的奈奎斯特准则,但实际工程中建议取4倍以上以避免频谱泄漏。我们曾因fs设置不足导致脉压后主瓣展宽15%。
在config_params.m中可以看到以下典型配置:
matlab复制params.pulse_width = 10e-6; % 10μs脉宽
params.bandwidth = 5e6; % 5MHz带宽
这组参数会产生时宽带宽积D=50的LFM信号。根据雷达方程,距离分辨率ΔR=c/(2B)≈30米(c为光速)。但实际项目中我们发现:
项目中的matched_filter.m实现了经典的频域脉压处理:
python复制def pulse_compression(signal, template):
fft_signal = np.fft.fft(signal)
fft_template = np.fft.fft(template)
return np.fft.ifft(fft_signal * np.conj(fft_template))
但有几个工程细节需要注意:
实测数据对比:
| 处理方式 | 主瓣宽度(ns) | 峰值旁瓣比(dB) |
|---|---|---|
| 不加窗 | 98 | -13.2 |
| 汉明窗 | 112 | -42.7 |
| 凯泽窗(β=3.5) | 105 | -56.3 |
当目标存在径向速度时,会引起多普勒频移fd=2v/λ。项目中doppler_compensation.m采用MTD(动目标检测)处理:
matlab复制for i = 1:Npulse
range_profile(i,:) = fft(squeeze(data_cube(i,:,:)), [], 2);
end
velocity_profile = fft(range_profile, [], 1);
我们在某次测试中发现:当目标速度导致回波跨越距离门时,会出现"跨单元走动"现象。解决方法是在脉压前增加:
python复制# 速度估计与补偿
v_est = (lambda * fd_est) / 2
phase_comp = np.exp(-1j*2*np.pi*2*v_est*t/c)
项目中的cw_processor.m实现了FMCW雷达的典型流程:
关键参数关系:
code复制距离分辨率 ΔR = c/(2B)
最大测距 Rmax = fs*c/(2*K)
速度分辨率 Δv = λ/(2*Tobs)
在测试多目标场景时,我们发现当两个目标距离差为c/(2B)的整数倍时,会出现"幽灵目标"。项目中通过以下方法改善:
matlab复制% 在fft前加窗
window = chebwin(length(beat_signal), 60);
spectrum = fft(beat_signal .* window);
实测表明,切比雪夫窗可将虚假目标抑制30dB以上,但会加宽主瓣。需要在config.m中根据场景调整窗函数参数。
通过test_pulse_compression.m可验证处理增益:
python复制input_snr = -15 # dB
output_snr = 10*log10(D) + input_snr
当D=50时,理论增益应为17dB。但实测中发现:
原项目的FFT处理存在重复计算问题。我们改进后的版本:
matlab复制% 预计算模板频谱
template_fft = conj(fft(template, N_fft));
% 批量处理回波
parfor i = 1:N_pulse
result(i,:) = ifft(fft(signal(i,:),N_fft) .* template_fft);
end
在1000个脉冲的测试中,处理时间从23.6s降至4.8s(i7-11800H处理器)。
在某次外场试验中,强目标旁瓣掩盖了邻近小目标。通过对比仿真数据,发现是接收机非线性导致。解决方案:
simulate_channel.m中增加非线性模型python复制# 原匹配滤波器
h_mf = np.conj(template[::-1])
# 改进的失配滤波器
R = np.correlate(template, template, 'full')
w = np.linalg.solve(R + 1e-3*np.eye(len(R)), h_mf)
当目标速度引起的多普勒频移超过PRF/2时,会出现速度模糊。项目中扩展的解决方案:
matlab复制% 双PRF解模糊
v_unambig = lambda/(4*(1/PRF1 - 1/PRF2));
true_velocity = measured_v + k*v_unambig;
需要特别注意PRF比值的选择,避免公约数导致的解模糊失败。