diff --git a/Radar simulation/get_downconversion_pulse.m b/Radar simulation/get_downconversion_pulse.m deleted file mode 100644 index 4f79479..0000000 --- a/Radar simulation/get_downconversion_pulse.m +++ /dev/null @@ -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 \ No newline at end of file diff --git a/Radar simulation/get_reflect_pulse.m b/Radar simulation/get_reflect_pulse.m deleted file mode 100644 index cc91243..0000000 --- a/Radar simulation/get_reflect_pulse.m +++ /dev/null @@ -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 diff --git a/Radar simulation/get_transmitted_pulse.m b/Radar simulation/get_transmitted_pulse.m deleted file mode 100644 index a7e75db..0000000 --- a/Radar simulation/get_transmitted_pulse.m +++ /dev/null @@ -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 diff --git a/Radar simulation/main.m b/Radar simulation/main.m deleted file mode 100644 index 5a9edf4..0000000 --- a/Radar simulation/main.m +++ /dev/null @@ -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); \ No newline at end of file diff --git a/Radar simulation/multi target/R_d_func.m b/Radar simulation/multi target/R_d_func.m new file mode 100644 index 0000000..ce0ea3b --- /dev/null +++ b/Radar simulation/multi target/R_d_func.m @@ -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 diff --git a/Radar simulation/multi target/R_x_func.m b/Radar simulation/multi target/R_x_func.m new file mode 100644 index 0000000..30dfffa --- /dev/null +++ b/Radar simulation/multi target/R_x_func.m @@ -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 diff --git a/Radar simulation/T_x_func.m b/Radar simulation/multi target/T_x_func.m similarity index 100% rename from Radar simulation/T_x_func.m rename to Radar simulation/multi target/T_x_func.m diff --git a/Radar simulation/configure_parameters.m b/Radar simulation/multi target/config_parameters.m similarity index 60% rename from Radar simulation/configure_parameters.m rename to Radar simulation/multi target/config_parameters.m index 46daf15..47e5911 100644 --- a/Radar simulation/configure_parameters.m +++ b/Radar simulation/multi target/config_parameters.m @@ -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; diff --git a/Radar simulation/multi target/get_doppler.m b/Radar simulation/multi target/get_doppler.m new file mode 100644 index 0000000..623d533 --- /dev/null +++ b/Radar simulation/multi target/get_doppler.m @@ -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 diff --git a/Radar simulation/get_range.m b/Radar simulation/multi target/get_range.m similarity index 54% rename from Radar simulation/get_range.m rename to Radar simulation/multi target/get_range.m index b2e36ed..639e3da 100644 --- a/Radar simulation/get_range.m +++ b/Radar simulation/multi target/get_range.m @@ -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 diff --git a/Radar simulation/multi target/main.m b/Radar simulation/multi target/main.m new file mode 100644 index 0000000..148d671 --- /dev/null +++ b/Radar simulation/multi target/main.m @@ -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 diff --git a/Radar simulation/multi target/r.m b/Radar simulation/multi target/r.m new file mode 100644 index 0000000..09eb6b9 --- /dev/null +++ b/Radar simulation/multi target/r.m @@ -0,0 +1,3 @@ +function x = r(t, range, velocity) + x = range + velocity * t; +end diff --git a/Radar simulation/R_d_func.m b/Radar simulation/single target/R_d_func.m similarity index 100% rename from Radar simulation/R_d_func.m rename to Radar simulation/single target/R_d_func.m diff --git a/Radar simulation/R_x_func.m b/Radar simulation/single target/R_x_func.m similarity index 100% rename from Radar simulation/R_x_func.m rename to Radar simulation/single target/R_x_func.m diff --git a/Radar simulation/single target/T_x_func.m b/Radar simulation/single target/T_x_func.m new file mode 100644 index 0000000..eec5482 --- /dev/null +++ b/Radar simulation/single target/T_x_func.m @@ -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 diff --git a/Radar simulation/single target/config_parameters.m b/Radar simulation/single target/config_parameters.m new file mode 100644 index 0000000..8abb2ec --- /dev/null +++ b/Radar simulation/single target/config_parameters.m @@ -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; diff --git a/Radar simulation/get_doppler.m b/Radar simulation/single target/get_doppler.m similarity index 57% rename from Radar simulation/get_doppler.m rename to Radar simulation/single target/get_doppler.m index e756d0c..0d3515f 100644 --- a/Radar simulation/get_doppler.m +++ b/Radar simulation/single target/get_doppler.m @@ -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; - - freqs = ((0:len-1) * f_s) / 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; - 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 diff --git a/Radar simulation/single target/get_range.m b/Radar simulation/single target/get_range.m new file mode 100644 index 0000000..639e3da --- /dev/null +++ b/Radar simulation/single target/get_range.m @@ -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 diff --git a/Radar simulation/main2.m b/Radar simulation/single target/main.m similarity index 95% rename from Radar simulation/main2.m rename to Radar simulation/single target/main.m index b3d3d19..6d3ab16 100644 --- a/Radar simulation/main2.m +++ b/Radar simulation/single target/main.m @@ -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; diff --git a/Radar simulation/r.m b/Radar simulation/single target/r.m similarity index 100% rename from Radar simulation/r.m rename to Radar simulation/single target/r.m