RD图绘制-雷达回波模拟-距离多普勒图绘制

生成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');


相关推荐
imuliuliang9 小时前
关于数据结构在算法设计中的核心作用解析7
算法
2401_8949155311 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
普通网友12 小时前
共识算法实现:从工作量证明到权益证明的演进
算法·区块链·共识算法
ldmd28413 小时前
地图生成算法(噪声篇-Perlin,Simplex,Value noise)
算法·go·地图生成
国科安芯13 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
小陈phd14 小时前
集成检索介绍
算法
小poop14 小时前
轮转数组:从暴力到最优,一题掌握算法复杂度分析
数据结构·算法·leetcode
樱桃读报僵尸14 小时前
说说 LLMRouter,Agent 执行过程中怎么动态的选择 LLM
算法
gis开发之家15 小时前
《Vue3 从入门到大神40篇》Vue3 源码详解(十):diff 算法全解析 —— 为什么 Vue3 比 Vue2 更快?
javascript·算法·typescript·前端框架·vue3·vue3源码