125 lines
4.5 KiB
Matlab
125 lines
4.5 KiB
Matlab
function [snapshot, total_SNR_dB, R_nf, r_m_array, sv_mat, noise] = gen_sig_for_df(fc, target_rng, elev_deg, azi_deg, SNR_dB, txarray_loc, rxarray_loc, Nsnap, ch_error, noise_flag)
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%
|
|
% Generating raw data(snapshot) for direction finding
|
|
% Start : 23.06.01
|
|
% End : 23.08.25
|
|
% developed by Kwanggoo Yeo
|
|
%
|
|
% Description
|
|
% - Input
|
|
% - 1) fc [vector], [Hz] : Center freqeuncy of radar Tx signal
|
|
% - 2) target_rng [vector], [m] : Distance(range) from the radar to each target
|
|
% - 3) elev_deg [vector], [deg] : Elevation angle for each taret
|
|
% - 4) azi_deg [vector], [deg] : Azimuth angle for each taret
|
|
% - 5) SNR_dB [vector], [dB] : SNR for each taret
|
|
% - 6) txarray_loc [matrix], [m] : Locations of txarray elements in cartesian coordinate
|
|
% - 7) rxarray_loc [matrix], [m] : Locations of rxarray elements in cartesian coordinate
|
|
% - 8) Nsnap [scalar], [-] : The number of snapshots to generate
|
|
% - 9) ch_error [vector], [-] : gain & phase error for each element in virtual array
|
|
% - 10) noise_flag [scalar], [-] : Flag for noise which is included in snapshot (1) or not (0)
|
|
%
|
|
% - Output
|
|
% - 1) snapshot [matrix], [-] : Generated raw data(snapshot)
|
|
% - 2) total_SNR_dB [scalar], [dB] : SNR of snapshot, not SNR of signal in single element
|
|
% - 3) R_nf [scalar], [m] : Distance of near-field (Frensel Region)
|
|
% - 4) r_m_array [matrix], [m] : Distance from the targets to each element in virtual array
|
|
% - 5) sv_amt [matrix], [-] : Steering matrix
|
|
% - 6) noise [matrix], [-] : Generated noise in each element in virtual array
|
|
%
|
|
% History
|
|
% (23.08.25) Completed
|
|
%
|
|
% Referece
|
|
% -
|
|
%
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%% Assumptions
|
|
%
|
|
% 1. Non-dispersion medium
|
|
% 2. Narrowband
|
|
% 3. No assumption on Near/Far-field
|
|
% 4. Geometry
|
|
% 4-1. Cartesian(x-y-z) 좌표계이며, 레이더 시스템의 local coordinate
|
|
% 4-2. Elevation angle : x-y 평면 기준으로 위 : + , 아래 : -
|
|
% 4-3. Azimuth angle : x-y 평면 상에서, x축의 왼쪽 : +, 오른쪽 : -
|
|
% 4-4. Virtual array (tx1, rx1) 채널의 위치를 원점으로 기준(coordinate origin)
|
|
% 4-5. x축 : 레이더 boresignt 방향
|
|
% 5. Monostatic radar system
|
|
|
|
%% Basic constants settings
|
|
|
|
c0 = physconst('LightSpeed');
|
|
lambda_c = c0/fc;
|
|
k_c = 2*pi / lambda_c;
|
|
|
|
Np = length(azi_deg); % Number of targets
|
|
|
|
% ch_error must be column vector
|
|
if size(ch_error, 1) == 1
|
|
ch_error = ch_error.';
|
|
end
|
|
|
|
%% Array settings
|
|
|
|
Nt = size(txarray_loc, 2);
|
|
Nr = size(rxarray_loc, 2);
|
|
|
|
% Near field region calcuation
|
|
array_dist = zeros(Nt*Nr, 1);
|
|
for txidx = 1 : Nt
|
|
for rxidx = 1 : Nr
|
|
array_dist(Nr*(txidx-1) + rxidx) = sqrt(sum((txarray_loc(:,txidx) - rxarray_loc(:,rxidx)).^2));
|
|
end
|
|
end
|
|
max_len_array = max(array_dist);
|
|
R_nf = 2 * max_len_array^2 / lambda_c;
|
|
|
|
% Target location calcuation in Cartesian
|
|
target_loc = zeros(3, Np);
|
|
for tidx = 1 : Np
|
|
target_loc(:, tidx) = [target_rng(tidx)*cosd(elev_deg(tidx))*sind(azi_deg(tidx)) ; target_rng(tidx)*cosd(elev_deg(tidx))*cosd(azi_deg(tidx)); target_rng(tidx)*sind(elev_deg(tidx))];
|
|
end
|
|
|
|
% Generating steering vector(sv) matrix
|
|
r_m_array = complex(zeros(Nt*Nr, Np));
|
|
sv_mat = complex(zeros(Nt*Nr, Np));
|
|
|
|
for target_idx = 1 : Np
|
|
for txarray_idx = 1 : Nt
|
|
for rxarray_idx = 1 : Nr
|
|
r_m_array(Nr*(txarray_idx-1)+rxarray_idx, target_idx) = sqrt(sum((txarray_loc(:, txarray_idx) - target_loc(:, target_idx)).^2)) + sqrt(sum((rxarray_loc(:, rxarray_idx) - target_loc(:, target_idx)).^2));
|
|
sv_mat(Nr*(txarray_idx-1)+rxarray_idx, target_idx) = exp(1i * k_c * r_m_array(Nr*(txarray_idx-1)+rxarray_idx, target_idx));
|
|
end
|
|
end
|
|
sv_mat(:, target_idx) = sv_mat(:, target_idx) .* ch_error;
|
|
sv_mat(:, target_idx) = sv_mat(:, target_idx) * conj(sv_mat(1, target_idx));
|
|
end
|
|
|
|
|
|
%% Signal Generation
|
|
% Calculating signal complex gain baed on SNR_dB
|
|
noise = (sqrt(0.5) * (randn(Nt*Nr, Nsnap) + 1i * randn(Nt*Nr, Nsnap)));
|
|
Pn = sum(diag(noise * noise')/Nsnap) / (Nt*Nr);
|
|
|
|
sig = zeros(Np, Nsnap);
|
|
for target_idx = 1 : Np
|
|
Ps = 10^(SNR_dB(target_idx)/10) * Pn;
|
|
sig(target_idx, :) = sqrt(Ps) * exp(1i * 2 * pi * rand(1, Nsnap));
|
|
end
|
|
|
|
% Signal model
|
|
if noise_flag == 1
|
|
snapshot = sv_mat * sig + noise;
|
|
else
|
|
snapshot = sv_mat * sig;
|
|
end
|
|
|
|
% Total SNR_dB
|
|
Ps_total = sum(diag((sv_mat * sig) * (sv_mat * sig)')/Nsnap) / (Nt*Nr);
|
|
total_SNR_dB = 10 * log10( Ps_total / Pn );
|
|
|
|
end
|
|
|