FMCW信号处理-(3)距离处理
1、基础命令视使用情况设定。clc; %清空命令行 clear; %清空工作区 close all; %关闭绘图窗口2、查看文件包含变量及相关信息。dataFile C:\Users\wfh\Desktop\毫米波雷达实测\Radar_Processing\data\000003.mat; %对文件路径赋值 whos(-file, dataFile) %查看文件包含变量其中变量名称是Name。变量维度是四维根据公开数据集信息分别是2个TX发射通道4个RX接收通道255个Chirp每个Chirp有128个采样点。字节大小是4177920。数据类型双精度。数据属性复数数组。3、读取文件并对变量赋值。data load(dataFile); %读取文件 adcData data.adcData; %对文件中的adcData变量进行赋值这里的dataFile是2中的.mat文件是一个结构体通俗说可以视为一个收纳盒里面可能有一个或多个物品现在这里里面有一个物品是变量名字为adcDatadata.adcData意思是把这个物品提取第二行代码并赋值为了adcData。4、检查数据有效性。hasNaN any(isnan(adcData(:))) %判断是否存在无效数据 hasInf any(isinf(adcData(:))) %判断是否存在无穷大数据其中adcData(:)是将多维数据adcData拉直为一维。isnan()是判断某个数据组中是否有无效数据。isinf()是判断某个数据组中是否有无穷大数据。any()表示如果某个数据组中的数据有一个满足条件成立则为是当所有都不满足条件的时候才为否。这里的输出结果都为0所以没有无效数据或者无穷大数据。如果hasNaN输出为1则为存在无效数据如果hasInf输出结果为1则是存在无穷大数据无论是无效还是无穷大数据都会影响后续数据处理的结果。5、提取部分数据并绘制实部虚部图s adcData(:,1,1,1); %提取TX1-RX1的第一个Chirp并赋值为s figure; %开窗 plot(real(s)); %绘制s实部图 hold on; %保持图形开启 plot(imag(s)); %绘制s虚部图 legend(实部 I,虚部 Q); %图例 xlabel(采样点序号); %x轴标题 ylabel(ADC采样值); %y轴标题 title(原始ADC信号单ChirpTX1 RX1); %标题 grid on; %开网格从图示中可以看出实部数据基本一定的均值偏置整体在-20附近。虚部基本在0附近。6、去均值s_mean mean(s); %对s求均值 s_dc s - s_mean; %对s去均值偏置 figure; %开窗 plot(real(s_dc)); %绘制去均值偏置后的实部图 hold on; %保持图形开启 plot(imag(s_dc)); %绘制去均值后的虚部图 legend(去直流后实部 I,去直流后虚部 Q); %图例 xlabel(采样点序号); %x轴标题 ylabel(ADC采样值); %y轴标题 title(去直流后的ADC信号单ChirpTX1 RX1); %标题 grid on; %开网格这里的s是复数mean(s)为对复数s求均值具体操作过程是对虚部和实部分别求均值然后组合为新的均值复数。这是去均值后的实部和虚部图从图中可以观察到两条曲线已在00附近振荡。7、加窗N length(s_dc); %获取去均值偏置后的信号长度 win hamming(N); %汉明窗 s_win s_dc.*win; %去均值的信号与窗逐点相乘这里加窗使用的汉明窗也可使用汉宁窗都是弱化两边的权重减轻频谱泄露的影响。8、求频域并绘图fft_r fft(s_win); %对加窗后的数据进行傅里叶变换求频域 r_spectrum abs(fft_r); %求频域幅值 figure; %开窗 plot(r_spectrum); %绘制频域幅度谱 xlabel(FFT bin); %以频率索引为横轴 ylabel(幅度); %纵轴名称 title(单Chirp距离谱bin); %标题 grid on; %开网格这里的频谱图中的前半部分为零频和正频后半部分为负频。其中负频是数学计算的产物现阶段不使用。9、距离谱fs 4e6; %采样率 slope 21e12; %调频斜率 c 3e8; %光速 bin_axis 0:N-1; %获取横轴索引序列 fb_axis bin_axis * fs / N; %将横轴序列索引转化为拍频 R_axis c * fb_axis /(2 * slope); %将拍频转化为实际距离 figure; %开窗 plot(R_axis(1:64), r_spectrum(1:64)); %绘制横轴为距离的前半部分的幅度谱 xlabel(距离 (m)); %横轴名 ylabel(幅度); %纵轴名 title(距离谱横坐标换算为真实距离); %图标题 grid on; %开网格其中fb_axis bin_axis * fs / N中fs/N为频率分辨率公式由来为采样频率为fs则采样间隔为1/fs一共采样点数为N则总时长则为N/fs那么频率分辨率则为fs/N。其中R_axis c * fb_axis / (2 * slope)为毫米波雷达连续锯齿波距离公式为其中为目标距离雷达的距离为拍频为调频斜率。这里只绘制了零频和正频部分的距离-幅度谱因为负频部分是数学产物这里不做使用。从图示可以看出在10米附近有一个比较明显的目标。10、完整版代码clc; %清空命令行 clear; %清空工作区 close all; %关闭绘图窗口 dataFile C:\Users\wfh\Desktop\毫米波雷达实测\Radar_Processing\data\000003.mat; %对文件路径赋值 whos(-file, dataFile) %查看文件包含变量 data load(dataFile); %读取文件 adcData data.adcData; %对文件中的adcData变量进行赋值 hasNaN any(isnan(adcData(:))) %判断是否存在无效数据 hasInf any(isinf(adcData(:))) %判断是否存在无穷大数据 s adcData(:,1,1,1); %提取TX1-RX1的第一个Chirp并赋值为s figure; %开窗 plot(real(s)); %绘制s实部图 hold on; %保持图形开启 plot(imag(s)); %绘制s虚部图 legend(实部 I,虚部 Q); %图例 xlabel(采样点序号); %x轴标题 ylabel(ADC采样值); %y轴标题 title(原始ADC信号单ChirpTX1 RX1); %标题 grid on; %开网格 s_mean mean(s); %对s求均值 s_dc s - s_mean; %对s去均值偏置 figure; %开窗 plot(real(s_dc)); %绘制去均值偏置后的实部图 hold on; %保持图形开启 plot(imag(s_dc)); %绘制去均值后的虚部图 legend(去直流后实部 I,去直流后虚部 Q); %图例 xlabel(采样点序号); %x轴标题 ylabel(ADC采样值); %y轴标题 title(去直流后的ADC信号单ChirpTX1 RX1); %标题 grid on; %开网格 N length(s_dc); %获取去均值偏置后的信号长度 win hamming(N); %汉明窗 s_win s_dc.*win; %去均值的信号与窗逐点相乘 fft_r fft(s_win); %对加窗后的数据进行傅里叶变换求频域 r_spectrum abs(fft_r); %求频域幅值 figure; %开窗 plot(r_spectrum); %绘制频域幅度谱 xlabel(FFT bin); %以频率索引为横轴 ylabel(幅度); %纵轴名称 title(单Chirp距离谱bin); %标题 grid on; %开网格 fs 4e6; %采样率 slope 21e12; %调频斜率 c 3e8; %光速 bin_axis 0:N-1; %获取横轴索引序列 fb_axis bin_axis * fs / N; %将横轴序列索引转化为拍频 R_axis c * fb_axis /(2 * slope); %将拍频转化为实际距离 figure; %开窗 plot(R_axis(1:64), r_spectrum(1:64)); %绘制横轴为距离的前半部分的幅度谱 xlabel(距离 (m)); %横轴名 ylabel(幅度); %纵轴名 title(距离谱横坐标换算为真实距离); %图标题 grid on; %开网格声明个人水平有限不足之处欢迎批评指正。