Files
ARSS/04. Signal Processing/process_doppler_fft.m

45 lines
1.8 KiB
Matlab

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