生成64个雷达回波,并且绘制RD图,matlab程序
%% 参数设置
clear; clc;close all;
fs = 30e6; % 采样率 (Hz)
Tr = 100e-6; % 脉冲重复周期 (s)
Tp = 50e-6; % 脉宽 (s)
B = 10e6; % 带宽 (Hz)
mu = B / Tp; % 调频斜率 (Hz/s)
c = 3e8; % 光速 (m/s)
v = 15; % 目标径向速度 (m/s),远离为正
f0 = 10e9; % 载频 (Hz)
lambda = c / f0; % 波长 (m)
fd = 2 * v / lambda; % 多普勒频移 (Hz)
R0 = 5000; % 初始距离 (m)
tau0 = 2 * R0 / c; % 初始时延 (s)
% 离散参数
Npri = round(fs * Tr); % 每个脉冲周期的采样点数 = 3000
Npulse = round(fs * Tp); % 脉冲宽度内的采样点数 = 1500
num_pulses = 64; % 脉冲数
% 快时间轴(仅用于生成 LFM 波形)
t_fast = (0:Npulse-1) / fs; % 长度 1500
deltaRange = (c/fs)/2; %相邻采样点的距离差
%% 生成单个 LFM 脉冲(无时延)
lfm_base = exp(1j * pi * mu * t_fast.^2); % 基带 LFM 信号
figure;
plot(real(lfm_base));
%% 初始化接收矩阵(脉冲数 × 每周期采样点数)
rx_matrix = zeros(num_pulses, Npri, 'like', 1j);
%% 生成每个脉冲的回波
tau = zeros(num_pulses, 1); %存储延时
for k = 0:num_pulses-1
% 1. 当前脉冲的时延(含距离走动)
tau_k = tau0 + (2 * v * k * Tr) / c;
tau(k+1) = tau_k; % 存储第k个脉冲的延时
% 2. 时延对应的采样偏移(可能非整数,这里简单取整)
shift = tau_k * fs;
start_idx = round(shift) + 1; % MATLAB 索引从1开始
end_idx = start_idx + Npulse - 1; % Npulse表示一个脉冲的长度
% 3. 多普勒相位(脉冲整体乘常数)
doppler_phase = exp(1j * 2 * pi * fd * k * Tr);
% 4. 将 LFM 信号放入对应位置并乘以多普勒相位
if end_idx <= Npri && start_idx >= 1
rx_matrix(k+1, start_idx:end_idx) = lfm_base * doppler_phase;
end
end
%% 添加噪声
SNR_dB = 0; % 信噪比,单位 dB,可调
signal_power = mean(abs(lfm_base).^2); % 应该等于 1
noise_power = signal_power / (10^(SNR_dB/10));
% 生成复高斯白噪声(均值为0,方差为 noise_power)
noise = sqrt(noise_power/2) * (randn(size(rx_matrix)) + 1j*randn(size(rx_matrix)));
rx_matrix= rx_matrix + noise;
figure;
plot(real(rx_matrix(1,:)));
% rx_matrix 为 64×3000 的复矩阵,每行对应一个脉冲周期内的采样数据
%% 生成距离-多普勒图
mf = conj(fliplr(lfm_base)); % 匹配滤波器
pc_matrix = zeros(num_pulses, Npri); % 存储脉压后的矩阵
for k = 1:num_pulses
echo = rx_matrix(k,:); % 取出来第k个脉冲回波
conv_full = conv(echo, mf); % 进行卷积
pc_matrix(k,:) = conv_full(Npulse : Npulse+Npri-1);
end
figure;
plot(abs(pc_matrix(1,:)));
title('第1个脉冲的脉压结果');
%% 多普勒处理
doppler_matrix = fftshift(fft(pc_matrix, num_pulses, 1), 1); %多普勒处理的矩阵
doppler_map = abs(doppler_matrix); % 取绝对值
%% 坐标轴
range_bin = (0:Npri-1)*(c/(2*fs)); % 距离门
f_d = (-num_pulses/2 : num_pulses/2-1)/(num_pulses*Tr); % 多普勒频率
v_axis = f_d*lambda/2; %
%% 绘图
figure;
imagesc(range_bin, v_axis, 20*log10(doppler_map + eps));
axis xy; colormap(jet);
xlabel('距离 (m)');
ylabel('速度 (m/s)');
title('距离-多普勒图');
colorbar;
% 将幅度转换为 dB(可选,使动态范围更清晰)
doppler_map_db = 20 * log10(doppler_map + eps); % 避免 log10(0)
%% 绘制三维曲面
% 将幅度转换为 dB(可选,使动态范围更清晰)
%doppler_map = doppler_map./max(doppler_map);
doppler_map_db = 20 * log10(doppler_map + eps); % 避免 log10(0)
%% 目标出现在1001列
tarN = 1001;
tarecho = doppler_map(:,1001);
figure;
plot(v_axis,abs(tarecho ));
xlabel('速度 (m/s)');
ylabel('幅度');
%% 绘制三维距离-多普勒图
figure;
% 使用 surf 绘制曲面,X=距离,Y=速度,Z=幅度(dB)
surf(range_bin, v_axis, doppler_map_db, 'EdgeColor', 'none'); % 'EdgeColor','none' 去掉网格线,避免过密
xlabel('距离 (m)');
ylabel('速度 (m/s)');
zlabel('幅度 (dB)');
title('三维距离-多普勒图');
colormap(jet); % 与二维图一致的配色
colorbar; % 显示颜色条
% 调整视角:方位角 -30°,仰角 30°(可根据需要修改)
view(30, 20);
% 使坐标轴范围紧贴数据
axis tight;
zlim([20 100]);
% 可选:添加光照效果使曲面更具立体感
% lighting gouraud;
% light('Position', [1 0 1], 'Style', 'infinite');

