Оптимизация алгоритмов LFM
Author
fs = 60e6
t_imp = 1.5e-6
t_period = 200e-6
n_imp = 128
wi = 2π * 75e6
c = 3e8
lambda = 0.1
dw = 2π * 5e6
dist_tg = [13000.0, 25000.0]
vel_tg = [0.0, 900.0]
tmp = vel_tg * 2 * n_imp * t_period / lambda
tmp_rounded = round.(tmp)
tmp_int = Int.(tmp_rounded)
n_vel_tg = mod.(tmp_int, n_imp) .+ 1
n_imp_etalon = Int(round(t_imp * fs))
window_dist = EngeeDSP.Functions.gausswin(n_imp_etalon, 1.4)
t_etalon = (0:n_imp_etalon-1) / fs
sig_etalon = exp.(-1im * ((0 - dw/2) .+ dw/(t_imp*2) .* t_etalon) .* t_etalon) .* window_dist
n_period = Int(round(t_period * fs))
out_sig_julia = zeros(n_period, length(dist_tg))
for k in eachindex(dist_tg)
dist = dist_tg[k]
vel = vel_tg[k]
t_del = 2 * dist / c
f_dop = 2 * vel / lambda + fs/4
i_start = floor(Int, t_del * fs) + 1
i_end = floor(Int, (t_del + t_imp) * fs)
rows = i_start:i_end
t_inside = (rows .- 1) ./ fs .- t_del
phase = ((wi - dw/2) .+ (dw/(t_imp*2)) .* t_inside) .* t_inside
sig_echo_vals = sin.(phase)
sig_mat = zeros(ComplexF64, n_period, n_imp)
for n in 0:n_imp-1
t_abs = n * t_period .+ (rows .- 1) ./ fs
exp_vals = exp.(1im * 2π * f_dop * t_abs)
sig_mat[rows, n+1] = sig_echo_vals .* exp_vals
end
fft_mat = EngeeDSP.Functions.fft(sig_mat)
sig_etalon_padded = vcat(sig_etalon, zeros(ComplexF64, n_period - n_imp_etalon))
fft_etalon = EngeeDSP.Functions.fft(sig_etalon_padded)
fft_etalon_mat = repeat(fft_etalon, 1, n_imp)
opfilt_mat = EngeeDSP.Functions.ifft(fft_mat .* conj(fft_etalon_mat))
sig_fft = EngeeDSP.Functions.fft(opfilt_mat, n_imp, 2)
abs_sig = abs.(sig_fft)
log_sig = 20 * log10.(abs_sig .+ eps(Float64))
max_sig_k = maximum(log_sig[:, n_vel_tg[k]])
out_sig_julia[:, k] = log_sig[:, n_vel_tg[k]] .- max_sig_k
end
x_t = (0:n_period-1) / fs * 1e6
jl_p = plot(x_t, out_sig_julia[:, 1], color=:black, linestyle=:solid, linewidth=1,
label="V = 0 м/с", xlabel="Дальность [м]", ylabel="Амплитуда сжатого импульса [дБ]",
title="Julia результат", grid=true)
plot!(x_t, out_sig_julia[:, 2], color=:black, linestyle=:dash, linewidth=1, label="V = 900 м/с")
plot!(legend=:best)
savefig("plot_julia.png")