这里按"雷达作为通信链路"的思路来做------也就是把雷达发射→目标散射→接收→解调看成一条"通信信道",在数字域仿真波形设计 → 发射 → 信道(含RCS/路径损耗)→ 接收 → 解调/估计的全过程。:一套传统脉冲雷达链路(测距+测速),一套雷达通信一体化 ISAC(chirp 扩频传比特)
一、系统模型
1.1 雷达"通信过程"三层含义
| 理解 | 仿真重点 |
|---|---|
| ① 传统雷达链路 | 发射 chirp/脉冲 → 目标 RCS → 回波 → 匹配滤波 → 距离/速度估计 |
| ② 雷达通信一体化 ISAC | 把信息比特调制到 chirp/OFDM 雷达波形上,接收端既测距又解调 |
| ③ 雷达网间"通信" | 多雷达节点数据交互(这个偏组网,代码太长,先不铺) |
下面 ① 给完整主干 + ② 给核心段,都能直接跑。
1.2 链路框图(① 传统雷达)
信息比特(可选) → 波形产生(FMCW chirp) → 发射天线 → 自由空间+RCS → 接收天线+噪声 → 混频+ADC → 2D-FFT → 距离/速度估计
二、MATLAB:FMCW 雷达链路仿真
2.1 主脚本 fmcw_radar_link_sim.m
matlab
%% FMCW 雷达链路仿真(把雷达当"通信过程"看)
clear; clc; close all;
%% ===== 1. 雷达参数 =====
c = 3e8;
fc = 77e9; % 77GHz 车载雷达
B = 500e6; % 扫频带宽 500MHz
Tchirp = 50e-6; % chirp 周期 50us
lambda = c/fc;
% 目标参数
R_true = 80; % 真实距离 80m
v_true = 15; % 径向速度 15m/s(朝向雷达为正)
RCS = 10; % 雷达散射截面积 dBsm,转线性 10^(RCS/10)=10
% ADC & 帧
fs = 4e6; % 采样率 4MHz
Nchirp = 256; % 每帧 chirp 数(速度维)
Nfft_r = 2048; % 距离 FFT 点数
Nfft_v = 256; % 速度 FFT 点数
fprintf('FMCW 雷达参数: fc=%.1f GHz, B=%.1f MHz, Tchirp=%.1f us\n', fc/1e9, B/1e6, Tchirp*1e6);
fprintf('目标: R=%.1f m, v=%.1f m/s, RCS=%.1f dBsm\n', R_true, v_true, 10*log10(RCS));
%% ===== 2. 发射波形(锯齿调频)=====
t = (0:1/fs:Tchirp-1/fs).';
k = B / Tchirp; % 调频斜率
% 单 chirp 基带(复包络)
tx_baseband = exp(1j*pi*k*t.^2); % 发射复数 chirp
tx_real = real(exp(1j*2*pi*fc*t) .* tx_baseband); % 上变频后实信号(仿真可省略射频)
% 延拓到 Nchirp 帧
tx_frame = repmat(tx_baseband, Nchirp, 1); % Nchirp × Nsamp
%% ===== 3. 目标回波("通信信道")=====
% 单程延时 tau = 2R/c,考虑速度引起延时变化(逐 chirp 微调)
Nsamp = length(t);
tau0 = 2*R_true / c;
rx_frame = zeros(Nchirp, Nsamp);
for m = 1:Nchirp
% 当前 chirp 目标距离(匀速)
Rm = R_true - v_true * (m-1) * Tchirp;
tau_m = 2*Rm / c;
% 延时 + 多普勒相位
% 数字域用分数延时近似:把 tx 平移 + 乘多普勒相
delay_samples = tau_m * fs;
delay_int = floor(delay_samples);
delay_frac = delay_samples - delay_int;
% 线性插值做分数延时(简化)
rx_chirp = delay_sig(tx_baseband, delay_int, delay_frac);
% 多普勒相位:fd = 2v/λ, 每 chirp 附加相位 2π*fd*m*Tchirp
fd = 2*v_true / lambda;
doppler_phase = 2*pi*fd * (m-1) * Tchirp;
rx_chirp = rx_chirp * exp(1j*doppler_phase);
% ===== 雷达"信道":路径损耗 + RCS =====
% 雷达方程简化:Pr ∝ RCS / (4πR^2)^2 * Pt*G^2*λ^2 / (4π)^3
% 仿真里我们归一化 Pt=1, G=1,只留 RCS 和距离衰减
path_loss = 1 / (Rm^4 + eps); % 双程 R^4
rx_chirp = rx_chirp * sqrt(RCS * path_loss);
rx_frame(m,:) = rx_chirp.';
end
%% ===== 4. 噪声(AWGN,"通信过程"的接收机噪声)=====
SNR_dB = 15; % 接收 SNR(这里指信号峰值/噪声功率)
rx_power = mean(abs(rx_frame(:)).^2);
noise_power = rx_power / (10^(SNR_dB/10));
noise = sqrt(noise_power/2) * (randn(size(rx_frame)) + 1j*randn(size(rx_frame)));
rx_frame_noisy = rx_frame + noise;
fprintf('接收 SNR 设定: %.1f dB\n', SNR_dB);
%% ===== 5. 混频 + 距离 FFT(传统雷达接收机)=====
% 去斜(dechirp):rx × conj(tx)
dechirped = rx_frame_noisy .* conj(repmat(tx_baseband.', Nchirp, 1));
% 距离 FFT(每 chirp 独立)
R_FFT = fft(dechirped, Nfft_r, 2);
R_FFT = fftshift(R_FFT, 2);
% 速度 FFT(每距离 bin 沿 chirp 维)
RD_map = fft(dechirped, Nfft_v, 1);
RD_map = fftshift(RD_map, 1);
% 距离-速度 2D-FFT(经典做法:先距离后速度,或反过来)
% 这里做 2D-FFT 直接
rd_2d = fft2(dechirped, Nfft_v, Nfft_r);
rd_2d = fftshift(rd_2d, 1);
rd_2d = fftshift(rd_2d, 2);
%% ===== 6. 距离/速度估计 =====
% 频率→距离:fr = 2kR/c → R = fr * c / (2k)
freq_axis_r = (-Nfft_r/2:Nfft_r/2-1) * fs / Nfft_r;
range_axis = freq_axis_r * c / (2*k);
% 速度轴:fv = 2v/λ → v = fv * λ / 2
freq_axis_v = (-Nfft_v/2:Nfft_v/2-1) / (Nchirp * Tchirp);
vel_axis = freq_axis_v * lambda / 2;
% 峰值搜索
[~, idx_v] = max(abs(rd_2d(:)));
[est_v_idx, est_r_idx] = ind2sub(size(rd_2d), idx_v);
R_est = range_axis(est_r_idx);
v_est = vel_axis(est_v_idx);
fprintf('\n===== 估计结果 =====\n');
fprintf('距离: 真值 %.1f m | 估计 %.1f m | 误差 %.3f m\n', R_true, R_est, abs(R_est-R_true));
fprintf('速度: 真值 %.1f m/s | 估计 %.1f m/s | 误差 %.3f m/s\n', v_true, v_est, abs(v_est-v_true));
%% ===== 7. 可视化 =====
figure('Color','w','Position',[100 100 1200 500]);
% 单 chirp 时域
subplot(2,4,1);
plot(t*1e6, real(tx_baseband)); xlabel('t (us)'); ylabel('幅度');
title('发射 chirp(实部)'); grid on;
subplot(2,4,2);
plot(t*1e6, abs(rx_frame(1,:))); hold on;
plot(t*1e6, abs(rx_frame_noisy(1,:)), 'r');
xlabel('t (us)'); ylabel('幅度');
title('接收回波(蓝=无噪 红=有噪)'); grid on;
% 距离谱(单 chirp)
subplot(2,4,3);
plot(range_axis, abs(R_FFT(1,:))); xlabel('距离 (m)'); ylabel('|FFT|');
title('距离 FFT(单 chirp)'); grid on;
xlim([0 150]);
% 距离-多普勒图
subplot(2,4,[4,7,8]); % 占3格
imagesc(range_axis, vel_axis, 20*log10(abs(rd_2d)/max(abs(rd_2d(:)))+eps));
xlabel('距离 (m)'); ylabel('速度 (m/s)');
title('距离-速度 2D-FFT 图'); colorbar;
hold on;
plot(R_true, v_true, 'rp', 'MarkerSize',14, 'LineWidth',2);
legend('真值');
% SNR 变化对估计影响(小扫)
subplot(2,4,5);
SNR_scan = 0:5:30;
R_err = zeros(size(SNR_scan));
for s=1:length(SNR_scan)
np = rx_power/(10^(SNR_scan(s)/10));
noi = sqrt(np/2)*(randn(size(rx_frame))+1j*randn(size(rx_frame)));
rd_tmp = fft2(rx_frame+noi, Nfft_v, Nfft_r);
rd_tmp = fftshift(rd_tmp,1); rd_tmp = fftshift(rd_tmp,2);
[~,idx] = max(abs(rd_tmp(:)));
[ev,er] = ind2sub(size(rd_tmp),idx);
R_err(s) = abs(range_axis(er)-R_true);
end
plot(SNR_scan, R_err, 'o-', 'LineWidth',1.5); grid on;
xlabel('SNR (dB)'); ylabel('距离误差 (m)');
title('SNR 对测距误差影响');
sgtitle('FMCW 雷达"通信过程"仿真', 'FontSize',14, 'FontWeight','bold');
2.2 延时子函数(手写,不搜)
matlab
function y = delay_sig(x, d_int, d_frac)
% x: 列向量, d_int 整数延时, d_frac 分数(0~1)
N = length(x);
y = zeros(size(x));
% 整数部分:平移
if d_int >= 0
y(d_int+1:end) = x(1:end-d_int);
else
y(1:end+d_int) = x(-d_int+1:end);
end
% 分数部分:邻近线性插值(简化)
if d_frac > 0
y = y + d_frac * (circshift(y, -1) - y); % 粗糙但够仿真用
end
end
参考代码 对雷达信号的通信过程进行了仿真 www.youwenfan.com/contentcsw/82167.html
三、ISAC 小段:chirp 扩频"雷达通信一体化"
如果你说的"通信过程"是指雷达波形上扛比特,给一段核心,嵌到上面框架里就能跑:
matlab
%% ===== 雷达通信一体化:chirp 扩频(每个 chirp 扛 1 bit)=====
Nbits = Nchirp;
bits = randi([0 1], Nbits, 1);
% 调制:0→+Δf, 1→-Δf(频偏键控到 chirp 斜率上)
delta_f = 200e3; % 200kHz 频偏
tx_isac = zeros(Nchirp, Nsamp);
for m = 1:Nchirp
k_m = k + (2*bits(m)-1) * delta_f / Tchirp; % 斜率微调 = 频移
tx_isac(m,:) = exp(1j*pi*k_m * t.^2).';
end
% 接收端:先雷达去斜 → 2D-FFT 测距测速
% 再:对同一距离 bin 沿 chirp 维做"频偏估计"解调比特
% 简化:对 dechirped 沿 chirp 维做 FFT,看峰值偏哪
dech_isac = tx_isac .* conj(repmat(tx_baseband.', Nchirp, 1)); % 粗同步假设
% 实际要对着目标距离 bin 抽出来,这里示意
chirp_fft = fft(dech_isac(:,find(range_axis>75&range_axis<85,1)), Nfft_v, 1);
% 峰值位置 → 判 bit(需训练 + 同步,这里只示意结构)
fprintf('ISAC: %d 个 chirp 各扛 1 bit,BER 需同步后算\n', Nbits);
这一段就是典型论文里的 FMCW-Chirp Spread Spectrum 思路,雷达测距+低速通信同时做。