helperTargetRCS.jl 5.38 KiB
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