Моделивание эффекта микродоплера¶
В примере вводится понятие эффекта микродоплера и демонстрируется построение радиолокационной системы, способной извлечь микродоплер из отраженного сигнала. Данный признак можно использовать в дальнейшей для решения задачи классификации целей.
Подключение библиотек и функций¶
let
installed_packages = collect(x.name for (_, x) in Pkg.dependencies() if x.is_direct_dep)
list_packages = ["DSP","FFTW","LinearAlgebra"]
for pack in list_packages
pack in installed_packages || Pkg.add(pack)
end
end
using DSP,FFTW,LinearAlgebra
gr()
default(titlefontsize=12,top_margin=5Plots.px,guidefont=10,
fontfamily = "Computer Modern",colorbar_titlefontsize=8,size=(800,400),
margin = 2Plots.mm
)
function helicopmotion(t,tgtmotion,BladeAng,ArmLength,BladeRate,prf = 2e4, radarpos = [0;0;0])
Nblades = size(BladeAng,2)
tgtpos,tgtvel = tgtmotion(1/prf)
RotAng = BladeRate*t;
scatterpos = [0 ArmLength*cos.(RotAng .+ BladeAng);0 ArmLength*sin.(RotAng .+ BladeAng);zeros(1,Nblades+1)].+tgtpos
scattervel = [0 -BladeRate*ArmLength*sin.(RotAng .+ BladeAng);0 BladeRate*ArmLength*cos.(RotAng .+ BladeAng);zeros(1,Nblades+1)] .+tgtvel
_,scatterang = rangeangle(scatterpos,radarpos)
return scatterpos,scattervel,scatterang
end
function spectrogramm_ped(x,t_step;down_lim = -35)
out,f,t = EngeePhased.Functions.spectrogram(sum(x;dims=1)[:];
window = DSP.kaiser(128,10),
noverlap=120,
nfft=256,fs=1/t_step,
centered=true,freqloc = "yaxis",out = :data
)
out_sig = map(x -> x < down_lim ? down_lim : x,DSP.pow2db.(abs.(out)))
fig = Plots.heatmap(
t[:],f,out_sig,color= :jet,
gridalpha=0.5,
colorbar_title = "Мощность, дБВт",
xticks=0:0.5:3,
yticks=-500:100:500,
)
Plots.xlabel!("Время, с")
Plots.ylabel!("Частота Доплера, Гц")
return fig
end
function calc_spectrogram_quad(Data,ts,T;limit = -150)
x = Data./maximum(abs.(Data))
dT = T/length(x)
F = 1/dT
spec_quad = DSP.spectrogram(x,128,120;window=DSP.kaiser(128,3.95),nfft=512,fs=F)
power_quad = map(x -> x < limit ? limit : x,pow2db.(spec_quad.power))
power_quad_quad_new = zeros(size(power_quad))
power_quad_quad_new[1:round(Int64,size(power_quad,1)/2),:] .= power_quad[round(Int64,size(power_quad,1)/2)+1:end,:]
power_quad_quad_new[round(Int64,size(power_quad,1)/2)+1:end,:] .= power_quad[1:round(Int64,size(power_quad,1)/2),:]
fig = Plots.heatmap(spec_quad.time*1e3, fftshift(spec_quad.freq)*1e-3, power_quad_quad_new,color= :jet,
gridalpha=0.5,ylims=(-10,10),xlims=(0,500),colorbar_title = "Мощность, дБВт",
xticks=0:50:500,yticks=-10:2:10)
Plots.xlabel!("Время, мс")
Plots.ylabel!("Частота Доплера, кГц")
Plots.title!("Спектрограмма отраженного сигнала от вертолета")
return fig
end
function helperAnnotateSpectrogram(fig)
Plots.plot!(fig,[20;50],[4;7],linewidth=2,c=:white,lab="",arrow=Plots.Arrow(:close, :tail, 0.5, 1))
Plots.annotate!(50, 7.5, ("Лопасть 1", 10, :white, :center),annotationfontfamily="Roboto")
Plots.plot!(fig,[70;120],[4;5.5],linewidth=2,c=:white,lab="",arrow=Plots.Arrow(:close, :tail, 0.5, 1))
Plots.annotate!(120, 6, ("Лопасть 2", 10, :white, :center),annotationfontfamily="Roboto")
Plots.plot!(fig,[20;50],[-4;-7],linewidth=2,c=:white,lab="",arrow=Plots.Arrow(:close, :tail, 0.5, 1))
Plots.annotate!(50, -7.5, ("Лопасть 3", 10, :white, :center),annotationfontfamily="Roboto")
Plots.plot!(fig,[70;120],[-4;-5.5],linewidth=2,c=:white,lab="",arrow=Plots.Arrow(:close, :tail, 0.5, 1))
Plots.annotate!(120, -6, ("Лопасть 4", 10, :white, :center),annotationfontfamily="Roboto")
Plots.plot!(fig,[0;250],[0;-0.1],linewidth=3,c=:white,lab="",arrow=Plots.Arrow(:close, :both, 0.5, 1))
Plots.annotate!(120, -1, ("Период", 10, :white, :center),annotationfontfamily="Roboto")
Plots.plot!(fig,[124;125],[0.2;4],linewidth=3,c=:white,lab="",arrow=Plots.Arrow(:close, :both, 0.5, 1))
Plots.annotate!(137, 2, ("Скорость вращения", 10, :white, :left),annotationfontfamily="Roboto")
end
function plotting_svd(x)
Plots.plot(10*log10.(x),lab="",ylabel="Сингулярные значения",xlabel="ранг")
Plots.plot!([55], seriestype="vline", label="",ls=:dashdot,color="red",lw=2)
Plots.plot!([101], seriestype="vline", label="",ls=:dashdot,color="red",lw=2)
Plots.plot!([109], seriestype="vline", label="",ls=:dashdot,color="red",lw=2)
Plots.annotate!(25, -10, ("A", 10, :black, :left),annotationfontfamily="Roboto")
Plots.annotate!(75, -10, ("B", 10, :black, :left),annotationfontfamily="Roboto")
Plots.annotate!(102, -10, ("C", 10, :black, :left),annotationfontfamily="Roboto")
Plots.annotate!(175, -10, ("D", 10, :black, :left),annotationfontfamily="Roboto")
end
1. Понятие эффекта микродоплера¶
С эффектом микродоплера неразрывно связано понятие микродвижения:
Микродвижение – незначительное перемещение или отклонения составной части объекта, являющееся дополнительным по отношению основному объемному перемещению целого объекта [1]. Источником микродвижения может быть вибрирующая поверхность, вращающиеся лопасти несущего винта вертолета, идущий человек совершающий периодические движения руками и ногами, машущие крылья птицы или другие причины.
Эффект микродоплера представляет собой явление, связанное с обогащением спектрального состава отраженного сигнала, которое возникает в процессе радиолокационного исследования в результате микродвижений объектов.
Рассмотрим 2 сценария движения объекта: просто поступательное движение (рисунок сверху) и сложное поступательно-вращательное движение (нижний рисунок).
В 1 случае объект движется на нас равномерно, поэтому частота доплера имеет постоянное значение, не зависящее от времени.
Во 2 случае ситуация меняется: вращательное движение (например вращение лопастей вертолета) вносит в спектр отраженного сигнала периодически изменяющиеся компоненты, которые и характеризуют эффект микродоплера.
Спектрограмму отраженного сигнала, содержащую в спектре микродоплероские компоненты, называют микродоплероскими сигнатурами (или сокращенно - МДС). Пример МДС птицы приведен ниже:
2. Моделирование МДС пешехода¶
В следующем модели рассмотрим создание автомобильного радара на основе непрерывного сигнала с ЛЧМ для идентифиакации перехода на дороге.
2.1 Описания сценария модели¶
В модели рассматривается следующий сценарий:
- автомобиль c радаром движется по внутренней полосе со скоростью 30 км/ч из начала координат навстречу стоящему автомобилю и пешеходу;
- Стоящий автомобиль расположен на расстоянии 39.4 м
- Пешеход движется со скорость 1 м/с
Визуализация сценария приведена ниже:
2.2 Параметры модели¶
Для идентификации перехода требуется высокое разрешение по дальности и скорости. В автомобильных радарах для удовлетворения характеристик применяют непрерывный сигнала с линейной частотной модуляцией (ЧМ).
bw = 250e6 # полоса сигнала, Гц
fs = bw # частота дискретизации, Гц
fc = 24e9 # несущая частота, Гц
tm = 1e-6 # время развертки, с
c = 3e8 # скорость света, м/с
egocar_pos = [0;0;0] # м, вектор положения автомобиля с радаром
egocar_vel = [30*1600/3600;0;0] # м/с, вектор скорости автомобиля с радаром
parkedcar_pos = [39;-4;0] # м, вектор положения впереди стоящего автомобиля
parkedcar_vel = [0;0;0] # м/с, вектор скорости впереди стоящего автомобиля
ped_pos = [40;-3;0] # м, вектор положения пешехода
ped_vel = [0;1;0] # м, вектор скорости пешехода
ped_heading = 90 # град, начальное направление движения пешехода
ped_height = 1.8; # рост пешехода
2.3 Формирование системных объектов¶
Для формироние отраженного сигнала объекта - пешеход воспользуеся системным объектов EngeeRadars.BackscatterPedestrian
wav_fmcw = EngeePhased.FMCWWaveform(
SampleRate=fs, # частота дискретизации
SweepTime=tm, # время развертки
SweepBandwidth=bw # полоса сигнала
)
# СО автомобиля с радаром
egocar = EngeePhased.Platform(
InitialPosition=egocar_pos, # начальное положение
Velocity=egocar_vel, # вектор скорости
OrientationAxesOutputPort=true # включение выходного порта ориентации в пространстве
)
# Формирование объекта впереди стоящего автомобиля
parkedcar = EngeePhased.Platform(
InitialPosition=parkedcar_pos, # начальное положение
Velocity=parkedcar_vel, # скорость
OrientationAxesOutputPort=true # включение выходного порта ориентации в пространстве
)
parkedcar_tgt = EngeePhased.RadarTarget(PropagationSpeed=c,OperatingFrequency=fc,MeanRCS=10)
# Формирование объекта - пешеход
ped = EngeeRadars.BackscatterPedestrian(
InitPosition=ped_pos, # начальное положение
InitHeading=ped_heading, # начальное направление движения
PropagationSpeed=c, # скорость распространения сигнала
OperatingFrequency=fc, # несущая частота
Height=ped_height, # рост
WalkingSpeed=1 # скорость движения
)
# каналы распространения: до пешехода и ближайшего автомобиля
chan_ped = EngeePhased.FreeSpace(
PropagationSpeed=c, # скорость распространения
OperatingFrequency=fc, # несущая частота
TwoWayPropagation=true, # учет двунаправленного распространения
SampleRate=fs # частота дискретизации
)
chan_pcar = EngeePhased.FreeSpace(
PropagationSpeed=c, # скорость распространения
OperatingFrequency=fc, # несущая частота
TwoWayPropagation=true, # учет двунаправленного распространения
SampleRate=fs # частота дискретизации
)
# приемник и передатчик
tx = EngeePhased.Transmitter(PeakPower=1,Gain=25)
rx = EngeePhased.ReceiverPreamp(Gain=25,NoiseFigure=10);
2.4 Симуляция модели¶
Для корректного отображения МДС пешехода, необходимо накапливать отраженный сигнал в течении хотя бы одного цикла движения человека. Скорость пешехода 1 м/с поэтому для полного цикла требуется 2 секунды. Смоделируем сценарий движения пешехода в течении 2.5 секунд с шагом в 1 мс:
Tsim = 2.5 # время симуляции
Tsamp = 0.001 # шаг расчета симуляции, с
npulse = round(Int64,Tsim/Tsamp) # количество импульсов
# Выделение памяти под:
xr = complex(zeros(round(Int64,fs*tm),npulse)) # суммарный отраженный сигнал
xr_ped = complex(zeros(round(Int64,fs*tm),npulse)) # отраженный сигнал от пешехода
@inbounds for m = 1:npulse
# расчет текущего положения, скорости, ориентации и угла визирования
# до пешехода и припаркованного автомобиля
pos_ego,vel_ego,ax_ego = egocar(Tsamp)
pos_pcar,vel_pcar,ax_pcar = parkedcar(Tsamp)
pos_ped,vel_ped,ax_ped = move(ped,Tsamp,ped_heading)
_,angrt_ped = rangeangle(pos_ego,pos_ped,ax_ped)
_,angrt_pcar = rangeangle(pos_ego,pos_pcar,ax_pcar)
# расчет отраженного сигнала
global x = tx(wav_fmcw()) # зондирующий сигнал
# прохождение сигналов в канале прямого и обратного распространения
xt_ped = chan_ped(repeat(x,1,size(pos_ped,2)),pos_ego,pos_ped,vel_ego,vel_ped)
xt_pcar = chan_pcar(x,pos_ego,pos_pcar,vel_ego,vel_pcar)
xt_ped = reflect(ped,xt_ped,angrt_ped) # отраженный сигнал от перехода
xt_pcar = parkedcar_tgt(xt_pcar) # отраженный сигнал от автомобиля
xr_ped[:,m] = rx(xt_ped) # принятый сигнал от пешехода
xr[:,m] = rx(xt_ped+xt_pcar) # принятый сигнал от пешехода
end
# перенос сигнала на нулевую частоту
xd_ped = conj(dechirp(xr_ped,x))
xd = conj(dechirp(xr,x));
2.5 Обработка полученного сигнала¶
В смоделированном сигнале xd_ped
содержит только отклик пешехода, а xd
содержит отклик как пешехода, так и припаркованного автомобиля. Если мы создадим спектрограмму, используя только отраженный сигнал от пешехода, получим следующую МДС:
spectrogramm_ped(xd_ped,Tsamp;down_lim = -35)
title!("Спектрограмма отраженного сигнала от пешехода")
Спектрограмма суммарного отраженного сигнала от пешехода и автомобиля выглядит следующим образом:
spectrogramm_ped(xd,Tsamp;down_lim = -35)
title!("Спектрограмма отраженного сигнала от пешехода и автомобиля")
Можно заметить, что МДС автомобиля доминирует на фоне МДС пешехода. Следовательно, без дополнительной обработки пешеход не может быть продетектирован.
2.6 Обработка с помощью svd разложения¶
Для дететирования более слабого сигнала на основе сильного можно воспользоваться разложение по сингулярным значением, позволяющие выделить интересующую область.
out_svd = svd(xd,full=true) # расчет компонента разложения
uxd,sxd,vxd = out_svd.U,out_svd.S,out_svd.V; # считывание матриц S,U,V
С помощью функции plotting_svd
отобразим главную диагональной сингулярной матрицы S
:
plotting_svd(sxd)
На графике зависимости сигнулярных значение от ранга матрицы условно можно выделить 4 области:
- A - включает в себя основной сигнал, вносимый значительный вклад в спектрограмму;
- B - сочетание сигналов пешехода и автомобиля, с доминированием второго
- С - сочетание сигналов пешехода и автомобиля, с доминированием первого;
- D - вклад шумов приемного устройства.
Следовательно, для эффективного выделеления МДС пешехода необходимо извлечь из всей спекрограммы область С, располагающаяся в пределах значения ранга 103-110:
rk = 103:110 # диапазон рангов матрицы сигнулярных значений
# расчет обработанной спектрограммы
sxd_new = [sxd;zeros(size(vxd,1)-length(sxd))]
xdr = uxd[:,rk]*Diagonal(sxd_new)[rk,:]*vxd';
Снова построим МДС пешехода и автомобиля после дополнительной обработки (для корректного отображения нижний предел уменьшим до -40 дБ поскольку основная мощность удалена):
spectrogramm_ped(xdr,Tsamp;down_lim = -40)
title!("МДС пешехода и автомобиля после svd преобразования")
После фильтрации сигнала от автомобиля формируется ясная картика МДС пешехода, при этом уровень МДС автомобиля значительно снизился.
Таким образом, при помощи дополнительной обработки (svd разложение) удалось выделить спектральные составляющие пешехода на фоне мешающего сигнала от рядом стоящего автомобиля.
3. Моделирование МДС вертолета¶
3.1 Описание сценария модели¶
Рассмотрим случай:
- вертолет летит на расстоянии [-25,500,500] местров равномерно в плоскости x-z со скорость 100 м/с вдоль оси x.
- РЛС стационарная и расположена в начале координат.
В таком случае, в начале движения вертолет приближается к РЛС, а после перехода в положительную область оси x, станет удаляться. Визулизация данного сценария приведена ниже:
3.2 Параметры модели¶
Зададим параметры сценария движения РЛС и цели (вертолета):
radarpos = [0;0;0] # вектор положения РЛС, м
radarvel = [0;0;0] # вектор скорости РЛС, м/с
tgtinitpos = [-25;500;500] # начальное положение цели, м
tgtvel = [100;0;0]; # скорость цели, м/с
Далее, сформируем геометрию вертолета, указав основные его параметр (число лопастей, длина лопостей, скорость вращения винта):
f_rot = 4 # частота вращения винта, c
Nblades = 4 # количество лопастей
bladeang = Matrix((0:Nblades-1)')*2*pi/Nblades # вектор углов лопастей
bladelen = 6.5 # длина лопасти, м
bladerate = deg2rad(360*f_rot); # скорость вращения винта рад/с
Следующий этап - формирование РЛС. Зададим фундаментальные параметры системы:
c = 3e8 # скорость распространения сигнала, м/с
fc = 5e9 # несущая частота, Гц
fs = 1e6 # частота дискретизации, Гц
prf = 2e4 # частота следования импульсов, Гц
lambda = c/fc; # длина волны, м
3.3 Создание системных объектов¶
Теперь, используя параметры сценария цели и радиолокационной системы, создадим системные объекты модели с помощью библиотеки EngeePhased
:
# Формирование цели
helicop = EngeePhased.RadarTarget(
MeanRCS=[10 .1 .1 .1 .1], # ЭПР элементов вертолета (фюзеляжа и 4 лопастей)
PropagationSpeed=c, # скорость распространения
OperatingFrequency=fc # несущая частота сигнала
)
tgtmotion = EngeePhased.Platform(InitialPosition=tgtinitpos,Velocity=tgtvel)
# Генератор зондирующего сигнала
wav = EngeePhased.RectangularWaveform(
SampleRate=fs, # частота дискретизации
PulseWidth=2/fs, # длительность импульса
PRF=prf # частота следования импульсов
)
# Формирование антенной решетки (прямоугольная 4х4)
ura = EngeePhased.URA(
Size=[4 4], # размер антенной решетки
ElementSpacing=[lambda/2 lambda/2] # расстояние между элементами
)
tx = EngeePhased.Transmitter() # передатчик
rx = EngeePhased.ReceiverPreamp() # предусилитель
# Cреда распространения
env = EngeePhased.FreeSpace(
PropagationSpeed=c, # скорость распространения, м/с
OperatingFrequency=fc, # несущая частота, Гц
TwoWayPropagation=true, # учет двунаправленного распространения
SampleRate=fs # частота дискретизации
)
# Передающая АР
txant = EngeePhased.Radiator(
Sensor=ura, # геометрия АР
PropagationSpeed=c, # скорость распространения, м/с
OperatingFrequency=fc # несущая частота, Гц
)
# Принимающая АР
rxant = EngeePhased.Collector(
Sensor=ura, # геометрия АР
PropagationSpeed=c, # скорость распространения, м/с
OperatingFrequency=fc # несущая частота, Гц
);
3.4 Запуск симуляции модели¶
Реализуем расчет сценария работы РЛС при движении вертолета с помощью вызова системных объектов в цикле:
NSampPerPulse = round(Int64,fs/prf) # количество отсчетов в 1 импульсе
Niter = Int64(1e4) # количество итераций (число излученных импульсов)
y = complex(zeros(NSampPerPulse,Niter)) # выделение памяти для отраженного сигнала
@inbounds for m in 1:Niter
# обновление положение и скорости вертолета
t = (m-1)/(prf) # шаг симуляции по времени
global scatterpos,scattervel,scatterang = helicopmotion(t,tgtmotion,bladeang,bladelen,bladerate,prf,radarpos)
# расчет отраженного сигнала
x = txant(tx(wav()),scatterang) # зондирующий сигнал
xt = env(x,radarpos,scatterpos,radarvel,scattervel) # сигнал, прошедший среду
xt = helicop(xt) # отраженный сигнал от вертолета
global xr = rx(rxant(xt,scatterang)) # принятый сигнал
y[:,m] = sum(xr;dims=2) # формирование луча
end
3.5 Обработка сигнала¶
При помощи системного объекта RangeDopplerResponse
реализуем дальностно-доплероскую обработку:согласованную фильтрацию по дальности и спектральную обработку на основе БПФ по скорости.
rdresp = EngeePhased.RangeDopplerResponse(
PropagationSpeed=c, # скорость распространения сигнала
SampleRate=fs, # частота дискретизации
DopplerFFTLengthSource="Property", # Cпособ задания БПФ (в параметрах СО)
DopplerFFTLength=128, # длина БПФ
DopplerOutput="Speed", # Доплероский выход (скорость)
OperatingFrequency=fc # несущая частота
)
mfcoeff = getMatchedFilter(wav)
fig1 = plotResponse(rdresp,y[:,1:128],mfcoeff)
Plots.ylims!(0,3000)
Plots.plot!(fig1,title="Дальностно-доплероский портрет",xlabel="Скорость, м/с",
ylabel="Дальность, м",titlefontsize=12,top_margin=5Plots.px,guidefont=10,
colorbar_title="Мощность, дБВт",fontfamily = "Computer Modern",colorbar_titlefontsize=8)
Можно заметить, что на дальностно-доплероском портрете фиксирует наличие 3 компонент: центральная компонента - фюзеляж вертолета, боковые - вращение лопастей.
Оценим радиальную скорость вертолета:
tgtpos = scatterpos[:,1] # положение вертолета на момент окончания симуляции
tgtvel = scattervel[:,1] # скорость вертолета на момент окончания симуляции
tgtvel_truth = radialspeed(tgtpos,tgtvel,radarpos,radarvel)
println("радиальная скорость фюзеляжа вертолета $(round(tgtvel_truth;sigdigits=3)) м/с")
Также посмотрим максимальные и миниальное значения радиальных скоростей винтов:
maxbladetipvel = [bladelen*bladerate;0;0] # скорость лопастей винта
vtp = radialspeed(tgtpos,-maxbladetipvel+tgtvel,radarpos,radarvel)
vtn = radialspeed(tgtpos,maxbladetipvel+tgtvel,radarpos,radarvel)
println("максимальное значение радиальной скорости $(round(vtp;sigdigits=3)) м/с")
println("минимальное значение радиальной скорости $(round(vtn;sigdigits=3)) м/с")
Выполним согласованную фильтрацию и построим спектрограмму отраженного сигнала:
# Cогласованная фильтрация
mf = EngeePhased.MatchedFilter(Coefficients=mfcoeff) # согласованный фильтр
ymf = mf(y) # обработка
ridx = findmax(sum(abs.(ymf);dims=2)[:])[2]; # обнаружение пика по дальности
# Построение МДС
T = Niter/prf # длительность спектрограммы
fig1 = calc_spectrogram_quad(ymf[ridx,:],1/prf,T;limit=-100)
Центральная компонента характеризует отраженный сигнал от фюзеляжа вертолета, периодические компоненты - вращение лопастей. Визуализируем компоненты МДС с помощью функции helperAnnotateSpectrogram
:
helperAnnotateSpectrogram(fig1)
По графику спектрограммы можно оценить период осциляции, который примерно равен 250 мс. В таком случае оценка количество лопастей равна:
Tp = 250e-3 # период МДС
bladerate_est = 1/Tp # оценка количества лопастей
println("Оценка числа лопастей $(round(bladerate_est;sigdigits=2))")
Максимальное отклонение доплеровской частоты примерно равно 4 кГц, тогда радиальная скорость движения лопастей вертолета оценировается как:
f_doppler = 4e3 # амплитуда доплероской частоты, Гц
Vt_detect = dop2speed(f_doppler,lambda)/2
println("Радиальная скорость лопастей $(Vt_detect) м/с")
Для оценки истинной скорости необходимо определить решить задачу пелингации по углу места. Воспользуемся алгоритмом "Music" реализуемый в системном объекте MUSICEstimator2D
:
doa = EngeePhased.MUSICEstimator2D(
SensorArray=ura, #
OperatingFrequency=fc, # несущая частота
PropagationSpeed=c, # скорость распространения сигнала
DOAOutputPort=true, # включение выхода углового направления
ElevationScanAngles=-90:90 # диапазон сканирования по углу места
)
_,ang_est = doa(xr) # расчет углов визирования
Vt_est = Vt_detect/cosd(ang_est[2]) # оценка скорости движения лопастей
println("Оценка скорости лопастей $(round(Vt_est;sigdigits=3)) м/с")
Зная оценки скорости и количества лопастей, определим примерную длину лопасти:
bladelen_est = Vt_est/(bladerate_est*2*pi)
println("Оценка длины лопасти $(round(bladelen_est;sigdigits=3)) м")
Истинное значение длины 6.5 м, следовательно погрешность составила 4%.
Заключение¶
В примере рассмотрено понятие "эффекта микродоплера" и микродоплероских сигнатур. При помощи системных объектов EngeePhased смоделированы МДС отраженных сигналов для 2-х сценария работы РЛС: наземной РЛС при наличии воздушной цели - вертолета и автомобильного радара при наличии пешехода и рядом стоящего автомобиля.