我已经插入代码了啊% 多通道FMCW雷达系统仿真(高精度测距版)
clear; close all; clc;
%% 1. 系统参数设置(提升分辨率参数)
fc = 77.0e9; % 载波频率 77 GHz
B = 1.0e9; % 增大扫频带宽至1GHz(提升距离分辨率)
T = 200.0e-6; % 扫频时间 200 μs
Fs = 40.0e6; % 提高采样频率至40MHz
c = 3e8; % 光速
num_channels = 3; % 接收通道数
num_chirps = 64; % 增加Chirp数至64(提升多普勒分辨率)
lambda = c/fc; % 波长
% 性能参数计算
d_res = c/(2*B); % 距离分辨率(理论值)
R_max = (c*T*Fs)/(2*B); % 最大不模糊距离
v_max = lambda/(4*T); % 最大不模糊速度
fprintf('=== 多通道FMCW雷达系统参数 ===\n');
fprintf('载波频率: %.1f GHz, 波长: %.3f mm\n', fc/1e9, lambda*1e3);
fprintf('扫频带宽: %.1f GHz, 扫频时间: %.1f μs\n', B/1e9, T*1e6);
fprintf('通道数: %d, 每帧Chirp数: %d, 采样频率: %.1f MHz\n', num_channels, num_chirps, Fs/1e6);
fprintf('距离分辨率: %.3f m, 最大不模糊距离: %.1f m\n', d_res, R_max);
fprintf('最大不模糊速度: %.1f m/s\n', v_max);
%% 2. 目标参数设置(含无人机微多普勒)
target_params = [
60.0 5.2 1.2 0.05; % 距离(m)、速度(m/s)、RCS、微多普勒振幅(减小微动影响)
120.0 -3.8 0.8 0.04;
210.0 0.5 0.5 0.03
];
num_targets = size(target_params, 1);
% 多径参数(弱多径设置,减少干扰)
multipath_params = [
60.5 0.2; % 多径距离略偏离真实目标,RCS降低
120.6 0.1;
210.8 0.08
];
num_multipaths = num_targets;
% 打印目标信息
fprintf('\n=== 目标设置 ===\n');
for i = 1:num_targets
fprintf('目标%d: 距离=%.1f m, 速度=%.1f m/s, RCS=%.1f\n', ...
i, target_params(i,1), target_params(i,2), target_params(i,3));
end
%% 3. 信号生成(多通道Chirp信号)
t_chirp = 0:1/Fs:T-1/Fs; % 单Chirp时间向量
N = length(t_chirp); % 每Chirp采样点数
t_frame = 0:T:(num_chirps-1)*T; % 帧时间
% 发射信号(多通道,含相位偏移)
slope = B/T; % 调频斜率
tx_signals = zeros(num_channels, N, num_chirps);
for ch = 1:num_channels
phase_offset = 2*pi*(ch-1)*0.05; % 减小通道相位差
for chirp = 1:num_chirps
tx_signals(ch,:,chirp) = exp(1j*(2*pi*(fc*(t_chirp + t_frame(chirp)) + ...
0.5*slope*(t_chirp + t_frame(chirp)).^2) + phase_offset));
end
end
%% 4. 接收信号生成(含噪声优化)
rx_signals = zeros(num_channels, N, num_chirps);
for ch = 1:num_channels
for chirp = 1:num_chirps
rx_chirp = 0;
t_current = t_chirp + t_frame(chirp);
% 真实目标回波(元素级运算)
for i = 1:num_targets
R0 = target_params(i,1);
v = target_params(i,2);
rcs = target_params(i,3);
v_micro = target_params(i,4);
% 时变距离(含微动)
R = R0 - v*t_current + v_micro*sin(2*pi*30*t_current); % 降低微动频率
% 衰减与多普勒(元素级运算)
tau = 2*R/c;
attenuation = rcs ./ (R .^ 2); % 修复矩阵运算错误
f_doppler = 2*(v - v_micro*30*2*pi*cos(2*pi*30*t_current))/lambda;
rx_chirp = rx_chirp + attenuation .* exp(1j*(2*pi*(fc*(t_current - tau) + ...
0.5*slope*(t_current - tau).^2) + 2*pi*f_doppler.*t_current));
end
% 多径回波
for i = 1:num_multipaths
R_mp = multipath_params(i,1);
rcs_mp = multipath_params(i,2);
tau_mp = 2*R_mp/c;
attenuation_mp = rcs_mp ./ (R_mp .^ 2);
rx_chirp = rx_chirp + attenuation_mp .* exp(1j*(2*pi*(fc*(t_current - tau_mp) + ...
0.5*slope*(t_current - tau_mp).^2)));
end
rx_signals(ch,:,chirp) = rx_chirp;
end
end
% 提高信噪比(减少噪声影响)
SNR_dB = 25; % 信噪比提升至25dB
rx_power = mean(abs(rx_signals(1,:,:)).^2, 'all');
noise_power = rx_power / (10^(SNR_dB/10));
for ch = 1:num_channels
noise = sqrt(noise_power/2) * (randn(1, N, num_chirps) + 1j*randn(1, N, num_chirps));
rx_signals(ch,:,:) = rx_signals(ch,:,:) + noise;
end
%% 5. 高精度信号处理
% 5.1 通道均衡(自适应算法)
eq_weights = ones(num_channels, 1);
ref_ch = 1;
for ch = 2:num_channels
% 基于互相关的精确均衡
corr_vals = xcorr(abs(rx_signals(ref_ch,:,1)), abs(rx_signals(ch,:,1)));
[~, max_idx] = max(corr_vals);
delay = max_idx - length(rx_signals(ref_ch,:,1));
rx_shifted = circshift(rx_signals(ch,:,1), delay); % 补偿时延
eq_weights(ch) = mean(rx_signals(ref_ch,:,1) ./ rx_shifted); % 幅度相位补偿
rx_signals(ch,:,:) = rx_signals(ch,:,:) .* eq_weights(ch);
end
% 5.2 去斜处理
if_signals = zeros(num_channels, N, num_chirps);
for ch = 1:num_channels
for chirp = 1:num_chirps
if_signals(ch,:,chirp) = tx_signals(ch,:,chirp) .* conj(rx_signals(ch,:,chirp));
end
end
% 5.3 距离FFT(明确维度,确保存储正确)
range_fft_size = 2^nextpow2(16*N); % 大幅提高FFT点数
range_spectra = zeros(num_channels, range_fft_size, num_chirps); % 维度:[通道数 × range_fft_size × Chirp数]
window = chebwin(N, 60); % 切比雪夫窗(更低旁瓣)
for ch = 1:num_channels
for chirp = 1:num_chirps
if_windowed = if_signals(ch,:,chirp) .* window;
% FFT后是长度为range_fft_size的一维数组,直接赋值到对应维度
range_spectra(ch,:,chirp) = fft(if_windowed, range_fft_size);
end
end
% 5.4 多普勒FFT
doppler_fft_size = 2^nextpow2(4*num_chirps);
doppler_axis = (-doppler_fft_size/2 : doppler_fft_size/2-1) * (lambda/(4*T*doppler_fft_size)) * doppler_fft_size;
rd_spectra = zeros(num_channels, range_fft_size, doppler_fft_size);
for ch = 1:num_channels
for r = 1:range_fft_size
chirp_data = squeeze(range_spectra(ch,r,:)); % 提取距离门的Chirp序列
chirp_padded = [chirp_data, zeros(1, doppler_fft_size - num_chirps)]; % 补零
rd_spectra(ch,r,:) = fftshift(fft(chirp_padded, doppler_fft_size)); % 多普勒FFT
end
end
% 5.5 多通道相干融合
rd_spectrum = sum(rd_spectra, 1); % 相干累加(提升信噪比)
rd_spectrum = squeeze(rd_spectrum);
rd_mag = abs(rd_spectrum);
rd_dB = 20*log10(rd_mag + eps);
% 5.6 多径抑制(CFAR算法)
[n_rows, n_cols] = size(rd_dB);
guard_cells = 3;
train_cells = 10;
cfar_threshold = zeros(n_rows, n_cols);
for i = 1:n_rows
for j = 1:n_cols
% 训练单元选择
train_idx = [max(1,j-train_cells-guard_cells):max(1,j-guard_cells-1), ...
min(n_cols,j+guard_cells+1):min(n_cols,j+train_cells+guard_cells)];
if ~isempty(train_idx)
noise_level = mean(rd_dB(i,train_idx));
cfar_threshold(i,j) = noise_level + 12; % 12dB检测门限
end
end
end
rd_dB(rd_dB < cfar_threshold) = -60; % 抑制噪声和弱多径
%% 6. 高精度目标检测与参数估计
% 6.1 峰值检测(三维峰值搜索)
peaks = [];
peak_locs = [];
for i = 1:num_targets
[max_val, max_idx] = max(rd_dB(:));
[r_idx, v_idx] = ind2sub(size(rd_dB), max_idx);
peaks = [peaks; max_val];
peak_locs = [peak_locs; r_idx, v_idx];
rd_dB(r_idx-2:r_idx+2, v_idx-2:v_idx+2) = -60; % 标记后抑制,避免重复检测
end
% 6.2 高斯拟合优化峰值位置(比抛物线插值更精确)
detected_ranges = zeros(1, num_targets);
detected_velocities = zeros(1, num_targets);
for i = 1:num_targets
r_idx = peak_locs(i,1);
v_idx = peak_locs(i,2);
% 提取峰值周围数据用于拟合
r_win = max(1, r_idx-2):min(length(range_axis), r_idx+2);
v_win = max(1, v_idx-2):min(length(doppler_axis), v_idx+2);
[R_grid, V_grid] = meshgrid(range_axis(r_win), doppler_axis(v_win));
Z = rd_dB(r_win, v_win);
% 高斯拟合(最小二乘估计)
X0 = [range_axis(r_idx); doppler_axis(v_idx); 1; peaks(i); -1]; % 初始值
model = @(p, x) p(4)*exp(-((x(:,1)-p(1))/p(3)).^2 - ((x(:,2)-p(2))/p(3)).^2);
x_data = [R_grid(:), V_grid(:)];
y_data = Z(:);
p_fit = lsqcurvefit(model, X0, x_data, y_data);
detected_ranges(i) = p_fit(1); % 拟合后的距离
detected_velocities(i) = p_fit(2); % 拟合后的速度
end
%% 7. 测距误差计算
true_ranges = target_params(:,1);
range_errors = detected_ranges - true_ranges; % 测距误差
% 误差统计指标
mean_abs_error = mean(abs(range_errors)); % 平均绝对误差
rmse = sqrt(mean(range_errors.^2)); % 均方根误差
max_error = max(abs(range_errors)); % 最大误差
%% 8. 结果可视化
figure('Position', [100, 100, 1400, 1000]);
% 8.1 距离-多普勒谱
subplot(2,2,1);
imagesc(range_axis, doppler_axis, rd_dB');
colormap('jet'); colorbar;
title('距离-多普勒谱(高精度处理后)');
xlabel('距离 (m)'); ylabel('速度 (m/s)');
xlim([0, 250]); ylim([-8, 8]); axis xy;
hold on;
plot(true_ranges, target_params(:,2), 'go', 'MarkerSize', 8, 'LineWidth', 2);
plot(detected_ranges, detected_velocities, 'ro', 'MarkerSize', 6, 'LineWidth', 2);
legend('真实目标', '检测目标');
hold off;
% 8.2 测距误差条形图
subplot(2,2,2);
bar(range_errors);
title('各目标测距误差');
xlabel('目标序号'); ylabel('误差 (m)');
grid on; ylim([-0.05, 0.05]);
xticks(1:num_targets);
% 8.3 通道均衡效果
subplot(2,2,3);
plot(range_axis, abs(range_spectra(1,:,1)), 'b-', 'LineWidth', 1.2);
hold on;
plot(range_axis, abs(range_spectra(2,:,1)), 'r--', 'LineWidth', 1.2);
plot(range_axis, abs(range_spectra(2,:,1).*eq_weights(2)), 'g-', 'LineWidth', 1.2);
title('通道均衡效果');
xlabel('距离 (m)'); ylabel('幅度');
legend('通道1', '通道2(均衡前)', '通道2(均衡后)');
xlim([0, 250]); grid on;
% 8.4 目标1的距离谱细节
t1_range = true_ranges(1);
t1_idx = find(range_axis >= t1_range-1 & range_axis <= t1_range+1);
subplot(2,2,4);
plot(range_axis(t1_idx), rd_dB(t1_idx, abs(doppler_axis - target_params(1,2)) < 0.2), 'b-', 'LineWidth', 1.5);
hold on;
plot(detected_ranges(1), max(rd_dB(t1_idx,:)), 'ro', 'MarkerSize', 8);
plot(t1_range, max(rd_dB(t1_idx,:))-5, 'go', 'MarkerSize', 8);
title('目标1距离谱细节');
xlabel('距离 (m)'); ylabel('幅度 (dB)');
legend('距离谱', '检测峰值', '真实位置');
grid on;
%% 9. 结果输出
fprintf('\n=== 高精度测距结果 ===\n');
fprintf('%-8s %-12s %-12s %-12s\n', '目标', '真实距离(m)', '检测距离(m)', '测距误差(m)');
fprintf('------------------------------------------------\n');
for i = 1:num_targets
fprintf('目标%-6d %-12.4f %-12.4f %-12.6f\n', ...
i, true_ranges(i), detected_ranges(i), range_errors(i));
end
fprintf('\n=== 误差统计 ===\n');
fprintf('平均绝对误差: %.6f m\n', mean_abs_error);
fprintf('均方根误差(RMSE): %.6f m\n', rmse);
fprintf('最大误差: %.6f m\n', max_error);
fprintf('\n仿真完成!\n');
最新发布