Initial Commit.
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user