Initial ARSS. Need to improve and add functions.
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
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
|
||||
Reference in New Issue
Block a user