Update Radar simulation

This commit is contained in:
Ksyer
2024-02-21 16:41:12 +08:00
parent ec0f95c639
commit f357a0c3a7
20 changed files with 219 additions and 187 deletions
@@ -1,41 +0,0 @@
function s_R_tlide = get_downconversion_pulse(s_R, f_n)
config_parameters;
s_R_tlide = complex(zeros(1, len));
real_s_R_tlide = zeros(1, len);
imag_s_R_tlide = zeros(1, len);
% down conversion
for t_idx = 1:len
t = range_t(t_idx);
p = rem(t, T_r);
% if (p > T_p)
% continue
% end
n = (t - p) / T_r;
s_R_tlide(t_idx) = s_R(t_idx) * exp(-1 * 1j * 2 * pi * f_n(t_idx) * (t - n * T_r));
real_s_R_tlide(t_idx) = real(s_R_tlide(t_idx));
imag_s_R_tlide(t_idx) = imag(s_R_tlide(t_idx));
end
if figure_flag_3
figure(3)
title("Received signal (after down conversion)")
subplot(2, 1, 1);
plot(range_t, imag_s_R_tlide);
xlabel("Time (s)");
ylabel("sin(\omega t)");
ylim([-1, 1]);
subplot(2, 1, 2);
plot(range_t, real_s_R_tlide);
xlabel("Time (s)");
ylabel("cos(\omega t)");
ylim([-1, 1]);
end
end
-49
View File
@@ -1,49 +0,0 @@
function s_R = get_reflect_pulse(s_T)
config_parameters;
s_R = complex(zeros(1, len));
real_s_R = zeros(1, len);
imag_s_R = zeros(1, len);
for t_idx = 1:len
t = range_t(t_idx);
p = rem(t, T_r);
if (p > T_p)
continue
end
n = (t - p) / T_r;
t_diff = 2 * (r_0 + velocity * n * T_r) / c;
new_t_idx = floor((t + t_diff) / delta_t);
if new_t_idx > len
continue;
end
s_R(new_t_idx) = scatter_coef * s_T(t_idx);
end
real_s_R = real(s_R);
imag_s_R = imag(s_R);
if figure_flag_2
figure(2)
title("Received signal")
subplot(2, 1, 1);
plot(range_t, imag_s_R);
xlabel("Time (s)");
ylabel("sin(\omega t)");
ylim([-1, 1]);
subplot(2, 1, 2);
plot(range_t, real_s_R);
xlabel("Time (s)");
ylabel("cos(\omega t)");
ylim([-1, 1]);
end
end
-40
View File
@@ -1,40 +0,0 @@
function [C_n, f_n, s_T] = get_transmitted_pulse()
config_parameters;
s_T = complex(zeros(1, len));
C_n = zeros(1, len);
f_n = zeros(1, len);
for t_idx = 1:len
t = range_t(t_idx);
p = rem(t, T_r); % p = t - nT_r
if (p > T_p)
continue
end
C_n(t_idx) = floor(rand * (M - 1));
f_n(t_idx) = f_c + C_n(t_idx) * Delta_f;
s_T(t_idx) = exp(1j * 2 * pi * f_n(t_idx) * p);
end
real_s_T = real(s_T);
imag_s_T = imag(s_T);
if figure_flag_1
figure(1)
title("Transmitted signal")
subplot(2, 1, 1);
plot(range_t, imag_s_T);
xlabel("Time (s)");
ylabel("sin(\omega t)");
ylim([-1, 1]);
subplot(2, 1, 2);
plot(range_t, real_s_T);
xlabel("Time (s)");
ylabel("cos(\omega t)");
ylim([-1, 1]);
end
end
-13
View File
@@ -1,13 +0,0 @@
% This file to show the transmitted pulse for single signal
clc;
clear;
config_parameters;
[C_n, f_n, s_T] = get_transmitted_pulse();
s_R = get_reflect_pulse(C_n, f_n);
s_R_tlide = get_downconversion_pulse(s_R, f_n);
r = get_range(s_T, s_R);
dopp = get_doppler(s_T, s_R_tlide);
+13
View File
@@ -0,0 +1,13 @@
function y = R_d_func(t, range, velocity)
global c f_n T_r;
ti = t - (2 / c) * r(t, range, velocity);
p = rem(ti, T_r); % p = t - nT_r
n = round((ti - p) / T_r);
if (n < 0)
n = 0;
end
y = R_x_func(t, range, velocity) * exp(1j * -2 * pi * f_n(n + 1) * (t - n * T_r));
end
+5
View File
@@ -0,0 +1,5 @@
function y = R_x_func(t, range, velocity)
global scatter_coef c;
ti = t - (2 / c) * r(t, range, velocity);
y = scatter_coef * T_x_func(ti);
end
@@ -1,4 +1,4 @@
global M N K d epsilon f_c Delta_f c scatter_coef B f_s T_p T_r r_0 velocity lambda delta_t max_t range_t len freqs slow_len
global M N K d epsilon f_c Delta_f c scatter_coef B f_s T_p T_r r_0 velocity lambda delta_t max_t range_t len freqs slow_len num_pulse
N = 128; % 脉冲个数
M = 1; % 频点个数
@@ -15,26 +15,24 @@ scatter_coef = 0.3; % 目标散射强度
B = 64e6; % 带宽 64MHz
% B_0 = 1e9;
f_s = 3 * f_c; % 快时间采样率
T_p = 100 / f_s; % 单载频脉冲下的采样周期 / 脉冲宽度
T_p = 1e-6 / 3; % 单载频脉冲下的采样周期 / 脉冲宽度
f_s = 100 / T_p; % 快时间采样率
T_r = T_p * 10;
r_0 = 4; % 初始距离 r(0)
velocity = 3e4; % 目标速度(假设目标做匀速直线运动)
lambda = c / f_c; % 雷达工作波长
% 仿真时间
num_pulse = 100;
delta_t = 1e-2 * T_p;
max_t = 100 * T_r;
range_t = 0:delta_t:max_t-delta_t;
max_t = num_pulse * T_r;
range_t = 0:delta_t:max_t - delta_t;
len = round(max_t / delta_t);
freqs = ((0:len-1) * f_s) / len;
freqs = ((0:len - 1) * f_s) / len;
% 绘图
figure_flag_1 = false;
figure_flag_2 = false;
figure_flag_3 = false;
slow_len = 128;
slow_len = 1e4;
@@ -0,0 +1,47 @@
function v = get_doppler(s_T, s_R)
global T_r delta_t c f_c velocity max_t slow_len;
freq_s_T = 1 / T_r;
slow_freqs = ((0:slow_len - 1) * (1 / T_r)) / slow_len;
range_t_slow = 1:slow_len;
num_slow = max_t / T_r;
s_R_slow = zeros(1, slow_len);
k = floor(T_r / delta_t);
idx = 1;
while abs(s_R(idx)) == 0
idx = idx + 1;
end
for i = 0:num_slow - 1
while abs(s_R(idx + i * k)) == 0
idx = idx + 1;
end
s_R_slow(i + 1) = s_R(idx + i * k);
end
s_R_fft = fft(s_R_slow);
[~, max_index_s_R] = max(s_R_fft);
freq_s_R = slow_freqs(max_index_s_R);
figure(2);
subplot(2, 1, 1);
plot(range_t_slow, abs(s_R_slow));
title(sprintf('s_R'));
subplot(2, 1, 2);
plot(slow_freqs, abs(s_R_fft));
title(sprintf('s_R_fft, freq = %E', freq_s_R));
xlabel('频率 (Hz)');
f_d = freq_s_T - freq_s_R;
fprintf("doppler_freq = %E\n\n", f_d);
v = (c * f_d) / (2 * f_c);
fprintf("v: %E\norigin_velocity: %E\n", v, velocity);
end
@@ -1,29 +1,19 @@
function [range, range_idx] = get_range(s_T, s_R)
global T_r delta_t len c r_0 range_t freqs;
global T_r delta_t len c r_0 range_t num_pulse;
% 只取第一个 T_r 的数据计算
range_N = T_r / delta_t;
s_T_first = [s_T(1:range_N), zeros(1, len - range_N)];
s_R_first = [s_R(1:range_N), zeros(1, len - range_N)];
figure(1);
plot(range_t, s_T_first, color='red');
hold on;
plot(range_t, s_R_first, color='blue');
s_T_fft = fft(s_T_first, len);
s_R_fft = fft(s_R_first, len);
figure(2);
plot(freqs, s_T_fft, color='red');
hold on;
plot(freqs, s_R_fft, color='blue');
t = conj(s_T_fft);
p = ifft(s_R_fft .* t);
% 发射信号和回波信号做相关
p = ifft(s_R_fft .* conj(s_T_fft));
norm_p = real(p).^2 + imag(p).^2;
% plot(range_t, norm_p);
[~, range_idx] = max(norm_p);
range = range_t(range_idx) * c / 2;
fprintf("range = %f, r_0 = %f\n", range, r_0);
end
+50
View File
@@ -0,0 +1,50 @@
%%
clc;
clear;
config_parameters;
target_num = 2;
range = [250, 140];
velocity = [3e2, 15];
global C_n f_n;
C_n = zeros(target_num, len);
f_n = zeros(target_num, len);
for n_idx = 1:target_num
for t_idx = 1:len
C_n(n_idx, t_idx) = floor(rand * (M - 1));
f_n(n_idx, t_idx) = f_c + C_n(n_idx, t_idx) * Delta_f;
end
end
T_x = zeros(target_num, len);
R_x = zeros(target_num, len);
R_d = zeros(target_num, len);
for n_idx = 1:target_num
for t_idx = 1:len
t = range_t(t_idx);
T_x(n_idx, t_idx) = T_x_func(t);
R_x(n_idx, t_idx) = R_x_func(t, range(n_idx), velocity(n_idx));
R_d(n_idx, t_idx) = R_d_func(t, range(n_idx), velocity(n_idx));
end
end
%%
r = zeros(1, target_num);
range_idx = zeros(1, target_num);
doppler = zeros(1, target_num);
for n_idx = 1:target_num
[r(n_idx), range_idx(n_idx)] = get_range(T_x(n_idx, :), R_x(n_idx, :));
doppler(n_idx) = get_doppler(T_x(n_idx, :), R_d(n_idx, :));
end
+3
View File
@@ -0,0 +1,3 @@
function x = r(t, range, velocity)
x = range + velocity * t;
end
+14
View File
@@ -0,0 +1,14 @@
function y = T_x_func(t)
global T_r T_p f_n;
p = rem(t, T_r); % p = t - nT_r
n = round((t - p) / T_r);
if (p > T_p)
y = 0;
elseif (p <= 0)
y = 0;
else
y = exp(1j * 2 * pi * f_n(n + 1) * p);
end
end
@@ -0,0 +1,40 @@
global M N K d epsilon f_c Delta_f c scatter_coef B f_s T_p T_r r_0 velocity lambda delta_t max_t range_t len freqs slow_len num_pulse
N = 128; % 脉冲个数
M = 1; % 频点个数
K = 10; % 目标个数
d = 32;
epsilon = 1e-5; % 误差
f_c = 10e9; % 初始载频 10GHz
Delta_f = 8e6; % 载频步进间隔 8MHz
% c = 299792458; % 光速
c = 3e8;
scatter_coef = 0.3; % 目标散射强度
B = 64e6; % 带宽 64MHz
% B_0 = 1e9;
T_p = 1e-6 / 3; % 单载频脉冲下的采样周期 / 脉冲宽度
f_s = 100 / T_p; % 快时间采样率
T_r = T_p * 10;
r_0 = 30; % 初始距离 r(0)
velocity = 3e2; % 目标速度(假设目标做匀速直线运动)
lambda = c / f_c; % 雷达工作波长
% 仿真时间
num_pulse = 100;
delta_t = 1e-2 * T_p;
max_t = num_pulse * T_r;
range_t = 0:delta_t:max_t - delta_t;
len = round(max_t / delta_t);
freqs = ((0:len - 1) * f_s) / len;
% 绘图
figure_flag_1 = false;
figure_flag_2 = false;
figure_flag_3 = false;
slow_len = 1e4;
@@ -1,9 +1,8 @@
function doppler = get_doppler(s_T, s_R)
global T_r delta_t len f_s c f_c velocity max_t slow_len;
function v = get_doppler(s_T, s_R)
global T_r delta_t c f_c velocity max_t slow_len;
freq_s_T = 1 / T_r;
freqs = ((0:len-1) * f_s) / len;
slow_freqs = ((0:slow_len-1) * (1 / T_r)) / slow_len;
slow_freqs = ((0:slow_len - 1) * (1 / T_r)) / slow_len;
range_t_slow = 1:slow_len;
num_slow = max_t / T_r;
@@ -11,15 +10,17 @@ function doppler = get_doppler(s_T, s_R)
k = floor(T_r / delta_t);
init_idx = 1;
while abs(s_R(init_idx)) == 0
init_idx = init_idx + 1;
end
init_idx
for i = 0: num_slow - 1
for i = 0:num_slow - 1
while abs(s_R(init_idx + i * k)) == 0
init_idx = init_idx + 1;
end
s_R_slow(i + 1) = s_R(init_idx + i * k);
end
@@ -28,24 +29,19 @@ function doppler = get_doppler(s_T, s_R)
freq_s_R = slow_freqs(max_index_s_R);
figure(2);
subplot(2,1,1);
subplot(2, 1, 1);
plot(range_t_slow, abs(s_R_slow));
title(sprintf('s_R'));
subplot(2,1,2);
subplot(2, 1, 2);
plot(slow_freqs, abs(s_R_fft));
title(sprintf('s_R_fft, freq = %E', freq_s_R));
xlabel('频率 (Hz)');
f_d = 1/T_r - freq_s_R;
f_d = freq_s_T - freq_s_R;
fprintf("s_R_freq = %d\n", max_index_s_R);
fprintf("doppler_freq = %E\n\n", f_d);
v = (c * f_d) / (2 * f_c);
fprintf("%E\n", 2 * f_c * velocity / c);
fprintf("v: %E\norigin_velocity: %E\n", v, velocity);
doppler_v = (c * f_d) / (2 * f_c);
fprintf("doppler_v: %E\nvelocity: %E\n", doppler_v, velocity);
doppler = doppler_v;
end
@@ -0,0 +1,19 @@
function [range, range_idx] = get_range(s_T, s_R)
global T_r delta_t len c r_0 range_t num_pulse;
% 只取第一个 T_r 的数据计算
range_N = T_r / delta_t;
s_T_first = [s_T(1:range_N), zeros(1, len - range_N)];
s_R_first = [s_R(1:range_N), zeros(1, len - range_N)];
s_T_fft = fft(s_T_first, len);
s_R_fft = fft(s_R_first, len);
% 发射信号和回波信号做相关
p = ifft(s_R_fft .* conj(s_T_fft));
norm_p = real(p).^2 + imag(p).^2;
[~, range_idx] = max(norm_p);
range = range_t(range_idx) * c / 2;
fprintf("range = %f, r_0 = %f\n", range, r_0);
end
@@ -2,7 +2,7 @@
clc;
clear;
configure_parameters;
config_parameters;
global C_n f_n;
C_n = zeros(1, len);
@@ -25,7 +25,7 @@ for i = 1:len
end
%%
if true
if false
figure(5)
plot(range_t, T_x, color="red");
hold on;