FMCW雷达目标探测【附MATLAB代码】

文摘   2025-01-29 08:40   黑龙江  

微信公众号:EW Frontier
关注可了解更多的雷达、通信、人工智能相关代码。问题或建议,请公众号留言;
如果你觉得EW Frontier对你有帮助,欢迎加入我的知识星球或面包多,更多代码等你来学
知识星球:https://wx.zsxq.com/dweb2/index/group/15552518881412
面包多:https://mbd.pub/o/author-a2mYl2tsbA==/work

QQ交流群:734060765  目前所有群已满,后续建群会更新群号~

FMCW雷达目标探测原理

FMCW雷达发射线性调频信号,将回波信号与发射信号的副本进行混频得到包含目标距离和速度等信息的中频信号,通过对中频信号进行频率和相位的估计,获取目标的距离和速度等参数。

1  FMCW雷达测量原理 

本文研究的FMCW雷达架构如图1所示。首先由数模转换器(DAC)产生 的调制电压控制压控振荡器(VCO)产生具有一定带宽的线性调频信号,经过功率分配器后产生两路信号,其中一路信号直接作为混频器的本振信号,另一路信号经 过功率放大器后由发射天线将信号辐射到自由空间中。发射信号在自由空间中的 传输过程中碰到目标,其中一部分被目标吸收,另一部分则会被目标反射,反射信 号称为回波信号。然后,回波信号会被接收天线接收,经过低噪声放大器后作为混 频器的射频输入信号,并与本振信号在混频器中完成混频操作,输出信号即为中频信号。紧接着,中频信号经过滤波放大后由模数转换器(ADC)采集转化为数字信号。最后,对该数字信号进行一系列的信号处理,即可得到目标的距离和速度等信息。 

图1 FMCW雷达架构

线性FMCW雷达采用的频率调制方式主要分为锯齿波和三角波调制。采用这 两种频率调制的FMCW雷达测量原理基本相同,区别在于三角波调制能够同时得 到目标距离与速度信息,但在多目标情况下需要进行距离-多普勒匹配才能够正确识别多个目标,多适用于单目标检测,而锯齿波调制虽然需要额外的信号处理流程 才可以得到目标距离与速度信息,但不存在目标匹配问题,可用于复杂的目标探测场景。本文研究的FMCW雷达采用的调制方式都是基于锯齿波调制的向上线性调 频信号[52],其频率调制特性如图2所示,图中每个信号周期(Pulse Repetition  Period,PRP)内的信号称为chirp信号。

图2 锯齿波调制特性 

2  FMCW雷达测距原理 

图3 线性调频信号实部波形 

3  FMCW雷达测速原理

MATLAB代码


clcclose allclear all
[y_lk1, ~, ~, ~, ~, ~, cross_range_res1] = FMCW_radar(100, -50/3.6, -60*pi/180); [y_lk2, Dres, Dmax, Vres, Vmax, theta_res, cross_range_res2] = FMCW_radar(200, 75/3.6, 45*pi/180);y_lk = y_lk1 + y_lk2;%% FFT and FFTSHIFTY = abs(fftshift(fftn(y_lk,2.^nextpow2(size(y_lk)))));YY = log(Y(floor((length(Y)/2)+1):end,:,:)+1);max1 = max(YY,[],'all');max2 = max(YY(YY<max(YY,[],'all')),[],'all');[x1, y1, a1] = ind2sub(size(YY), find(YY==max1));[x2, y2, a2] = ind2sub(size(YY), find(YY==max2));Y = abs(fftshift(fftn(y_lk,(2.^nextpow2(size(y_lk))).*[1,1,8])));YY = Y(floor((length(Y)/2)+1):end,:,:);logYY = log(YY+1);a1 = a1 * 8;a2 = a2 * 8;%% FFT 2D part% heatmap(mat2gray(Y(:,:,1)),'Colormap', jet); grid offfigure('Name','2D ffts','WindowState','maximized')subplot(2,2,1);% for plot of range-Doppler spectrum (2-D FFT magnitude)imagesc([0,Dmax],[-Vmax,Vmax],YY(:,:,floor(size(Y,3)/2)).'); set(gca,'YDir','normal') % flips the y-axis! (to see increasing values, not decreasing)colorbar % display colorbarcolormap jettitle('Amplitude in Velocity VS. Distance')xlabel('D(m)')ylabel('V(m/s)')subplot(2,2,2);% for plot of range-Doppler spectrum (2-D FFT magnitude)imagesc([0,Dmax],[-1,1],squeeze(YY(:,floor(size(Y,2)/2),:)).'); set(gca,'YDir','normal') % flips the y-axis! (to see increasing values, not decreasing)colorbar % display colorbarcolormap jettitle('Amplitude in sin(Azimuth) VS. Distance')xlabel('D(m)')ylabel('sin(Azimuth)')
subplot(2,2,3);% for log plot of range-Doppler spectrum (2-D FFT magnitude)imagesc([0,Dmax],[-Vmax,Vmax],logYY(:,:,floor(size(Y,3)/2)).'); set(gca,'YDir','normal') % flips the y-axis! (to see increasing values, not decreasing)colorbar % display colorbarcolormap jettitle('log(Amplitude) in Velocity VS. Distance')xlabel('D(m)')ylabel('V(m/s)')subplot(2,2,4);% for log plot of range-Doppler spectrum (2-D FFT magnitude)imagesc([0,Dmax],[-1,1],squeeze(logYY(:,floor(size(Y,2)/2),:)).'); set(gca,'YDir','normal') % flips the y-axis! (to see increasing values, not decreasing)colorbar % display colorbarcolormap jettitle('log(Amplitude) in sin(Azimuth) VS. Distance')xlabel('D(m)')ylabel('sin(Azimuth)')% for plotting on the same plot two rows or two columns from a% range-Doppler spectrum%% FFT 1D part and finding the maximumfigure('Name','1D ffts','WindowState','maximized')title('1D fft')
subplot(3,1,1);plt_d = linspace(0,Dmax,length(Y)/2);plot(plt_d, YY(:,y1,a1))D1 = plt_d(squeeze(YY(:,y1,a1))==max(squeeze(YY(:,y1,a1))));
hold on;D2 = plt_d(squeeze(YY(:,y2,a2))==max(squeeze(YY(:,y2,a2))));plot(plt_d, YY(:,y2,a2))xlabel('D(m)')ylabel('Amplitude')legend('First Object', 'Second Object')

