41 lines
1007 B
Matlab
41 lines
1007 B
Matlab
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
|
|
|