news 2026/10/30 11:19:32

FMCW信号处理-(3)距离处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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文件,是一个结构体,通俗说可以视为一个收纳盒,里面可能有一个或多个物品,现在这里里面有一个物品,是变量,名字为adcData,data.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信号(单Chirp,TX1 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信号(单Chirp,TX1 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信号(单Chirp,TX1 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信号(单Chirp,TX1 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; %开网格

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/30 11:18:55

基于SpringBoot的首饰品商城小程序设计与实现

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

作者头像 李华
网站建设 2026/10/30 10:51:51

SQL Server实时性能跟踪:用Extended Events捕获每条SQL执行细节

简介:本资源是一款面向SQL Server数据库管理员与开发者的轻量级数据库跟踪实践工具包,聚焦性能分析、SQL语句审计与结构逆向工程等核心场景,助力用户快速定位慢查询、排查数据异常及补全缺失的数据库设计文档。压缩包共28个文件,7…

作者头像 李华
网站建设 2026/10/30 10:49:57

领域专家驱动的多模态MoE:可落地的模型瘦身与跨模态协同

1. 为什么“领域专家多模态MoE”不是又一个论文噱头,而是真实可落地的模型瘦身术最近在几个工业级视觉-语言联合推理项目里反复验证了一件事:把“Domain Specialists”(领域专家)塞进“Multimodal Mixture-of-Experts”&#xff0…

作者头像 李华
网站建设 2026/10/30 10:49:42

轻小说多角色配音TTS实战:基于sherpa-onnx与ONNX的本地CPU方案

1. 为什么轻小说配音比想象中更麻烦?先理清需求喜欢看轻小说的朋友,多少都有过这样的念头:要是小说里的对话能像动画一样“演”出来就好了。正经的广播剧、有声书当然好听,但制作门槛高,也不一定能选到自己喜欢的角色声…

作者头像 李华
网站建设 2026/10/30 10:46:50

RV1103边缘图像分类模型部署实战:量化精度与性能对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/30 10:41:00

SAP API集成三步法:查找、配置、测试全链路实践指南

1. 这不是“调个接口”那么简单:SAP API生态的真实水深 很多人第一次接触“SAP API”这个词,是在项目会上听到某位同事说:“这个需求得调SAP的API”,语气轻松得像点外卖。我当年也是这么想的——不就是发个HTTP请求、填几个参数、…

作者头像 李华