ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

FMCW信号处理-(4)速度处理(RD图)

FMCW信号处理-(4)速度处理(RD图)

1、查看数据

clc; %清空命令行 clear; %清空工作区 close all; %关闭绘图窗口 dataFile = 'C:\Users\wfh\Desktop\毫米波雷达实测\Radar_Processing\data\000003.mat'; %对文件路径赋值 whos('-file',dataFile) %查看数据 data = load(dataFile); %读取数据

复数,双精度,4177920字节,2TX,4RX,255Chirp,128采样,adcData。

2、检查数据有效性

adcData = data.adcData; %对变量赋值 hasNaN = any(isnan(adcData(:))) %查看是否有无效数据 hasInf = any(isinf(adcData(:))) %查看是否有无穷大数据

输出结果都是零,说明无无效和无穷大数据。

3、查看TX1-RX1的数据二维大小

adcFrame = adcData(:,:,1,1); %取TX1-RX1的全部数据 N_samples = size(adcFrame,1) %查看第一维行数据量 N_chirps = size(adcFrame,2) %查看第二维列数据量

第一维128行,第二维255列。

4、逐列去均值

adc_dc = zeros(size(adcFrame)); %预分配内存 for ch = 1:N_chirps %遍历1-N_chips s = adcFrame(:,ch); %遍历1-255列,当列行全部保留 s_mean = mean(s); %求当列均值 adc_dc(:,ch) = s-s_mean; %汇总去均值后新数据 end

5、逐列距离维加窗FFT

win_range = hamming(N_samples); %汉明窗 R = zeros(size(adcFrame)); %预分配内存 for ch = 1:N_chirps %遍历1-255 sig = adc_dc(:,ch); %遍历adc_dc每列 sig_win = sig.*win_range; %当列加窗 fft_r = fft(sig_win); %当列傅里叶变换 R(:,ch) = fft_r; %新列赋值给R,求得距离fft后新数据 end

6、逐行多普勒维加窗FFT

win_dop = hamming(N_chirps); %多普勒维汉明窗 RD = zeros(adcFrame); %预分配内存 for rbin = 1:N_samples %遍历1-128 slow_seq = R(rbin,:); %遍历每行 slow_win = slow_seq.*win_dop.'; %多普勒维加窗 fft_dop = fft(slow_win); %多普勒维傅里叶变换 fft_dop = fftshift(fft_dop); %将0移位到中心 RD(rbin,:) = fft_dop; %求得多普勒维频域数据 end

其中win_dop = hamming(N_chirps)是创建汉明窗,但是按MATLAB逻辑创建的是一列,所以在多普勒加窗的时候需要进行转置,即win_dop'。

7、参数初始化

RD_abs = abs(RD); %绘图观察只需要幅度信息 c = 3e8; %光速 f0 = 77e9; %初始频率 B = 0.67e9; %带宽 fc_center = f0+B/2; %中心频率 lambda = c/fc_center; %波长 Tc = 60e-6; %电磁波持续时间 deltaR = c/(2*B); %距离分辨率吧 deltaV = lambda/(2*N_chirps*Tc); %速度分辨率

其中deltaR = c/(2*B)为距离分辨率公式,是光速,是带宽。deltaV = lambda/(2*N_chirps*Tc)为速度分辨率公式,是波长,是chirp个数,是单个chirp持续时间。

8、绘制坐标轴

R_axis = (0:N_samples-1)*deltaR; %距离轴 vel_axis = ((0:N_chirps-1)-(N_chirps-1)/2)*deltaV; %速度轴

9、绘制RD图

figure; %新开画布 imagesc(vel_axis,R_axis,RD_abs); %绘制二维图 colorbar; %颜色条 xlabel("速度(m/s)"); %横轴名 ylabel("距离(m)"); %竖轴名 title("RD map"); %标题名 grid on; %开网格

imagesc(a,b,c)为绘制二维图,其中a为横轴,b为纵轴,c为具体幅值大小,其中纵轴默认为从上到下为从小到大。

从图示可以看出,在约10m位置有一个目标,以约不足1m/s的径向速度远离。

10、完整代码

clc; %清空命令行 clear; %清空工作区 close all; %关闭绘图窗口 dataFile = 'C:\Users\wfh\Desktop\毫米波雷达实测\Radar_Processing\data\000003.mat'; %对文件路径赋值 whos('-file',dataFile) %查看数据 data = load(dataFile); %读取数据 adcData = data.adcData; %对变量赋值 hasNaN = any(isnan(adcData(:))) %查看是否有无效数据 hasInf = any(isinf(adcData(:))) %查看是否有无穷大数据 adcFrame = adcData(:,:,1,1); %取TX1-RX1的全部数据 N_samples = size(adcFrame,1) %查看第一维行数据量 N_chirps = size(adcFrame,2) %查看第二维列数据量 adc_dc = zeros(size(adcFrame)); %预分配内存 for ch = 1:N_chirps %遍历1-N_chips s = adcFrame(:,ch); %遍历1-255列,当列行全部保留 s_mean = mean(s); %求当列均值 adc_dc(:,ch) = s-s_mean; %汇总去均值后新数据 end win_range = hamming(N_samples); %距离维汉明窗 R = zeros(size(adcFrame)); %预分配内存 for ch = 1:N_chirps %遍历1-255 sig = adc_dc(:,ch); %遍历adc_dc每列 sig_win = sig.*win_range; %当列加窗 fft_r = fft(sig_win); %当列傅里叶变换 R(:,ch) = fft_r; %新列赋值给R,求得距离fft后新数据 end win_dop = hamming(N_chirps); %多普勒维汉明窗 RD = zeros(size(adcFrame)); %预分配内存 for rbin = 1:N_samples %遍历1-128 slow_seq = R(rbin,:); %遍历每行 slow_win = slow_seq.*win_dop.'; %多普勒维加窗 fft_dop = fft(slow_win); %多普勒维傅里叶变换 fft_dop = fftshift(fft_dop); %将0移位到中心 RD(rbin,:) = fft_dop; %求得多普勒维频域数据 end RD_abs = abs(RD); %绘图观察只需要幅度信息 c = 3e8; %光速 f0 = 77e9; %初始频率 B = 0.67e9; %带宽 fc_center = f0+B/2; %中心频率 lambda = c/fc_center; %波长 Tc = 60e-6; %电磁波持续时间 deltaR = c/(2*B) %距离分辨率吧 deltaV = lambda/(2*N_chirps*Tc) %速度分辨率 R_axis = (0:N_samples-1)*deltaR; %距离轴 vel_axis = ((0:N_chirps-1)-(N_chirps-1)/2)*deltaV; %速度轴 figure; %新开画布 imagesc(vel_axis,R_axis,RD_abs); %绘制二维图 colorbar; %颜色条 xlabel("速度(m/s)"); %横轴名 ylabel("距离(m)"); %竖轴名 title("RD map"); %标题名 grid on; %开网格

声明:个人水平有限,不足之处,欢迎各位老师批评指正。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进