function [esti_ang_deg, P_FT, fft_ang_deg] = df_FFT(snapshot, NFFT, fft_ang, array_struct, Ntarget, plot_flag) %% FFT algorithm Nsnap = size(snapshot, 2); if isempty(fft_ang) fft_freq = -180 : 360/NFFT : (180 - 360/NFFT); fft_ang_deg = asind(fft_freq / 2 * array_struct.lambda_c / array_struct.unit / 180); end % FFT spectrum zero_padded_input = complex(zeros(NFFT, Nsnap)); zero_padded_input(array_struct.eff_ch_loc+1, :) = snapshot; if Nsnap == 1 P_FT = abs(flipud(fftshift((1/Nsnap) * ((fft(zero_padded_input, NFFT)))').')).^2; else P_FT = abs(flipud(fftshift((1/Nsnap) * (sum(fft(zero_padded_input, NFFT),2))').')).^2; end % Plot if plot_flag == 1 figure() plot(fft_ang_deg, pow2db(abs(P_FT))); grid on xlabel('Angle [deg]') ylabel('Magnitude [dB]') end [pks, pks_ang, ~, ~] = findpeaks(pow2db(abs(P_FT)), fft_ang_deg); [~, order] = sort(pks, 'descend'); if isempty(pks) esti_ang_deg = nan; else esti_ang_deg = pks_ang(order(1:Ntarget)); end end