Этот пример вводит фундаментальное понятие микроэффекта Доплера в радаре, возвращаются из цели из-за вращения той цели. Можно использовать micro-Doppler подпись, чтобы помочь идентифицировать цель.
Движущаяся цель вводит частоту, переключаются на нижний регистр, радар возвращаются из-за эффекта Доплера. Однако, потому что большинство целей не является твердыми телами, часто существуют другие колебания и вращения в различных частях цели в дополнение к перемещению платформы. Например, когда вертолет летит, его лопатки вращаются, или когда человек идет, их руки качаются естественно. Эти микро перемещения шкалы производят дополнительные эффекты Доплера, называемые микроэффектами Доплера, которые полезны в идентификации целевых функций. Этот пример показывает два приложения, где микроэффекты Доплера могут быть полезными. В первом приложении, micro-Doppler подписи используются, чтобы определить скорость движения ленточной пилы вертолета. Во втором приложении micro-Doppler подписи используются, чтобы идентифицировать, что пешеход в автомобильном радаре возвращается.
Рассмотрите вертолет с четырьмя лопатками ротора. Примите, что радар расположен в начале координат. Задайте местоположение вертолета как (500, 0, 500), который устанавливает его расстояние далеко от радара в метрах и скорости (60, 0, 0) m/s.
radarpos = [0;0;0]; radarvel = [0;0;0]; tgtinitpos = [500;0;500]; tgtvel = [60;0;0]; tgtmotion = phased.Platform('InitialPosition',tgtinitpos,'Velocity',tgtvel);
В этой симуляции вертолет моделируется пятью рассеивателями: центр вращения и советы четырех лопаток. Центр вращения перемещается с вертолетным корпусом. Каждый конец лопасти является 90 градусами кроме совета его соседних лопаток. Лопатки вращаются на постоянной скорости 4 оборотов в секунду. Длина руки каждой лопатки составляет 6,5 метров.
Nblades = 4;
bladeang = (0:Nblades-1)*2*pi/Nblades;
bladelen = 6.5;
bladerate = deg2rad(4*360); % rps -> rad/sec
Все четыре конца лопастей приняты, чтобы иметь идентичные отражающие способности, в то время как отражающая способность для центра вращения более сильна.
c = 3e8; fc = 5e9; helicop = phased.RadarTarget('MeanRCS',[10 .1 .1 .1 .1],'PropagationSpeed',c,... 'OperatingFrequency',fc);
Примите, что радар действует на уровне 5 ГГц с простым импульсом. Импульсная частота повторения составляет 20 кГц. Для простоты примите, что сигнал распространяет в свободном пространстве.
fs = 1e6; prf = 2e4; lambda = c/fc; wav = phased.RectangularWaveform('SampleRate',fs,'PulseWidth',2e-6,'PRF',prf); ura = phased.URA('Size',4,'ElementSpacing',lambda/2); tx = phased.Transmitter; rx = phased.ReceiverPreamp; env = phased.FreeSpace('PropagationSpeed',c,'OperatingFrequency',fc,... 'TwoWayPropagation',true,'SampleRate',fs); txant = phased.Radiator('Sensor',ura,'PropagationSpeed',c,'OperatingFrequency',fc); rxant = phased.Collector('Sensor',ura,'PropagationSpeed',c,'OperatingFrequency',fc);
В каждом импульсе вертолет проходит своя траектория. Между тем лопатки продолжают вращаться, и советы лопаток вводят дополнительное смещение и угловую скорость.
NSampPerPulse = round(fs/prf); Niter = 1e4; y = complex(zeros(NSampPerPulse,Niter)); rng(2018); for m = 1:Niter % update helicopter motion t = (m-1)/prf; [scatterpos,scattervel,scatterang] = helicopmotion(t,tgtmotion,bladeang,bladelen,bladerate); % simulate echo x = txant(tx(wav()),scatterang); % transmit xt = env(x,radarpos,scatterpos,radarvel,scattervel); % propagates to/from scatterers xt = helicop(xt); % reflect xr = rx(rxant(xt,scatterang)); % receive y(:,m) = sum(xr,2); % beamform end
Этот рисунок показывает ответ Доплера области значений с помощью первых 128 импульсов полученного сигнала. Вы видите, что отображение три возвращается в целевом диапазоне приблизительно 700 метров.
rdresp = phased.RangeDopplerResponse('PropagationSpeed',c,'SampleRate',fs,... 'DopplerFFTLengthSource','Property','DopplerFFTLength',128,'DopplerOutput','Speed',... 'OperatingFrequency',fc); mfcoeff = getMatchedFilter(wav); plotResponse(rdresp,y(:,1:128),mfcoeff); ylim([0 3000])
В то время как возвраты смотрят, как будто они от различных целей, они - на самом деле все от той же цели. Центральный возврат от центра вращения и намного более силен по сравнению с другими двумя, возвращается. Эта интенсивность состоит в том, потому что отражение более сильно от вертолетного корпуса когда по сравнению с концами лопастей. График показывает скорость-40 м/с для центра вращения. Это значение совпадает с истиной целевой радиальной скорости.
tgtpos = scatterpos(:,1); tgtvel = scattervel(:,1); tgtvel_truth = radialspeed(tgtpos,tgtvel,radarpos,radarvel)
tgtvel_truth = -43.6435
Другие два возврата от советов лопаток, когда они приближаются или отбывают из цели на максимальной скорости. Из графика скорости, соответствующие этим двум, приближаются и отбывают, обнаружения составляют приблизительно 75 м/с и-160 м/с, соответственно.
maxbladetipvel = [bladelen*bladerate;0;0]; vtp = radialspeed(tgtpos,-maxbladetipvel+tgtvel,radarpos,radarvel) vtn = radialspeed(tgtpos,maxbladetipvel+tgtvel,radarpos,radarvel)
vtp = 75.1853 vtn = -162.4723
Можно сопоставить все три обнаружения к той же цели через последующую обработку, но та тема выходит за рамки этого примера.
Представление частоты времени микроэффектов Доплера может показать больше информации. Этот код создает представление частоты времени в обнаруженном интервале целевого диапазона.
mf = phased.MatchedFilter('Coefficients',mfcoeff); ymf = mf(y); [~,ridx] = max(sum(abs(ymf),2)); % detection via peak finding along range pspectrum(ymf(ridx,:),prf,'spectrogram')
Рисунок показывает micro-Doppler модуляцию, вызванную концами лопастей вокруг постоянного эффекта Доплера. Изображение предполагает, что каждый конец лопасти вводит подобную синусоиде Доплеровскую модуляцию. Как отмечено в рисунке ниже, в каждый период синусоиды, существует три дополнительных синусоиды, появляющиеся на равном расстоянии. Этот внешний вид предполагает, что вертолет оборудован четырьмя равномерно распределенными лопатками.
hanno = helperAnnotateMicroDopplerSpectrogram(gcf);
В дополнение к количеству лопаток изображение также показывает, что период каждой синусоиды, TR, составляет приблизительно 250 мс. Это значение означает, что лопатка возвращается к своему исходному положению после 250 мс. В этом случае угловая скорость вертолета является приблизительно 4 оборотами в секунду, который совпадает с параметром симуляции.
Tp = 250e-3; bladerate_est = 1/Tp
bladerate_est = 4
Это изображение также показывает скорости совета Vt, который может быть выведен из максимума Доплер. Максимум Доплер на расстоянии приблизительно в 4 кГц от постоянного Доплера, введенного объемным перемещением. Вычислите обнаруженную максимальную скорость совета.
Vt_detect = dop2speed(4e3,c/fc)/2
Vt_detect = 120
Это значение является максимальной скоростью совета вдоль радиального направления. Чтобы получить правильную максимальную скорость совета, относительная ориентация должна быть учтена. Поскольку лопатки вращаются в кругу, обнаружение не затронуто углом азимута. Откорректируйте только угол возвышения для максимального скоростного результата совета.
doa = phased.MUSICEstimator2D('SensorArray',ura,'OperatingFrequency',fc,... 'PropagationSpeed',c,'DOAOutputPort',true,'ElevationScanAngles',-90:90); [~,ang_est] = doa(xr); Vt_est = Vt_detect/cosd(ang_est(2))
Vt_est = 164.0793
На основе откорректированной максимальной скорости совета и вращающего лопатку уровня, вычислите блейд-длину.
bladelen_est = Vt_est/(bladerate_est*2*pi)
bladelen_est = 6.5285
Обратите внимание на то, что результат совпадает с параметром симуляции 6,5 метров. Информация, такая как количество лопаток, блейд-длины и блейд-уровня вращения может помочь идентифицировать модель вертолета.
Рассмотрение автомобиля эго с автомобильной радиолокационной системой FMCW, полоса пропускания которой составляет 250 МГц и действует на уровне 24 ГГц.
bw = 250e6; fs = bw; fc = 24e9; tm = 1e-6; wav = phased.FMCWWaveform('SampleRate',fs,'SweepTime',tm,... 'SweepBandwidth',bw);
Автомобиль эго перемещается вдоль дороги. По пути существует автомобиль, припаркованный на стороне улицы, и человек выходит позади автомобиля. Сцена проиллюстрирована в следующей схеме
На основе этой настройки, если автомобиль эго не может идентифицировать, что пешеход присутствует, может произойти несчастный случай.
egocar_pos = [0;0;0]; egocar_vel = [30*1600/3600;0;0]; egocar = phased.Platform('InitialPosition',egocar_pos,'Velocity',egocar_vel,... 'OrientationAxesOutputPort',true); parkedcar_pos = [39;-4;0]; parkedcar_vel = [0;0;0]; parkedcar = phased.Platform('InitialPosition',parkedcar_pos,'Velocity',parkedcar_vel,... 'OrientationAxesOutputPort',true); parkedcar_tgt = phased.RadarTarget('PropagationSpeed',c,'OperatingFrequency',fc,'MeanRCS',10); ped_pos = [40;-3;0]; ped_vel = [0;1;0]; ped_heading = 90; ped_height = 1.8; ped = phased.BackscatterPedestrian('InitialPosition',ped_pos,'InitialHeading',ped_heading,... 'PropagationSpeed',c,'OperatingFrequency',fc,'Height',1.6,'WalkingSpeed',1); chan_ped = phased.FreeSpace('PropagationSpeed',c,'OperatingFrequency',fc,... 'TwoWayPropagation',true,'SampleRate',fs); chan_pcar = phased.FreeSpace('PropagationSpeed',c,'OperatingFrequency',fc,... 'TwoWayPropagation',true,'SampleRate',fs); tx = phased.Transmitter('PeakPower',1,'Gain',25); rx = phased.ReceiverPreamp('Gain',25,'NoiseFigure',10);
Следующий рисунок показывает карту Доплера области значений, сгенерированную от радара автомобиля эго в зависимости от времени. Поскольку припаркованный автомобиль является намного более сильной целью, чем пешеход, пешеход легко затенен припаркованным автомобилем в карте Доплера области значений. В результате карта всегда показывает единую цель.
Это означает, что обычная обработка не может удовлетворить нашим потребностям под этой ситуацией.
Микроэффект Доплера в частотном диапазоне времени может быть хорошим кандидатом, чтобы идентифицировать, существует ли пешеходная подпись, встроенная в радарный сигнал. Как пример, следующий раздел симулирует радар, возвращаются в течение 2,5 секунд.
Tsamp = 0.001; npulse = 2500; xr = complex(zeros(round(fs*tm),npulse)); xr_ped = complex(zeros(round(fs*tm),npulse)); 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); x = tx(wav()); xt_ped = chan_ped(repmat(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));
В симулированном сигнале, xd_ped
содержит только возврат пешехода в то время как xd
содержит возврат и от пешехода и от припаркованного автомобиля. Если мы генерируем спектрограмму с помощью только возврат пешехода, мы получаем график, показанный ниже.
clf; spectrogram(sum(xd_ped),kaiser(128,10),120,256,1/Tsamp,'centered','yaxis'); clim = get(gca,'CLim'); set(gca,'CLim',clim(2)+[-50 0])
Обратите внимание на то, что колебание рук и участков производит много параболических кривых в частотном диапазоне времени по пути. Поэтому такие функции могут быть использованы, чтобы определить, существует ли пешеход в сцене.
Однако, когда мы генерируем спектрограмму непосредственно от совокупного дохода, мы получаем следующий график.
spectrogram(sum(xd),kaiser(128,10),120,256,1/Tsamp,'centered','yaxis'); clim = get(gca,'CLim'); set(gca,'CLim',clim(2)+[-50 0])
То, что мы наблюдаем, - то, что возврат припаркованного автомобиля продолжает доминировать над возвратом, даже в частотном диапазоне времени. Поэтому частотная характеристика времени показывает только Доплеру относительно припаркованного автомобиля. Отбрасывание Доплеровской частоты происходит из-за автомобиля эго, становящегося ближе к припаркованному автомобилю и относительным отбрасываниям скорости к 0.
Чтобы видеть, существует ли возврат, скрытый позади сильного возврата, мы можем использовать сингулярное разложение. Следующий график показывает распределение сингулярного значения dechirped импульсов.
[uxd,sxd,vxd] = svd(xd); clf plot(10*log10(diag(sxd))); xlabel('Rank'); ylabel('Singular Values'); hold on; plot([56 56],[-40 10],'r--'); plot([100 100],[-40 10],'r--'); plot([110 110],[-40 10],'r--'); text(25,-10,'A'); text(75,-10,'B'); text(105,-10,'C'); text(175,-10,'D');
От кривой ясно, что существует приблизительно четыре области. Область A представляет старший значащий вклад в сигнал, который является припаркованным автомобилем. Область Д представляет шум. Поэтому область Б и C происходят из-за соединения припаркованного автомобиля, возвращаются и пешеходный возврат. Поскольку возврат от пешехода намного более слаб, чем возврат из припаркованного автомобиля. В области Б это может все еще быть замаскировано остатком возврата из припаркованного автомобиля. Поэтому мы выбираем область К, чтобы восстановить сигнал, и затем построить частотную характеристику времени снова.
rk = 100:110; xdr = uxd(:,rk)*sxd(rk,:)*vxd'; clf spectrogram(sum(xdr),kaiser(128,10),120,256,1/Tsamp,'centered','yaxis'); clim = get(gca,'CLim'); set(gca,'CLim',clim(2)+[-50 0])
С возвратом из автомобиля, успешно отфильтрованного, появляется micro-Doppler подпись от пешехода. Поэтому мы можем прийти к заключению, что существует пешеход в сцене, и действуйте соответственно, чтобы избежать несчастного случая.
Этот пример вводит фундаментальное понятие микроэффекта Доплера и показывает его удар на целевой возврат. Это также показывает, как извлечь micro-Doppler подпись из полученного I/Q, сигнализируют и затем выводят соответствующие целевые параметры из micro-Doppler информации.
[1] Чен, V. C. микроэффект Доплера в радаре, доме Artech, 2011
[2] Чен, V. C. Ф. Ли, судно Хо и Х. Вечслер, "Микроэффект Доплера в радаре: явление, модель и исследование симуляции", транзакции IEEE на космических и электронных системах, Vol 42, № 1, январь 2006
Функциональный helicopmotion
моделирует движение нескольких рассеивателей вертолета.
function [scatterpos,scattervel,scatterang] = 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); end