81 lines
3.1 KiB
Matlab
81 lines
3.1 KiB
Matlab
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 |