function [rd_map, doppler_axis] = process_doppler_fft(range_profile, RadarParams) % 입력: % - range_profile: [NumRx, NumTx, NumChirps, NumRangeBins] % - RadarParams: 메인 파라미터 구조체 NumChirps = RadarParams.Waveform.NumChirps; [~, ~, ~, ~] = size(range_profile); % 중심 주파수에서의 파장 lambda = RadarParams.Waveform.lambda_c; % = c/fc % 1. 처프 간 반복 주기 (PRI, Pulse Repetition Interval) T_pri = RadarParams.Waveform.PRI; % 2. Main.m에서 생성된 Doppler-FFT용 윈도우 함수 적용 win_doppler = RadarParams.SP.RDM.window_doppler; if length(win_doppler) ~= NumChirps error('Doppler window length mismatch: expected %d, got %d', NumChirps, length(win_doppler)); end win_data = range_profile .* reshape(win_doppler, [1, 1, NumChirps, 1]); % 3. Doppler-FFT 수행 (3번째 차원: Chirp) % 해상도를 위해 NFFT를 NumChirps보다 크게 잡을 수도 있습니다. rd_fft = fft(win_data, NumChirps, 3); % 4. fftshift 적용 (속도 0을 중심으로 정렬) % [-, 0, +] 순서로 속도 축이 정렬됩니다. rd_map = fftshift(rd_fft, 3); % 5. 속도 축(Velocity Axis) 계산 % 최대 탐지 속도 Vmax = lambda / (4 * T_pri) v_max = lambda / (4 * T_pri); % 속도 해상도 dv = lambda / (2 * NumChirps * T_pri) doppler_axis = linspace(-v_max, v_max, NumChirps); end