-
Семичастнов Алексей Евгеньевич authorede51670d6
squeeze(A) = reshape(A, filter(!=(1), size(A))...)
function plotting_sig(sig,mod_ang;title = "Отраженный сигнал от конуса")
plot(mag2db(abs.(sig)),lab="Отраженный сигнал",lw=2)
xlabel!("Отсчеты")
ylabel!("Отраженный сигнал, дБ")
title!(title)
plot!(twinx(),mod_ang,lab=["азимутальный угол" "угол места"],
color=["red" "green"],ticks=nothing,guidefontcolor="white",ls= :dash,
legend_position = :outertopright,formatter=(_...) -> "")
end
function calc_model_turn(;lin_ang=[0,40],amp_rng=[20,45],num_turn=4)
# модель вращения тела
return (LinRange(lin_ang[1],lin_ang[2],N))' .+ ((LinRange(amp_rng[1],amp_rng[2],N)) .*sin.(LinRange(0,num_turn*2π,N)))'
end
function rcscylinder(r1,r2,H,c,fc,az = -180:180,el = -90:90)
r1 > 0 || throw(ArgumentError("R1 must be positive scalar"))
r2 > 0 || throw(ArgumentError("R2 must be positive scalar"))
H > 0 || throw(ArgumentError("H must be positive scalar"))
c > 0 || throw(ArgumentError("c must be positive scalar"))
fc > 0 || throw(ArgumentError("fc must be positive scalar"))
all(map( x-> x >= -180 && x <=180,az)) || throw(ArgumentError("Az value to be in range [-180,180]"))
all(map( x-> x >= -90 && x <=90,el)) || throw(ArgumentError("El value to be in range [-90,90]"))
elg,azg,fcg = ndgrid(el[:],az[:],[fc])
lambda = c ./fcg
rcs = Mahafza(azg[:,:],elg[:,:],r1,r2,H,lambda)
az = collect(az')
el = collect(el')
return squeeze(rcs),az,el
end
function rcstruncone(r1,r2,H,c,fc,az = -180:180,el = -90:90)
r1 >= 0 || throw(ArgumentError("R1 must be nonnegative scalar"))
r2 > 0 || throw(ArgumentError("R2 must be positive scalar"))
H > 0 || throw(ArgumentError("H must be positive scalar"))
c > 0 || throw(ArgumentError("c must be positive scalar"))
fc > 0 || throw(ArgumentError("fc must be positive scalar"))
r2>r1 || throw(ArgumentError("R2 value must be > $(r1)"))
all(map( x-> x >= -180 && x <=180,az)) || throw(ArgumentError("Az value to be in range [-180,180]"))
all(map( x-> x >= -90 && x <=90,el)) || throw(ArgumentError("El value to be in range [-90,90]"))
elg,azg,fcg = ndgrid(el[:],az[:],[fc])
lambda = c ./ fcg[:,:]
azg = deg2rad.(azg[:,:])
elg = deg2rad.(elg[:,:])
tanalpha = (r2-r1)/H
z1 = r1/tanalpha
z2 = z1+H
# non-normal incidence
alpha = atan(tanalpha);
rcs = @. lambda.*tanalpha./(8*pi*sin(elg+pi/2)) .* tan(elg+pi/2+alpha) .^ 2; # [1] eq 13.47
smallendind = elg .< -alpha
rcs[smallendind] .*= z1
bigendind = elg .> -alpha
rcs[bigendind] .*= z2
# normal incidence
ind0 = abs.(elg .- (-alpha)) .< eps()
rcs[ind0] = @. 8*pi*(z2^(3/2)-z1^(3/2)).^2 ./ (9*lambda[ind0].*sin(elg[ind0]+pi/2)).*tanalpha .*
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
(sin(elg[ind0]+pi/2)+cos(elg[ind0]+pi/2).*tanalpha) .^ 2 # [1] eq 13.44
# # two ends
tol = 0.001
inde1 = elg .< deg2rad(-90+tol)
rcs[inde1] .= [eps(1.0)]
inde2 = elg .> deg2rad(90 - tol)
rcs[inde2] .= [eps(1.0)]
az = collect(az')
el = collect(el')
rcs.+= eps(1.0)
return squeeze(rcs),az,el
end
function ndgrid(arg...)
out_size = arg.|> length
out_dims = [Tuple(j==i ? out_size[j] : 1 for j in 1:length(out_size)) for i in 1:length(arg)]
out_size = [Tuple(j==i ? 1 : out_size[j] for j in eachindex(out_size)) for i in eachindex(arg)]
return (repeat(reshape(arg[i],out_dims[i]...),out_size[i]...) for i in eachindex(arg))
end
function Mahafza(azg,elg,r1,r2,H,lambda)
# Non-normal incidence
rcs = @. (lambda.*r2.^2 .* r1.^2 .* cosd(elg))./(8*pi*sind(elg) .^ 2 .* (r1.^2 .* cosd(azg).^2 + r2 .^2 .* sind(azg).^2) .^ 1.5) # Non-normal incidence Ref 3, eq 14.49 (Similar to Ref 1, eq 24a)
# Mahafza normal
ind0 = abs.(elg[:]) .<= sqrt(eps());
lambdaCol = lambda[:]
azgCol = azg[:]
rcs[ind0] .= @. 2*pi*H^2*r2^2*r1.^2/(lambdaCol[ind0]*(r1.^2*cosd(azgCol[ind0])^2 +
r2^2*sind(azgCol[ind0])^2)^1.5); # Normal incidence to cylinder, Ref 3, eq 14.48 (Similar to Ref 1, eq 23a)
return rcs
end
function pow2db1(y)
all(y .< 0) && error("Invalid input")
return (10 .*log10.(y) .+ 300) .- 300
end
sph2cart(azimuth, elevation, r) = r .* cos.(elevation) .* cos.(azimuth), r .* cos.(elevation) .* sin.(azimuth), r .* sin.(elevation)
function helperTargetRCSPatternPlot(az,el,rcs)
az_grid = repeat(deg2rad.(az), size(el, 2))
el_grid = repeat(deg2rad.(el), size(az, 2))'
rcsdb = pow2db1.(rcs)
minthresh = maximum(rcsdb[:])-100
rcsdb[rcsdb .< minthresh] .= minthresh
r = rcsdb .- minthresh
x,y,z = sph2cart(az_grid, el_grid, r)
my_cg = :jet
resp_color = limit_dynamic_db_range(rcsdb)
surface(x[:,:],y[:,:],z[:,:], color = my_cg, colorbar_title="дБ (м^2)",
surfacecolor=resp_color, grid=false,ticks = false,showaxis=false,axis=false,showguide=false
)
end
function limit_dynamic_db_range(resp)
resp_min = min(resp...)
db_resp_limited = deepcopy(resp)
db_resp_limited[resp .< resp_min] .= resp_min
return db_resp_limited
end
function calc_resp_sig(SO,sig,ang)
out = zeros(ComplexF64,size(sig)...)
141142143
[out[i] = SO(sig[i],[ang[1,i];ang[2,i]])[1] for i in eachindex(sig)]
return out
end