新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于 C++/Qt 的雷达回波信号检测与测距仿真系统

发布时间:2026/9/27 4:12:19来源:尧图网络
基于 C++/Qt 的雷达回波信号检测与测距仿真系统
一、项目简介本文介绍一个使用C17 Qt 6 CMake开发的简单雷达回波信号检测与测距仿真系统。项目主要模拟雷达接收到多个目标回波后的信号处理过程并通过窗口能量检测目标再对目标回波的起始位置进行精定位最终根据回波延迟计算目标距离并使用 Qt Widgets 和 QPainter 将结果进行可视化。整个项目的处理流程如下目标回波生成 ↓ 多目标信号叠加 ↓ 加入高斯噪声 ↓ 估计噪声能量 ↓ 计算窗口能量 ↓ 自适应阈值检测 ↓ 得到目标候选位置 ↓ 局部能量精定位 ↓ 计算目标距离 ↓ Qt 可视化本项目主要用于学习 C 信号处理、雷达测距基本原理以及 Qt 自绘图形并不针对真实雷达系统进行建模。二、项目使用的技术开发环境C17Qt 6Qt WidgetsCMakeMinGW 64-bit项目结构RadarSignalSimulator/ ├── CMakeLists.txt ├── main.cpp ├── mainwindow.h ├── mainwindow.cpp ├── radar_signal_generator.h ├── radar_signal_generator.cpp ├── signal_widget.h └── signal_widget.cpp其中RadarSignalGenerator负责信号生成、噪声处理、能量检测和距离计算相关的数据处理。SignalWidget负责将原始信号、窗口能量和检测结果绘制到 Qt 界面中。三、雷达测距的基本原理雷达通过发射电磁波并接收目标反射回来的回波可以根据回波的传播时间计算目标距离。假设雷达发射信号后经过时间 (τ\tauτ) 接收到目标回波。由于电磁波需要经历雷达 → 目标 目标 → 雷达两个方向因此目标距离为Rcτ2 R\frac{c\tau}{2}R2cτ​其中(R)目标距离(c)电磁波传播速度(τ\tauτ)回波延迟时间本项目中使用c3×108 m/s c3\times10^8\ m/sc3×108m/s四、模拟雷达回波首先定义基本参数constintsampleCount5000;constdoublesampleRate10000000;constdoublecarrierFrequency1000000;constdoublepulseWidth20e-6;constdoublenoiseStdDev0.15;也就是采样点数5000 采样率10 MHz 载波频率1 MHz 脉冲宽度20 μs 噪声标准差0.15然后模拟三个不同距离的目标std::vectordoublesignal1generator.generatePulseEcho(sampleCount,sampleRate,carrierFrequency,pulseWidth,8000,1.0,0.0);std::vectordoublesignal2generator.generatePulseEcho(sampleCount,sampleRate,carrierFrequency,pulseWidth,15000,0.8,0.0);std::vectordoublesignal3generator.generatePulseEcho(sampleCount,sampleRate,carrierFrequency,pulseWidth,23000,0.6,0.0);三个目标分别位于8 km 15 km 23 km同时设置不同的目标幅度目标11.0 目标20.8 目标30.6用于模拟不同强度的目标回波。五、根据目标距离计算回波延迟在信号生成函数中首先根据目标距离计算回波延迟doubledelayTime2.0*targetRange/C;其中C3.0e8;然后转换成采样点intdelaySamplesstatic_castint(delayTime*sampleRate);例如目标距离为 8 kmτ2×80003×108 \tau\frac{2\times8000}{3\times10^8}τ3×1082×8000​得到约53.33 μs 53.33\ \mu s53.33μs在 10 MHz 采样率下53.33μs×10MHz≈533.3 53.33\mu s\times10MHz\approx533.353.33μs×10MHz≈533.3因此目标回波大约出现在第 533 个采样点附近。六、生成带载波的回波在回波存在的时间范围内生成正弦载波doubleechotargetAmplitude*std::sin(2.0*PI*carrierFrequency*t);最终将回波加入对应采样点signal[i]echo;因此最终得到的是一个带有一定载波振荡的脉冲回波。七、加入高斯噪声真实雷达接收到的信号通常不会是完全干净的。因此项目中使用 C 标准库的随机数工具生成高斯噪声std::normal_distributiondoublenoise(0.0,noiseStdDev);然后在三个目标信号叠加之后统一加入噪声signal[i]signal1[i]signal2[i]signal3[i]noise(generator);最终得到多目标回波 高斯噪声这也是后续目标检测算法的输入。八、估计噪声能量为了避免直接使用一个固定的检测阈值项目首先利用没有明显目标回波的前 500 个采样点估计噪声能量。计算方法En1N∑i1Nxi2 E_n\frac{1}{N}\sum_{i1}^{N}x_i^2En​N1​i1∑N​xi2​对应代码doubleenergy0.0;for(intistart;istartcount;i){energysignal[i]*signal[i];}returnenergy/count;这样得到的是噪声平均能量。例如一次运行得到Estimated noise energy: 0.0234315九、使用窗口能量进行目标检测直接观察带噪声的原始载波信号并不容易判断目标是否存在。因此项目采用窗口能量作为检测依据。对于当前采样点附近的一段信号E(i)∑x2 E(i)\sum x^2E(i)∑x2项目使用 50 个采样点作为检测窗口constintdetectionWindowSize50;然后计算局部窗口能量。窗口能量的一个重要特点是它可以弱化载波正负振荡带来的影响更关注这一段信号整体包含多少能量。因此比直接判断某一个采样点的幅度更加适合当前的目标检测任务。十、自适应检测阈值检测阈值根据噪声能量计算constdoublethresholdFactor6.0;doubleenergyThresholdnoiseEnergy*detectionWindowSize*thresholdFactor;例如Estimated noise energy: 0.0234315 Energy threshold: 7.02945这里没有直接写死energyThreshold7;而是根据当前噪声水平动态计算。这样做的一个好处是当噪声水平发生变化时检测阈值也会随之变化。十一、多目标粗检测计算出窗口能量以后对整个能量序列进行扫描。当能量超过检测阈值时认为进入了一个潜在目标区域。项目中还允许阈值以下存在一定长度的间隙constintmaxGapSamples30;这样可以避免因为噪声导致目标区域被分割成很多小段。最终得到目标候选位置Detected candidates: Candidate: 517 Candidate: 993 Candidate: 1547这里的 Candidate 并不是最终的目标起始位置而只是一个粗定位结果。十二、为什么还需要精定位粗检测得到的 Candidate 并不一定等于真正的回波起始位置。原因之一是窗口能量本身具有一定的时间范围。例如原始信号 回波开始 ↓ ────────────────╱╲╱╲╱╲──────────── 窗口能量 ┌─────────┐ ──────────────┘ └────────── ↑ 能量区域窗口会造成一定程度的时间扩展。因此Candidate只能用于确定“目标大概在这里。”接下来还需要进行更加精细的定位。十三、使用较小窗口进行精定位粗检测使用constintdetectionWindowSize50;精定位则使用更小的窗口constintlocalizationWindowSize10;对应std::vectordoublelocalEnergygenerator.calculateWindowEnergy(signal,localizationWindowSize);同时使用连续采样点超过阈值作为判断条件constintconsecutiveSamples3;也就是说不是某一个采样点超过阈值就立即认为回波开始而是要求连续多个采样点满足条件。十四、Candidate 附近搜索 Echo Start精定位函数不会直接从 Candidate 往后搜索。因为窗口能量的中心位置与实际回波起始位置之间可能存在一定偏移。因此在 Candidate 前面预留一定搜索范围constintbacktrackSamples50;搜索范围大致为Candidate - 50 ↓ ───────[──────────────]──────── ↑ ↑ searchStart searchEnd然后寻找连续多个采样点超过局部能量阈值的位置。核心逻辑if(energy[i]energyThreshold){count;if(countconsecutiveSamples){returni-consecutiveSamples1;}}else{count0;}最终得到Echo start这一步才作为后续测距的依据。十五、根据 Echo Start 计算目标距离得到目标起始采样点以后doubledelayTimestatic_castdouble(echoStart)/sampleRate;得到回波延迟时间。然后使用Rcτ2 R\frac{c\tau}{2}R2cτ​计算距离doublemeasuredRangeC*delayTime/2.0;最后转换为 kmmeasuredRange/1000.0十六、一次运行结果一次运行得到Estimated noise energy: 0.0234315 Energy threshold: 7.02945 Local energy threshold: 1.40589 Detected candidates: Candidate: 517 Candidate: 993 Candidate: 1547 Echo start: 531 Measured range: 7.965 km Echo start: 999 Measured range: 14.985 km Echo start: 1538 Measured range: 23.07 km目标真实距离为8 km 15 km 23 km测量结果与真实距离存在一定误差这是由于当前模拟器采用离散采样并且目标起始位置最终需要映射到整数采样点。十七、距离分辨率当前采样率为Fs10MHz F_s10MHzFs​10MHz因此采样间隔Δt1Fs0.1μs \Delta t\frac{1}{F_s}0.1\mu sΔtFs​1​0.1μs对应的距离变化为ΔRc2Fs \Delta R \frac{c}{2F_s}ΔR2Fs​c​代入ΔR3×1082×10715m \Delta R \frac{3\times10^8} {2\times10^7} 15mΔR2×1073×108​15m因此当前系统一个采样点对应约15 m这也解释了为什么最终测距结果不会总是精确等于8.000 km 15.000 km 23.000 km十八、Qt 信号可视化信号处理完成后使用 Qt Widgets 中的QPainter进行绘制。界面主要显示两部分其中蓝色曲线原始雷达回波红色曲线窗口能量绿色竖线检测到的目标位置X 轴目标距离检测阈值窗口能量判断目标的依据十九、为什么使用 QPainterQt 的QPainter可以直接在 QWidget 上进行二维绘图。例如绘制信号曲线QPainterPath path;path.moveTo(x,y);path.lineTo(x,y);painter.drawPath(path);通过将采样点转换成屏幕坐标doublexRatiostatic_castdouble(i)/static_castdouble(m_signal.size()-1);doublexleftxRatio*plotWidth;就可以把采样点映射到Qt 窗口坐标这也是本项目中比较重要的一部分 Qt 实践。二十、目标位置可视化检测到目标以后将echoStarts传递给SignalWidgetm_signalWidget-setEchoStarts(echoStarts,sampleRate);然后根据采样点计算屏幕上的 X 坐标doublexRatiostatic_castdouble(echoStart)/static_castdouble(m_signal.size()-1);doublexleftxRatio*plotWidth;最后绘制竖线painter.drawLine(x,signalTop,x,signalTopsignalHeight);这样程序检测到的目标就能够直接显示在波形上。二十一、项目中的几个关键设计这个项目虽然规模不大但在实现过程中有几个值得注意的问题。1. 粗检测和精定位没有使用同一个窗口粗检测50 samples精定位10 samples原因是两者目的不同。粗检测更加关注是否存在目标精定位更加关注目标究竟从哪里开始因此没有必要让两者使用完全相同的参数。2. 不直接使用原始幅度判断回波开始如果直接判断std::abs(signal[i])threshold可能受到载波相位影响。例如正弦波/\ / \ ────/────\────/────\──── / \ /即使目标回波已经存在某些采样点仍然可能非常接近 0。因此本项目采用局部能量进行精定位减少了载波相位对判断的影响。3. 不使用固定阈值项目没有简单使用energy5而是根据噪声估计energyThresholdnoiseEnergy*windowSize*thresholdFactor;这样可以让检测阈值与噪声水平建立联系。二十二、项目最终效果目前程序已经能够完成① 生成多个目标回波 ② 模拟高斯噪声 ③ 估计噪声能量 ④ 计算窗口能量 ⑤ 自适应阈值检测 ⑥ 检测多个目标 ⑦ 对目标进行精定位 ⑧ 根据回波延迟计算距离 ⑨ Qt 绘制原始信号 ⑩ Qt 绘制窗口能量 ⑪ 在波形上显示目标位置 ⑫ 显示距离刻度从程序运行结果来看可以正确检测出 8 km、15 km 和 23 km 附近的三个模拟目标。二十三、项目总结通过这个项目我把一个简单的雷达测距问题拆分成了几个相对独立的模块信号模型 ↓ 噪声模型 ↓ 能量检测 ↓ 目标定位 ↓ 距离估计 ↓ 图形显示在 C 部分主要实践了std::vectorstd::randomstd::normal_distributionSTL 算法C 类与成员函数C17在 Qt 部分主要实践了Qt WidgetsQMainWindowQWidget信号与槽QPainterQPainterPath自定义paintEvent()在算法方面则实践了离散采样回波延迟窗口能量噪声能量估计自适应阈值粗检测精定位雷达测距这个项目属于一个简化的雷达信号处理仿真并不能代表实际雷达系统中的完整处理流程。后续如果继续扩展可以进一步加入 FFT、距离谱、脉冲压缩、距离-多普勒处理以及二维矩阵数据的可视化等内容。对于目前这个版本来说已经完成了从**“模拟雷达信号”到“检测目标并测量距离”再到“Qt 可视化”**的完整流程。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

