function fig = visualize_antenna_pattern(PatternArray, AntennaName) % visualize_antenna_pattern: 여러 개의 안테나 패턴 단면을 겹쳐서 도시합니다. % 입력에 AntennaName (예: 'TX', 'RX')을 추가하여 창 이름을 구분합니다. if nargin < 2 AntennaName = 'Antenna'; % 기본값 end fig_name = sprintf('%s Radiation Pattern Cuts', AntennaName); fig = figure('Name', fig_name, 'Position', [200, 200, 1000, 700]); NumAnt = length(PatternArray); colors = lines(NumAnt); % [전역 Y축 범위 탐색] y_min_total = inf; y_max_total = -inf; for i = 1:NumAnt pat = PatternArray(i); if strcmpi(pat.Type, '2D') y_min_total = min(y_min_total, min(pat.gain_dBi(:))); y_max_total = max(y_max_total, max(pat.gain_dBi(:))); else y_min_total = min(y_min_total, min([pat.gain_az_dBi(:); pat.gain_el_dBi(:)])); y_max_total = max(y_max_total, max([pat.gain_az_dBi(:); pat.gain_el_dBi(:)])); end end % --------------------------------------------------------- % [Subplot 1] 상단: Azimuth Pattern Cut % --------------------------------------------------------- subplot(2, 1, 1); hold on; grid on; for i = 1:NumAnt pat = PatternArray(i); if strcmpi(pat.Type, '2D') el0_idx = find(abs(pat.el_angles - 0) < 1e-6, 1); az_gain_cut = pat.gain_dBi(el0_idx, :); else az_gain_cut = pat.gain_az_dBi; end plot(pat.az_angles, az_gain_cut, '-', 'Color', colors(i,:), 'LineWidth', 2.5, 'DisplayName', sprintf('%s %d', AntennaName, i)); end title(sprintf('[%s] Azimuth Radiation Pattern Cut (at Elevation = 0^\\circ)', AntennaName), 'FontSize', 12); xlabel('Azimuth Angle (deg)', 'FontSize', 11); ylabel('Antenna Gain (dBi)', 'FontSize', 11); xlim([min(PatternArray(1).az_angles), max(PatternArray(1).az_angles)]); ylim([y_min_total - 2, y_max_total + 2]); legend('show', 'Location', 'south'); hold off; % --------------------------------------------------------- % [Subplot 2] 하단: Elevation Pattern Cut % --------------------------------------------------------- subplot(2, 1, 2); hold on; grid on; for i = 1:NumAnt pat = PatternArray(i); if strcmpi(pat.Type, '2D') az0_idx = find(abs(pat.az_angles - 0) < 1e-6, 1); el_gain_cut = pat.gain_dBi(:, az0_idx); else el_gain_cut = pat.gain_el_dBi; end plot(pat.el_angles, el_gain_cut, '-', 'Color', colors(i,:), 'LineWidth', 2.5, 'DisplayName', sprintf('%s %d', AntennaName, i)); end title(sprintf('[%s] Elevation Radiation Pattern Cut (at Azimuth = 0^\\circ)', AntennaName), 'FontSize', 12); xlabel('Elevation Angle (deg)', 'FontSize', 11); ylabel('Antenna Gain (dBi)', 'FontSize', 11); xlim([min(PatternArray(1).el_angles), max(PatternArray(1).el_angles)]); ylim([y_min_total - 2, y_max_total + 2]); legend('show', 'Location', 'south'); hold off; end