目录
- 距离多普勒(Range-Dopple Matrix)处理方法
-
- 快时间维度处理(Range-FFT)
- 慢时间维度处理(Doppler-FFT)
- RDM中距离分辨率和速度分辨率推导方法
- 仿真程序代码
- 参考资料
距离多普勒(Range-Dopple Matrix)处理方法
众所周知,距离多普勒处理方法(Range-Dopple Matrix,简称RDM)是FMCW雷达进行多目标信息提取的有效手段,通过对雷达发送的多个周期的Chirp序列以及回波信息进行快时间维度和慢时间维度的处理,即可得到距离多普勒热力图,进而可以提取多目标的距离和速度信息。
在FMCW的差拍信号中,我们知道,差拍信号的频率为
fmovingBeat=fstaticBeat±fd=2fcRCtc±2fvC(1)f_{movingBeat} = f_{staticBeat} \pm f_d = \frac{2f_cR}{Ct_c} \pm \frac{2fv}{C} \tag 1fmovingBeat=fstaticBeat±fd=Ctc2fcR±C2fv(1) 其中fmovingBeatf_{movingBeat}fmovingBeat和fstaticBeatf_{staticBeat}fstaticBeat分别为目标运动和静止状态下差拍信号的频率,fdf_dfd为多普勒频率,fcf_cfc为扫频带宽,RRR为目标距离,CCC为光速,tct_ctc为扫频周期,fff为Chirp信号中心频率,vvv为目标速度。
快时间维度处理(Range-FFT)
快时间维度即单个周期的Chirp序列扫频周期时间很短,短到几乎可以将多普勒频率带来的影响忽略不计(tct_ctc↓,公式(1)中fstaticBeatf_{staticBeat}fstaticBeat项占了主要的位置),认为此时通过RDM热力图提取到的动目标在距离维度上的动目标差频fmovingBeatf_{movingBeat}fmovingBeat与静目标差频fstaticBeatf_{staticBeat}fstaticBeat近似相等,即fmovingBeat≈fstaticBeat=2fcRCtc(2)f_{movingBeat} \approx f_{staticBeat} = \frac{2f_cR}{Ct_c} \tag 2fmovingBeat≈fstaticBeat=Ctc2fcR(2) 那么通过快时间维度的每一帧数据,提取频谱峰值对应的横坐标频率,即可对目标的距离进行求解;即R=Ctc2fc⋅fstaticBeat(3)R = \frac{Ct_c}{2f_c}\cdot f_{staticBeat} \tag 3R=2fcCtc⋅fstaticBeat(3) 快时间维处理示意图如下
慢时间维度处理(Doppler-FFT)
因为我们知道,在快时间维的处理中,认为速度带来的影响忽略不计,通过对多个Chirp序列进行多帧数据的堆积,此时在第二个维度上(即慢时间维度上,多帧数据对应的同一距离单元上)速度带来的频率影响就不可忽略,此时慢时间维度上求得的频率即为多普勒频率,即fd=2fvC(4)f_d = \frac{2fv}{C} \tag 4fd=C2fv(4) 所以有v=fdC2f(5)v = \frac{f_dC}{2f} \tag 5v=2ffdC(5)
慢时间维处理示意图如下
慢时间维度的处理是经过多个Chirp序列积累后对同一距离单元进行FFT的结果,故称为慢时间维度,
为什么是同一距离单元?
因为Range-FFT中同一个横坐标对应相同的fmovingBeatf_{movingBeat}fmovingBeat,快时间维度下fmovingBeatf_{movingBeat}fmovingBeat约等于fstaticBeatf_{staticBeat}fstaticBeat,由公式(2)和公式(3)可知,对应同一距离单元
快时间维度和慢时间维度处理总览
经过处理后可得到如下的距离多普勒热力图(Range-Dopple Heat Map)
RDM中距离分辨率和速度分辨率推导方法
网上关于RDM方法中距离分辨率和速度分辨率推导的资料实在太少,几乎都是两个长得不太好看公式直接糊你脸上,我的感受就是老人、地铁、看手机.jpg(此处省略表情包),于是决定记录下推导过程,正所谓难者不会,会者不难。
首先回顾下数字信号处理中第K个采样点的频率fkf_kfk与采样频率fsf_sfs间的关系,我们知道,第K个采样点的角频率服从如下关系
ωk=kNs⋅2π=Ω⋅Ts=2πfk⋅1fs\omega_k = \frac{k}{N_s}\cdot2\pi = \Omega\cdot T_s = 2 \pi f_k\cdot \frac{1}{f_s}ωk=Nsk⋅2π=Ω⋅Ts=2πfk⋅fs1
其中NsN_sNs为采样点数,Ω\OmegaΩ为模拟角频率,TsT_sTs为采样频率,我们取出等式中的第二项和第四项,有
kNs⋅2π=2πfk⋅1fs\frac{k}{N_s}\cdot2\pi =2 \pi f_k\cdot \frac{1}{f_s}Nsk⋅2π=2πfk⋅fs1 可得第K个采样点的频率fkf_kfk与采样频率fsf_sfs间的关系为
fk=k⋅fsNs(6)f_k = k\cdot \frac{f_s}{N_s} \tag 6fk=k⋅Nsfs(6)
到此就可以正式展开距离分辨率和速度分辨率的推导方法了,上一部分我们说到快时间维度的Range-FFT和慢时间维度的Doppler-FFT,有两个结论性的公式
fmovingBeat≈fstaticBeat=2fcRCtc(7)f_{movingBeat} \approx f_{staticBeat} = \frac{2f_cR}{Ct_c} \tag 7fmovingBeat≈fstaticBeat=Ctc2fcR(7) fd=2fvC(8)f_d = \frac{2fv}{C} \tag 8fd=C2fv(8) 假设上一部分中距离多普勒热力图中,n1n_1n1为Range-FFT(快时间维度)中目标对应的坐标序列号,n2n_2n2为Doppler-FFT(慢时间维度)中同一目标对应的坐标序列号,则依照公式(6)可得
fmovingBeat=n1Ns⋅fs(9)f_{movingBeat} = \frac{n_1}{N_s} \cdot f_s \tag 9fmovingBeat=Nsn1⋅fs(9) fd=n2NChirp⋅1tc(10)f_d = \frac{n_2}{N_{Chirp}} \cdot \frac{1}{t_c} \tag {10}fd=NChirpn2⋅tc1(10) 其中NChirpN_{Chirp}NChirp为慢时间维度处理中Chirp序列的积累个数;公式(9)类比公式(6),比较好理解,公式(10)也是类比公式(6),只不过此时在慢时间维度上采样总数是积累的Chirp序列的总数,采样频率是每一个Chirp序列扫频周期的倒数,即1tc\frac{1}{t_c}tc1
由此以来,分别联立公式(7)和公式(9),联立公式(8)和公式(10),可得
2fcRCtc=n1Ns⋅fs\frac{2f_cR}{Ct_c} = \frac{n_1}{N_s} \cdot f_sCtc2fcR=Nsn1⋅fs 2fvC=n2NChirp⋅1tc\frac{2fv}{C} = \frac{n_2}{N_{Chirp}} \cdot \frac{1}{t_c}C2fv=NChirpn2⋅tc1 可解得
R=C2fC⋅tc⋅n1Ns⋅fs(11)R = \frac{C}{2f_C}\cdot t_c\cdot \frac{n_1}{N_s}\cdot f_s \tag{11}R=2fCC⋅tc⋅Nsn1⋅fs(11)
v=C2f⋅n2NChirp⋅1tc(12)v = \frac{C}{2f} \cdot \frac{n_2}{N_{Chirp}}\cdot \frac{1}{t_c}\tag{12}v=2fC⋅NChirpn2⋅tc1(12) 因为
tc=Ns⋅Ts=Nsfs(13)t_c = N_s\cdot T_s = \frac{N_s}{f_s} \tag{13}tc=Ns⋅Ts=fsNs(13) tseq=NChirp⋅tc(14)t_{seq} = N_{Chirp}\cdot t_c\tag{14}tseq=NChirp⋅tc(14) 将(13)代入(11),将(14)代入(12),可得
R=C2fc⋅n1R = \frac{C}{2f_c} \cdot n_1R=2fcC⋅n1v=C2ftseq⋅n2v = \frac{C}{2ft_{seq}} \cdot n_2v=2ftseqC⋅n2 此时,就得到了距离分辨率和速度分辨率,分别为
Rres=C2fcR_{res} = \frac{C}{2f_c}Rres=2fcC vres=C2fNChirptc=C2ftseqv_{res} = \frac{C}{2fN_{Chirp}t_c} = \frac{C}{2ft_{seq}}vres=2fNChirptcC=2ftseqC
仿真程序代码
仿真程序代码如下,作者:Elias.J
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% File name: RDM.m
% Author: Elias.J@CSDN
% CSDN: https://blog.csdn.net/qq_41248471
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Initial operation
close all;
clc;
tarR = [15 25]; %target range
tarV = [-3 10]; %target velocity
c = 3*10^8;
f0 = 24.25*10^9;
T = 0.0002; %chirp Sweep Time
B = 400*10^6;
L = 128; %slow-time dimension,num of chirps
N = 128; %fast-time dimension,num of samples
Npad = 1; %padding in order to improve measure precision
Lpad = 1; %padding in order to improve measure precision
%% generate receive signal
S1 = zeros(L,N);
for l = 1:Lfor n = 1:NS1(l,n) = 500*exp(1i*2*pi*((2*B*(tarR(1)+tarV(1)*T*l)/(c*T)+(2*f0*tarV(1))/c)*T/N*n+((2*f0)*(tarR(1)+tarV(1)*T*l))/c));end
end
S1 = awgn(S1,20);S2 = zeros(L,N);
for l = 1:Lfor n = 1:NS2(l,n) = 500*exp(1i*2*pi*((2*B*(tarR(2)+tarV(2)*T*l)/(c*T)+(2*f0*tarV(2))/c)*T/N*n+((2*f0)*(tarR(2)+tarV(2)*T*l))/c));end
end
S2 = awgn(S2,20);
sigReceive = S1+S2;
%% range fft processing
hanning1 = hanning(N,'periodic');
% hanning1 = ones(N,1);
sigRWin = zeros(L,N);
for ii = 1:LsigRWin(ii,:) = hanning1'.*sigReceive(ii,:);
end
sigRfft = zeros(L,N*Npad);
for ii = 1:LsigRfft(ii,:) = fft(sigRWin(ii,:),N*Npad);
end
%% doppler fft processing
hanning2 = hanning(L,'periodic');
% hanning2 = ones(N,1);
sigDWin = zeros(L,N*Npad);
for ii = 1:N*NpadsigDWin(:,ii) = hanning2.*sigRfft(:,ii);
end
sigDfft = zeros(L*Lpad,N*Npad);
for ii = 1:N*NpadsigDfft(:,ii) = fftshift(fft(sigDWin(:,ii),L*Lpad));
end
%% Visualization
Rres = c/(2*B*Npad);
Vres = c/(2*24.25*10^9*T*L*Lpad);
figure,image(Rres*[1:N*Npad],[1:L],10*log10(abs(sigRfft))),title('Range - FFT')
xlabel('Range/m'),ylabel('Frame');
figure,mesh(abs(sigRfft)),title('Range-FFT');
figure,image(Rres*[1:N*Npad],Vres*([1:L*Lpad] - L*Lpad/2),10*log10(abs(sigDfft)));
xlabel('距离/m'),ylabel('速度/mps');
figure,mesh(Rres*[1:N*Npad],Vres*([1:L*Lpad] - L*Lpad/2),10*log10(abs(sigDfft)));
xlim([0 45]);
ylim([-18 18]);
xlabel('距离/m'),ylabel('速度/mps'),zlabel('幅值/dB');%% Window Testhanning1 = ones(N,1);
sigRWin = zeros(L,N);
for ii = 1:LsigRWin(ii,:) = hanning1'.*sigReceive(ii,:);
end
sigRfft = zeros(L,N*Npad);
for ii = 1:LsigRfft(ii,:) = fft(sigRWin(ii,:),N*Npad);
endhanning2 = ones(N,1);
sigDWin = zeros(L,N*Npad);
for ii = 1:N*NpadsigDWin(:,ii) = hanning2.*sigRfft(:,ii);
end
sigDfft = zeros(L*Lpad,N*Npad);
for ii = 1:N*NpadsigDfft(:,ii) = fftshift(fft(sigDWin(:,ii),L*Lpad));
endfigure(1),
subplot(221),image(Rres*[1:N*Npad],Vres*([1:L*Lpad] - L*Lpad/2),10*log10(abs(sigDfft)));
xlabel('距离/m'),ylabel('速度/mps');
title('加矩形窗');
figure(2),
subplot(221),mesh(Rres*[1:N*Npad],Vres*([1:L*Lpad] - L*Lpad/2),10*log10(abs(sigDfft)));
xlim([0 45]);
ylim([-18 18]);
xlabel('距离/m'),ylabel('速度/mps'),zlabel('幅值/dB');
title('加矩形窗');hanning1 = hanning(N,'periodic');
sigRWin = zeros(L,N);
for ii = 1:LsigRWin(ii,:) = hanning1'.*sigReceive(ii,:);
end
sigRfft = zeros(L,N*Npad);
for ii = 1:LsigRfft(ii,:) = fft(sigRWin(ii,:),N*Npad);
endhanning2 = hanning(L,'periodic');
sigDWin = zeros(L,N*Npad);
for ii = 1:N*NpadsigDWin(:,ii) = hanning2.*sigRfft(:,ii);
end
sigDfft = zeros(L*Lpad,N*Npad);
for ii = 1:N*NpadsigDfft(:,ii) = fftshift(fft(sigDWin(:,ii),L*Lpad));
endfigure(1),
subplot(222),image(Rres*[1:N*Npad],Vres*([1:L*Lpad] - L*Lpad/2),10*log10(abs(sigDfft)));
xlabel('距离/m'),ylabel('速度/mps');
title('加汉宁窗');
figure(2),
subplot(222),mesh(Rres*[1:N*Npad],Vres*([1:L*Lpad] - L*Lpad/2),10*log10(abs(sigDfft)));
xlim([0 45]);
ylim([-18 18]);
xlabel('距离/m'),ylabel('速度/mps'),zlabel('幅值/dB');
title('加汉宁窗');hanning1 = hamming(N,'periodic');
sigRWin = zeros(L,N);
for ii = 1:LsigRWin(ii,:) = hanning1'.*sigReceive(ii,:);
end
sigRfft = zeros(L,N*Npad);
for ii = 1:LsigRfft(ii,:) = fft(sigRWin(ii,:),N*Npad);
endhanning2 = hamming(L,'periodic');
sigDWin = zeros(L,N*Npad);
for ii = 1:N*NpadsigDWin(:,ii) = hanning2.*sigRfft(:,ii);
end
sigDfft = zeros(L*Lpad,N*Npad);
for ii = 1:N*NpadsigDfft(:,ii) = fftshift(fft(sigDWin(:,ii),L*Lpad));
endfigure(1),
subplot(223),image(Rres*[1:N*Npad],Vres*([1:L*Lpad] - L*Lpad/2),10*log10(abs(sigDfft)));
xlabel('距离/m'),ylabel('速度/mps');
title('加汉明窗');
figure(2),
subplot(223),mesh(Rres*[1:N*Npad],Vres*([1:L*Lpad] - L*Lpad/2),10*log10(abs(sigDfft)));
xlim([0 45]);
ylim([-18 18]);
xlabel('距离/m'),ylabel('速度/mps'),zlabel('幅值/dB');
title('加汉明窗');hanning1 = blackman(N,'periodic');
sigRWin = zeros(L,N);
for ii = 1:LsigRWin(ii,:) = hanning1'.*sigReceive(ii,:);
end
sigRfft = zeros(L,N*Npad);
for ii = 1:LsigRfft(ii,:) = fft(sigRWin(ii,:),N*Npad);
endhanning2 = blackman(L,'periodic');
sigDWin = zeros(L,N*Npad);
for ii = 1:N*NpadsigDWin(:,ii) = hanning2.*sigRfft(:,ii);
end
sigDfft = zeros(L*Lpad,N*Npad);
for ii = 1:N*NpadsigDfft(:,ii) = fftshift(fft(sigDWin(:,ii),L*Lpad));
endfigure(1),
subplot(224),image(Rres*[1:N*Npad],Vres*([1:L*Lpad] - L*Lpad/2),10*log10(abs(sigDfft)));
xlabel('距离/m'),ylabel('速度/mps');
title('加布莱克曼窗');
figure(2),
subplot(224),mesh(Rres*[1:N*Npad],Vres*([1:L*Lpad] - L*Lpad/2),10*log10(abs(sigDfft)));
xlim([0 45]);
ylim([-18 18]);
xlabel('距离/m'),ylabel('速度/mps'),zlabel('幅值/dB');
title('加布莱克曼窗');
%% 2D CA-CFAR
Pfa = 10^(-6);
Rres_rdm = c/(2*B);
Vres_rdm = c/(2*24.25*10^9*T*L);
Range_Dim = Rres_rdm*[1:N];
Velocity_Dim = Vres_rdm*([1:L] - L/2);
Range_Dopple_Map = abs(sigDfft);handleWindow_r = 9;
handleWindow_c = 9;
handleWindow = zeros(handleWindow_r,handleWindow_c);
proCell_r = 5;
proCell_c = 5;
proCell = zeros(proCell_r,proCell_c);
[r c] = size(Range_Dopple_Map);
CFAR_Map_r = r - (handleWindow_r-1);
CFAR_Map_c = c - (handleWindow_c-1);
CFAR_Map = zeros(CFAR_Map_r,CFAR_Map_c);
referCellNum = handleWindow_r*handleWindow_c - proCell_r*proCell_c;
alpha = referCellNum*(Pfa^(-1/referCellNum) - 1);
for i = 1:CFAR_Map_rfor j = 1:CFAR_Map_chandleWindow = Range_Dopple_Map(i:i+handleWindow_r-1,j:j+handleWindow_c-1);proCell = handleWindow(1+(handleWindow_r - proCell_r)/2:handleWindow_r - (handleWindow_r - proCell_r)/2,1+(handleWindow_c - proCell_c)/2:handleWindow_c - (handleWindow_c - proCell_c)/2);Beta = (sum(sum(handleWindow)) - sum(sum(proCell)))/(referCellNum);CFAR_Map(i,j) = alpha*Beta;end
endCFAR_MapRange_Dim = Range_Dim(1 + handleWindow_r - proCell_r:N - (handleWindow_r - proCell_r));
CFAR_MapVelocity_Dim = Velocity_Dim(1 + handleWindow_c - proCell_c:N - (handleWindow_c - proCell_c));
figure,subplot(121);
mesh(Range_Dim,Velocity_Dim,10*log10(Range_Dopple_Map));
xlabel('距离/m'),ylabel('速度/mps'),zlabel('幅值/dB');
title('2D-FFT')
subplot(122);
mesh(CFAR_MapRange_Dim,CFAR_MapVelocity_Dim,10*log10(CFAR_Map));
xlabel('距离/m'),ylabel('速度/mps'),zlabel('幅值/dB');
title('2D-CFAR检测判决门限')figure,subplot(121);
image(Range_Dim,Velocity_Dim,10*log10(Range_Dopple_Map));
xlabel('距离/m'),ylabel('速度/mps');
title('距离多普勒图');
subplot(122);
image(CFAR_MapRange_Dim,CFAR_MapVelocity_Dim,10*log10(CFAR_Map));
xlabel('距离/m'),ylabel('速度/mps');
title('2D-CFAR检测判决门限')CRange_Dopple_Map = Range_Dopple_Map(1 + handleWindow_r - proCell_r:N - (handleWindow_r - proCell_r),1 + handleWindow_c - proCell_c:N - (handleWindow_c - proCell_c));
[comR comC] = find(CRange_Dopple_Map < CFAR_Map);
for i = 1:length(comR)CRange_Dopple_Map(comR(i),comC(i)) = 0;
endfigure,mesh(CFAR_MapRange_Dim,CFAR_MapVelocity_Dim,CRange_Dopple_Map);
xlabel('距离/m'),ylabel('速度/mps'),zlabel('幅值');
figure,image(CFAR_MapRange_Dim,CFAR_MapVelocity_Dim,CRange_Dopple_Map);
xlabel('距离/m'),ylabel('速度/mps');
参考资料
- Automotive radar 信号处理 第2课 速度估计
- Radar测距及测速原理(2)——快速Chirp序列方法推导及实际应用
- 2D CFAR的原理,其实没那么的神奇