function [range_profile, range_axis] = process_range_fft_lpf(adc_raw_data, RadarParams) % 입력: % - adc_raw_data: [NumRx, NumTx, NumChirps, N_samples] % - RadarParams: 메인 파라미터 구조체 fs_adc = RadarParams.Waveform.fs_adc; Slope = RadarParams.Waveform.Slope; fc_lpf_Hz = RadarParams.Rxpath.fc_lpf; window_type = RadarParams.SP.RDM.window_type_range; [~, ~, ~, N_samples] = size(adc_raw_data); c = RadarParams.Basic.c; % 1. 윈도우 함수 적용 if strcmpi(window_type, 'none') win = ones(1, N_samples); elseif strcmpi(window_type, 'hamming') win = hamming(N_samples)'; elseif strcmpi(window_type, 'blackman') win = blackman(N_samples)'; elseif strcmpi(window_type, 'chebwin') win = chebwin(N_samples, 60)'; else % default: 'hann' win = hann(N_samples)'; end win_data = adc_raw_data .* reshape(win, [1, 1, 1, N_samples]); % 2. Range-FFT 수행 range_fft = fft(win_data, N_samples, 4); % 3. 주파수 및 거리 축 계산 df = fs_adc / N_samples; freq_axis = (0 : N_samples-1) * df; full_range_axis = (freq_axis * c) / (2 * Slope); % 4. Ideal LPF 컷오프 인덱스 산출 cutoff_idx = floor(fc_lpf_Hz / df); % 인덱스가 유효 범위를 넘지 않도록 방어 코드 half_idx = floor(N_samples/2); final_idx = min(cutoff_idx, half_idx); % 5. [핵심 수정] 데이터 잘라내기 (Truncation) % 1번 인덱스부터 final_idx까지만 추출하여 메모리 점유율을 줄임 range_profile = range_fft(:, :, :, 1:final_idx); range_axis = full_range_axis(1:final_idx); end