1) Figure 창 on/off 토글 추가
2) Coverage 분석 도구 추가 - 추가 검증 필요
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user