5步图解步骤搞定SEO初学教程,告别备案迷茫 2026/9/27 5:06:43

5步图解步骤搞定SEO初学教程,告别备案迷茫

5步图解步骤搞定SEO初学教程,告别备案迷茫 很多安徽的创业团队负责人在搞网站优化时,第一反应往往是:这备案流程太让人一头雾水了。域名解析、服务器IP、主体信息,填错一步就得重来,光看着那些复杂的表单就头大。别急,咱们不整那些虚头巴脑的理论…

阅读更多 →
Emerson Ovation Compact I/O继电器底座1C31219G01技术解析 2026/9/27 5:06:29

Emerson Ovation Compact I/O继电器底座1C31219G01技术解析

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

阅读更多 →
Windows权限提升完全手册:从信息收集到SYSTEM权限的完整路径 2026/9/27 5:06:29

Windows权限提升完全手册:从信息收集到SYSTEM权限的完整路径

📌写在前面 “Windows怎么提权?”“有了普通用户怎么变SYSTEM?”“有哪些常见的提权漏洞?” 在渗透测试中,拿到初始shell往往只是低权限用户。要真正控制系统、横向移动、窃取凭据,就需要提升权限到SYSTEM或…

阅读更多 →
嵌入式偶发Bug排查:串口假故障、蓝牙断开与烧录批次差异的实战指南 2026/9/27 5:06:29

嵌入式偶发Bug排查:串口假故障、蓝牙断开与烧录批次差异的实战指南

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

阅读更多 →
CLLC谐振变换器设计:基波分析、参数优化与MATLAB仿真 2026/9/27 5:06:22

CLLC谐振变换器设计:基波分析、参数优化与MATLAB仿真

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

阅读更多 →
机器学习之Selenium(Machina Learning about Selenium) 2026/9/27 5:06:22

机器学习之Selenium(Machina Learning about Selenium)

四、爬虫自动化——Selenium1、Selenium基础知识与元素定位1.1 Selenium介绍在之前的文章中我们能够深刻学习到使用 request 库进行网页爬取。requests 只能获取服务器返回的 HTML 源码,但是现在网页越来越复杂,很多东西都是通过 JavaScript 进行动态加载…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