function [rd_map, doppler_axis] = process_doppler_fft(range_profile, RadarParams) % 입력: % - range_profile: [NumRx, NumTx, NumChirps, NumRangeBins] % - RadarParams: 메인 파라미터 구조체 NumChirps = RadarParams.Waveform.NumChirps; window_type = RadarParams.SP.RDM.window_type_doppler; [~, ~, ~, ~] = size(range_profile); % 중심 주파수에서의 파장 lambda = RadarParams.Waveform.lambda_c; % = c/fc % 1. 처프 간 반복 주기 (PRI, Pulse Repetition Interval) T_pri = RadarParams.Waveform.PRI; % 2. Doppler-FFT용 윈도우 함수 (사용자 선택 가능) % 도플러 방향(3번째 차원)으로 사이드로브를 억제합니다. if strcmpi(window_type, 'none') win_doppler = ones(1, NumChirps); elseif strcmpi(window_type, 'hamming') win_doppler = hamming(NumChirps)'; elseif strcmpi(window_type, 'blackman') win_doppler = blackman(NumChirps)'; elseif strcmpi(window_type, 'hann') win_doppler = hann(NumChirps)'; else % default: 'chebwin' win_doppler = chebwin(NumChirps, 60)'; % 60dB 사이드로브 억제 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