Initial ARSS. Need to improve and add functions.
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
function PatternArray = build_antenna_patterns(NumAnt, PatternType, MaxGain, AzSquintStep, AzBeamwidth, ElBeamwidth, FileList)
|
||||
% build_antenna_patterns: 안테나 방사 패턴 구조체 배열을 생성하거나 파일에서 로드합니다.
|
||||
%
|
||||
% [입력]
|
||||
% - FileList (선택사항): 각 안테나 패턴 파일 경로가 담긴 Cell Array.
|
||||
% 예: {'tx1.mat', 'tx2.mat', ''} (빈 문자열이면 수식 생성)
|
||||
|
||||
% 기본 각도 그리드 (수식 생성용)
|
||||
az_angles_default = -90:1:90;
|
||||
el_angles_default = -90:1:90;
|
||||
|
||||
% nargin을 체크하여 FileList가 안 들어왔으면 빈 셀로 초기화
|
||||
if nargin < 7
|
||||
FileList = {};
|
||||
end
|
||||
|
||||
for n = 1:NumAnt
|
||||
PatternArray(n).Type = PatternType;
|
||||
|
||||
% -------------------------------------------------------------
|
||||
% Case A: 파일 경로가 주어졌고, 실제로 파일이 존재하는 경우 (Load)
|
||||
% -------------------------------------------------------------
|
||||
if length(FileList) >= n && ~isempty(FileList{n}) && isfile(FileList{n})
|
||||
filePath = FileList{n};
|
||||
loadedData = load(filePath); % .mat 파일 로드
|
||||
|
||||
% 파일 내부에 약속된 변수명(az_angles, el_angles 등)이 있다고 가정합니다.
|
||||
PatternArray(n).az_angles = loadedData.az_angles;
|
||||
PatternArray(n).el_angles = loadedData.el_angles;
|
||||
|
||||
if strcmpi(PatternType, '2D')
|
||||
PatternArray(n).gain_dBi = loadedData.gain_dBi;
|
||||
elseif strcmpi(PatternType, '1D')
|
||||
PatternArray(n).max_gain_dBi = loadedData.max_gain_dBi;
|
||||
PatternArray(n).gain_az_dBi = loadedData.gain_az_dBi;
|
||||
PatternArray(n).gain_el_dBi = loadedData.gain_el_dBi;
|
||||
end
|
||||
|
||||
% 파일 로드 성공
|
||||
continue; % 로드가 성공했으므로 다음 안테나로 건너뜀
|
||||
end
|
||||
|
||||
% -------------------------------------------------------------
|
||||
% Case B: 파일이 없거나 경로가 비어있는 경우 (수식 기반 자동 생성)
|
||||
% -------------------------------------------------------------
|
||||
PatternArray(n).az_angles = az_angles_default;
|
||||
PatternArray(n).el_angles = el_angles_default;
|
||||
|
||||
% 안테나 번호에 따라 빔이 조향된 각도(Squint Angle) 계산
|
||||
% 예 (3개): (1-2)*5 = -5도, (2-2)*5 = 0도, (3-2)*5 = +5도
|
||||
squint_az = (n - (NumAnt + 1)/2) * AzSquintStep;
|
||||
|
||||
if strcmpi(PatternType, '2D')
|
||||
[AZ, EL] = meshgrid(PatternArray(n).az_angles, PatternArray(n).el_angles);
|
||||
PatternArray(n).gain_dBi = MaxGain - 3*((AZ - squint_az)/AzBeamwidth).^2 - 3*(EL/ElBeamwidth).^2;
|
||||
PatternArray(n).gain_dBi(PatternArray(n).gain_dBi < -20) = -20;
|
||||
|
||||
elseif strcmpi(PatternType, '1D')
|
||||
PatternArray(n).max_gain_dBi = MaxGain;
|
||||
|
||||
PatternArray(n).gain_az_dBi = MaxGain - 3*((PatternArray(n).az_angles - squint_az)/AzBeamwidth).^2;
|
||||
PatternArray(n).gain_az_dBi(PatternArray(n).gain_az_dBi < -20) = -20;
|
||||
|
||||
PatternArray(n).gain_el_dBi = MaxGain - 3*(PatternArray(n).el_angles/ElBeamwidth).^2;
|
||||
PatternArray(n).gain_el_dBi(PatternArray(n).gain_el_dBi < -20) = -20;
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user