Оптимизация алгоритмов LFM
Автор
fs = 60e6;
t_imp = 1.5e-6;
t_period = 200e-6;
n_imp = 128;
wi = 2*pi*75e6;
c = 3e8;
lambda = 0.1;
dw = 2*pi*5e6;
dist_tg = [13000, 25000];
vel_tg = [0, 900];
n_vel_tg = mod( round(vel_tg * 2 * n_imp * t_period / lambda), n_imp ) + 1;
n_imp_etalon = round(t_imp*fs);
window_dist = gausswin(n_imp_etalon, 1.4);
t_etalon = (0:n_imp_etalon-1)' / fs;
sig_etalon = exp(-1j*((0-dw/2)+dw/(t_imp*2).*t_etalon).*t_etalon) .* window_dist;
n_period = round(t_period*fs);
n_total = n_period * n_imp;
t_total = (0:n_total-1)' / fs;
out_sig_matlab = zeros(n_period, 2);
for k = 1:2
sig_echo = zeros(n_total, 1);
for i = 1:n_total
t_val = (i-1)/fs;
n = floor(t_val / t_period);
t_del = 2 * dist_tg(k) / c;
t_inside = t_val - t_del - n * t_period;
if (t_val >= n*t_period + t_del) && (t_val < n*t_period + t_del + t_imp)
sig_echo(i) = sin(((wi - dw/2) + dw/(t_imp*2) * t_inside) * t_inside);
end
end
sig_echo = sig_echo .* exp(1j * 2*pi * 2 * vel_tg(k) / lambda * t_total);
get = exp(1j * 2*pi * (fs/4) * t_total);
sig_get = sig_echo .* get;
sig_mat = reshape(sig_get, n_period, n_imp);
fft_mat = fft(sig_mat, [], 1);
sig_etalon_padded = [sig_etalon; zeros(n_period - n_imp_etalon, 1)];
fft_etalon = fft(sig_etalon_padded);
fft_etalon_mat = repmat(fft_etalon, 1, n_imp);
opfilt_mat = ifft(fft_mat .* conj(fft_etalon_mat), [], 1);
sig_fft = fft(opfilt_mat, [], 2);
abs_sig = abs(sig_fft);
log_sig = 20*log10(abs_sig + eps);
max_sig_k = max(log_sig(:, n_vel_tg(k)));
out_sig_matlab(:, k) = log_sig(:, n_vel_tg(k)) - max_sig_k;
end
x_t = (0:n_period-1)' / fs * 1e6;
figure('Visible', 'off');
plot(x_t, out_sig_matlab(:,1), 'k-', x_t, out_sig_matlab(:,2), 'k--'); grid on;
xlabel('Дальность [м]'); ylabel('Амплитуда сжатого импульса [дБ]');
legend('V = 0 м/с', 'V = 900 м/с', 'Location', 'best');
title('MATLAB результат');
saveas(gcf, 'plot_matlab.png');
close(gcf);