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