subplot(3,1,2);plt_v = linspace(-Vmax,Vmax,size(Y,2));V1 = plt_v(squeeze(YY(x1,:,a1))==max(squeeze(YY(x1,:,a1))));plot(plt_v, YY(x1,:,a1))
hold on;V2 = plt_v(squeeze(YY(x2,:,a2))==max(squeeze(YY(x2,:,a2))));plot(linspace(-Vmax,Vmax,size(Y,2)), YY(x2,:,a2))xlabel('V(m/s)')ylabel('Amplitude')legend('First Object', 'Second Object')
subplot(3,1,3);plt_a = linspace(-1,1,size(Y,3));A1 = plt_a(squeeze(YY(x1,y1,:))==max(squeeze(YY(x1,y1,:))));plot(plt_a, squeeze(YY(x1,y1,:)))
hold on;A2 = plt_a(squeeze(YY(x2,y2,:))==max(squeeze(YY(x2,y2,:))));plot(plt_a, squeeze(YY(x2,y2,:)))xlabel('sin(Azimuth)')ylabel('Amplitude')legend('First Object', 'Second Object')
%% FFT Polar and Objects locationsfigure('Name','polar fft','WindowState','maximized')axis equalimage = squeeze(log(Y(floor((length(Y)/2)+1):end,round(mean([y1,y2])),:)+1));xy_image = zeros(floor(Dmax/Dres), floor(Dmax/Dres/2));for i = 1 : size(xy_image, 1) for j = 1 : size(xy_image, 2) xi=i*Dres*2-Dmax; yi=j*Dres*2; di=sqrt(xi^2+yi^2); if di<Dmax xy_image(i,j) = image(round(di*size(image, 1)/Dmax),ceil((xi/di+1)*size(image, 2)/2)); end endendimagesc([-Dmax,Dmax],[0,Dmax],xy_image.'); set(gca,'YDir','normal') % flips the y-axis! (to see increasing values, not decreasing)colorbar % display colorbarcolormap jethold on; % Prevent image from being blown away.plot(D1*A1, D1*cos(asin(A1)),'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r');
hold on; % Prevent image from being blown away.plot(D2*A2, D2*cos(asin(A2)),'mo', 'MarkerSize', 10, 'MarkerFaceColor', 'm');legend('D = '+string(D1)+'(m), V = '+string((V1)*3.6)+'(km/h), Azimuth = '+string(asind(A1)), ... 'D = '+string(D2)+'(m), V = '+string((V2)*3.6)+'(km/h), Azimuth = '+string(asind(A2)));title('FFT Polar Representation')xlabel('X(m)')ylabel('y(m)')

相关学习资料见面包多链接https://mbd.pub/o/author-a2mYl2tsbA==/work

欢迎加入我的知识星球:https://wx.zsxq.com/dweb2/index/group/15552518881412,永久获取更多相关资料、代码。

EW Frontier
学术交流123456群已满,进群请加学术交流Q7群:554073254,进群请备注单位+研究方向。
 最新文章