1) Figure 창 on/off 토글 추가

2) Coverage 분석 도구 추가 - 추가 검증 필요
This commit is contained in:
2026-03-05 20:01:31 +09:00
parent f09e267fc2
commit c4a98fc313
2 changed files with 402 additions and 34 deletions
+78 -34
View File
@@ -10,6 +10,17 @@ currentFilePath = mfilename('fullpath');
currentFolder = fileparts(currentFilePath);
addpath(genpath(currentFolder));
%% =================== ===================
% figure를 on/off .
PlotToggle.range_profile = false; % Step 8 Range Profile
PlotToggle.tx_single = false; % Figure 1 Single chirp waveform
PlotToggle.tx_multi = false; % Figure 2 Multi chirp waveform
PlotToggle.tx_antenna = false; % Figure 3 TX antenna pattern
PlotToggle.rx_antenna = false; % Figure 4 RX antenna pattern
PlotToggle.rd_map = false; % Figure 5 Range-Doppler map
PlotToggle.cfar = false; % Figure 6 CFAR detections
PlotToggle.coverage = true; % Figure 7 Coverage analysis
%% =================== ===================
% 1)
@@ -205,15 +216,17 @@ adc_digital_expanded = reshape(adc_digital, [size(adc_digital,1), 1, size(adc_di
[range_data, r_axis] = process_range_fft_lpf(adc_digital_expanded, RadarParams);
% step 8. Range Profile (1 , 1 )
figure('Name', 'Range Profile with Ideal LPF');
plot(r_axis, 20*log10(abs(squeeze(range_data(1,1,1,:)))));
grid on; hold on;
xlabel('Range (m)');
ylabel('Magnitude (dB)');
title(['Range Profile (LPF Cut-off: ', num2str(RadarParams.Rxpath.fc_lpf/1e6), ' MHz)']);
if PlotToggle.range_profile
figure('Name', 'Range Profile with Ideal LPF');
plot(r_axis, 20*log10(abs(squeeze(range_data(1,1,1,:)))));
grid on; hold on;
xlabel('Range (m)');
ylabel('Magnitude (dB)');
title(['Range Profile (LPF Cut-off: ', num2str(RadarParams.Rxpath.fc_lpf/1e6), ' MHz)']);
% LPF
xline((RadarParams.Rxpath.fc_lpf * RadarParams.Basic.c)/(2*RadarParams.Waveform.Slope), '--r', 'LPF Cut-off');
% LPF
xline((RadarParams.Rxpath.fc_lpf * RadarParams.Basic.c)/(2*RadarParams.Waveform.Slope), '--r', 'LPF Cut-off');
end
% step 9. Doppler-FFT
[rd_cube, v_axis] = process_doppler_fft(range_data, RadarParams);
@@ -232,40 +245,71 @@ idx_single = (t <= T_chirp);
t_single = t(idx_single);
tx_mask_single = tx_mask(idx_single);
fig_single = visualize_tx_waveform(t_single, RadarParams.Waveform.Timing, RadarParams.Waveform.fc, RadarParams.Waveform.f_start, RadarParams.Waveform.Slope, tx_mask_single, RadarParams.Waveform.nonideal.peak_phase_error, RadarParams.Waveform.nonideal.f_ripple);
fig_single = [];
if PlotToggle.tx_single
fig_single = visualize_tx_waveform(t_single, RadarParams.Waveform.Timing, RadarParams.Waveform.fc, RadarParams.Waveform.f_start, RadarParams.Waveform.Slope, tx_mask_single, RadarParams.Waveform.nonideal.peak_phase_error, RadarParams.Waveform.nonideal.f_ripple);
end
% [Figure 2] 퀀 MIMO
% (: mimoMode와 NumTx )
fig_multi = visualize_multi_tx_waveform(t, RadarParams.Waveform.Timing, RadarParams.Waveform.fc, RadarParams.Waveform.f_start, RadarParams.Waveform.Slope, tx_mask, NumChirps, RadarParams.Waveform.mimoMode, NumTx);
fig_multi = [];
if PlotToggle.tx_multi
fig_multi = visualize_multi_tx_waveform(t, RadarParams.Waveform.Timing, RadarParams.Waveform.fc, RadarParams.Waveform.f_start, RadarParams.Waveform.Slope, tx_mask, NumChirps, RadarParams.Waveform.mimoMode, NumTx);
end
% --- [ Figure 3, 4: ] ---
% 'TX' 'RX' .
fig_tx_ant = visualize_antenna_pattern(TxPattern, 'TX');
fig_rx_ant = visualize_antenna_pattern(RxPattern, 'RX');
% [Figure 5] Range-Doppler Map (NumRx NCI RDM)
fig_rd_map = visualize_rd_map_with_spurs(target_rd_map, r_axis, v_axis, Target, RadarParams.SpurParams, RadarParams, RadarParams.Waveform.Slope);
% [Figure 6] CFAR (2D MAP )
fig_cfar = figure('Name', 'CFAR Detections on NCI RDM');
imagesc(r_axis, v_axis, 20*log10(abs(target_rd_map)));
axis xy;
colormap(jet);
colorbar;
xlabel('Range (m)');
ylabel('Velocity (m/s)');
title('CFAR Detections (Circle Markers)');
hold on;
if ~isempty(cfar_detections)
det_d_idx = cfar_detections(:,1); % Doppler bin index
det_r_idx = cfar_detections(:,2); % Range bin index
det_r = r_axis(det_r_idx);
det_v = v_axis(det_d_idx);
plot(det_r, det_v, 'wo', 'MarkerSize', 7, 'LineWidth', 1.5);
fig_tx_ant = [];
if PlotToggle.tx_antenna
fig_tx_ant = visualize_antenna_pattern(TxPattern, 'TX');
end
hold off;
fig_rx_ant = [];
if PlotToggle.rx_antenna
fig_rx_ant = visualize_antenna_pattern(RxPattern, 'RX');
end
% [Figure 5] Range-Doppler Map (NumRx NCI RDM)
fig_rd_map = [];
if PlotToggle.rd_map
fig_rd_map = visualize_rd_map_with_spurs(target_rd_map, r_axis, v_axis, Target, RadarParams.SpurParams, RadarParams, RadarParams.Waveform.Slope);
end
% [Figure 6] CFAR (2D MAP )
fig_cfar = [];
if PlotToggle.cfar
fig_cfar = figure('Name', 'CFAR Detections on NCI RDM');
imagesc(r_axis, v_axis, 20*log10(abs(target_rd_map)));
axis xy;
colormap(jet);
colorbar;
xlabel('Range (m)');
ylabel('Velocity (m/s)');
title('CFAR Detections (Circle Markers)');
hold on;
if ~isempty(cfar_detections)
det_d_idx = cfar_detections(:,1); % Doppler bin index
det_r_idx = cfar_detections(:,2); % Range bin index
det_r = r_axis(det_r_idx);
det_v = v_axis(det_d_idx);
plot(det_r, det_v, 'wo', 'MarkerSize', 7, 'LineWidth', 1.5);
end
hold off;
end
% ================= Coverage Analysis (Performance Analysis) =================
% [Figure 7] Angular Coverage : 2D SNR
% 100m, RCS 0 dBsm SNR
snr_coverage_2d = [];
azimuth_deg = [];
elevation_deg = [];
coverage_info = [];
fig_coverage = [];
if PlotToggle.coverage
[snr_coverage_2d, azimuth_deg, elevation_deg, coverage_info, fig_coverage] = analyze_coverage(RadarParams, 10, 0);
end