Files
ARSS/02. Channel/apply_channel_effects.m
T

59 lines
2.4 KiB
Matlab

function ChannelOut = apply_channel_effects(RadarParams)
Target = RadarParams.Target;
TxPos = RadarParams.Antenna.TxPos;
RxPos = RadarParams.Antenna.RxPos;
NumChirps = RadarParams.Waveform.NumChirps;
Timing = RadarParams.Waveform.Timing;
fs_adc = RadarParams.Waveform.fs_adc;
f_start = RadarParams.Waveform.f_start;
Slope = RadarParams.Waveform.Slope;
c = RadarParams.Basic.c;
NumTx = size(TxPos, 2);
NumRx = size(RxPos, 2);
NumTargets = Target.NumTargets;
T_pri = RadarParams.Waveform.PRI;
t_adc = 0 : 1/fs_adc : (Timing.AdcSampTime - 1/fs_adc);
N_adc = length(t_adc);
% [핵심] 처프 내 샘플별 순시 주파수 및 파장 계산
% t_adc에 따라 주파수가 변하므로 파장(lambda)도 샘플마다 변함
f_inst = f_start + Slope * t_adc;
lambda_t = c ./ f_inst;
ChannelOut.tau = zeros(NumTargets, NumRx, NumTx, NumChirps, N_adc);
ChannelOut.space_loss_amp = zeros(NumTargets, NumRx, NumTx, NumChirps, N_adc);
ref_point = (TxPos(:,1) + RxPos(:,1)) / 2;
for k = 1:NumTargets
az_rad = deg2rad(Target.az(k));
el_rad = deg2rad(Target.el(k));
rel_pos0 = Target.R(k) * [cos(el_rad)*sin(az_rad); cos(el_rad)*cos(az_rad); sin(el_rad)];
target_world_pos0 = ref_point + rel_pos0;
v_vec = Target.v(k) * (rel_pos0 / norm(rel_pos0));
sigma = 10^(Target.rcs(k)/10);
for m = 0:NumChirps-1
% 처프 간 이동 반영
target_pos_at_chirp = target_world_pos0 + v_vec * (m * T_pri);
for tx = 1:NumTx
for rx = 1:NumRx
% 처프 내 샘플별 이동 반영
curr_target_pos = target_pos_at_chirp + v_vec * t_adc;
d_tx = sqrt(sum((curr_target_pos - TxPos(:,tx)).^2, 1));
d_rx = sqrt(sum((curr_target_pos - RxPos(:,rx)).^2, 1));
% TTD 지연 시간 저장
ChannelOut.tau(k, rx, tx, m+1, :) = (d_tx + d_rx) / c;
% [가변 파장 적용] 주파수 대역폭에 따른 공간 감쇠 변화 반영
denom = (4*pi)^3 * (d_tx.^2 .* d_rx.^2);
ChannelOut.space_loss_amp(k, rx, tx, m+1, :) = sqrt((lambda_t.^2 * sigma) ./ denom);
end
end
end
end
end