当前位置: 首页 > news >正文

雷达编程实战之提高探测速度

有效帧频率作为雷达一个非常核心的指标,它代表了雷达探测识别的速度,速度越快,后级各项智能驾驶功能就能得到更快、更有效的判断。本篇文章首先从硬件的角度,提供了一种合理利用片上资源提高探测识别速度的常用方法,然后又根据不同芯片平台资源情况,提供了两种嵌入式软件能够提高有效帧频率的两种方法,为各位读者在类似的工作中提供一些思路。

目录

利用DMA实现乒乓操作

设计步骤与注意事项

软件流程图与代码

瓶颈优化策略


利用DMA实现乒乓操作

“乒乓操作”是一种典型的用空间换时间操作,它本身并不能弥补高速数据流与低速计算单元之间的矛盾,高速数据流还是要“等待”低速运算完成,但是“乒乓操作”给高速数据流提供了两条独立的数据存储的链路,使得运算单元能够提前起跑,降低了整个链路的时间。

在雷达编程中这种乒乓操作实现在高速ADC采样和FFT运算之间,这里读者可以把DMA想象成一个专用的核心,它的功能仅仅是对数据进行搬运。DMA通常用于将数据传输到一个缓冲器,同时 CPU使用另一个缓冲器进行FFT运算。如下图所示,蓝色路径显示 DMA 将数据传输到缓冲区 1,CPU 从缓冲区 2 获取数据。当路径切换时,DMA 将数据传输到缓冲区 2,CPU 从 缓冲区 1 获取数据。这种技术的好处是整个应用程序的运行时更短,因为 CPU 在任何时候都可以自由地对一部分 数据进行操作。在该示例中,ADC 配置为单次转换模式,DMA 和 CPU 将在每次转换后在缓冲区之间切换。


设计步骤与注意事项

设计步骤如下:

  1. 根据给定的模拟输入和设计要求确定 ADC 的配置,包括基准源、基准值、分辨率和采样率。
  2. 生成 2 个数组缓冲区来存储 ADC 数据并将缓冲区大小和 DMA 传输大小设置为相同,以便 DMA 填充整个缓 冲区。
  3. 根据步骤 1 中的工程要求在 SysConfig 中配置 ADC。
  4. 在 SysConfig 中,在 ADC 部分中配置 DMA。
  5. 编写应用程序代码以动态更改 DMA 的目标地址,从而在两个缓冲区之间交替。

设计要注意的事项如下:

  1. 最大采样速度:ADC 的采样速度基于输入信号频率、模拟前端、滤波器或任何其他影响采样的设计参数。
  2. ADC 基准:选择与预期最大输入保持一致的基准,以利用 ADC 的满量程范围。
  3. 点击“Settings”:时钟源决定了转换的总时间。时钟分频器与 SCOMP 设置一起决定总采样时间。 SysConfig 根据采样时间设置来设置相应的 SCOMP。

软件流程图与代码

软件流程图如下:

Ti实现代码如下,用户可以根据注释获得这种“乒乓操作”更直观的认识。 

/** Copyright (c) 2021, Texas Instruments Incorporated* All rights reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions* are met:** *  Redistributions of source code must retain the above copyright*    notice, this list of conditions and the following disclaimer.** *  Redistributions in binary form must reproduce the above copyright*    notice, this list of conditions and the following disclaimer in the*    documentation and/or other materials provided with the distribution.** *  Neither the name of Texas Instruments Incorporated nor the names of*    its contributors may be used to endorse or promote products derived*    from this software without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/#include "ti_msp_dl_config.h"#define ADC_SAMPLE_SIZE (64)/* When FIFO is enabled 2 samples are compacted in a single word */
#define ADC_FIFO_SAMPLES (ADC_SAMPLE_SIZE / 2)uint16_t gADCSamplesPing[ADC_SAMPLE_SIZE];
uint16_t gADCSamplesPong[ADC_SAMPLE_SIZE];volatile bool gCheckADC;int main(void) {uint16_t maxReading;bool ping = true;uint16_t *ADCSamplesCurrDataPtr;SYSCFG_DL_init();/* Configure DMA source, destination and size */DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID,(uint32_t)DL_ADC12_getFIFOAddress(ADC12_0_INST));DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)&gADCSamplesPing[0]);DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, ADC_FIFO_SAMPLES);DL_DMA_Full_Ch_setEarlyInterruptThreshold(DMA, DMA_CH0_CHAN_ID, DL_DMA_EARLY_INTERRUPT_THRESHOLD_HALF);DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);/* Setup interrupts on device */NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);gCheckADC = false;DL_ADC12_enableConversions(ADC12_0_INST);DL_ADC12_startConversion(ADC12_0_INST);while (1) {while (false == gCheckADC) {__WFE();}// Breakpoint here to check the buffers and watch the ping pong operation.// The data should be alternating between each buffer.__BKPT(0);if (ping) { // Switch to pongADCSamplesCurrDataPtr = gADCSamplesPing;DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)&gADCSamplesPong[0]);DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, ADC_FIFO_SAMPLES);DL_DMA_Full_Ch_setEarlyInterruptThreshold(DMA, DMA_CH0_CHAN_ID, DL_DMA_EARLY_INTERRUPT_THRESHOLD_HALF);DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);gCheckADC = false;ping = false;DL_ADC12_enableDMA(ADC12_0_INST);DL_ADC12_enableConversions(ADC12_0_INST);DL_ADC12_startConversion(ADC12_0_INST);} else { // Switch to PingADCSamplesCurrDataPtr = gADCSamplesPong;DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)&gADCSamplesPing[0]);DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, ADC_FIFO_SAMPLES);DL_DMA_Full_Ch_setEarlyInterruptThreshold(DMA, DMA_CH0_CHAN_ID, DL_DMA_EARLY_INTERRUPT_THRESHOLD_HALF);DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);gCheckADC = false;ping = true;DL_ADC12_enableDMA(ADC12_0_INST);DL_ADC12_enableConversions(ADC12_0_INST);DL_ADC12_startConversion(ADC12_0_INST);}}
}void ADC12_0_INST_IRQHandler(void) {switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)) {case DL_ADC12_IIDX_DMA_DONE:gCheckADC = true;break;default:break;}
}

瓶颈优化策略

整个雷达工作周期的瓶颈,来自一头一尾:头调频连续波到ADC回波采样的射频模拟部分,尾是从点云到航迹目标的数据处理部分。针对这个头,可以针对产品情景进行一些包括调频时长等相关参数的调整来达到帧周期的缩短,这部分我就不赘述了,感兴趣的朋友可以从《雷达编程实战之功耗优化技术(低功耗)》文章中寻求到方法,而这篇文章主要针对这个数据处理的尾巴来讲一下两个优化的策略,而这两个优化策略主要针对两种不同平台资源的情况进行选择。

首先如果我们的芯片平台存在多个DSP核心以及ARM核心,那么我们完全可以合理分配计算资源,达到理论上最快的帧频率,下面是几点分配的原则。

  • 有一个DSP核心很可能承担了信号处理流程的计算工作,然而另一个DSP核心可以与此核心配合,完成多条信号处理链路同时进行,进一步提高点云信息的丰富/置信度,数据处理也可以单独拎出一个DSP核来处理,核间可以通过操作系统提供的Message实现同步,共享RAM进行合理分区,利用标志位标识RAM区当前状态,设计时应尽可能压榨核心等待时间。
  • ARM处理大部分外设控制以及基础软件涉及的业务逻辑与协议栈实现,保证系统正常运行。

如果我们芯片平台仅仅存在一个DSP核心和一个ARM核心,那么我们就需要为整体的产品性能来考虑一些事情了。依然有一个DSP核心承担了信号处理流程的计算工作,而且很有可能它已经没有多余的RAM空间来进行别的计算了,芯片本身很可能在设计之初就没有考虑要进行数据处理(直接出点云给域控制器),而如果我们要硬上(毕竟要做一些数据处理算法来当作研发亮点),那就只可能放在ARM来跑,不过很可惜,这个方案是个陷阱,下面我来介绍一种在这种平台跑算法的方案。

  • 信号处理链路有很多涉及到了硬核的运算,我们可以合理利用硬核的中断,来动态分配任务的优先级。首先我们预存一帧A的点云数据,然后继续进行下一帧B的信号处理流程,在DSP等待硬核处理的间隙,动态提高数据处理任务优先级,并启动调度,数据处理任务拿到DSP资源之后进行A点云数据进行处理,当硬核处理完成之后,进入硬核中断函数,降低数据处理任务优先级,执行上下文切换之后,将DSP核心重新交回信号处理流程。当最终DSP核完成信号处理流程之后,通过Mailbox将当前信号处理以及数据处理流程信息传递给ARM核心。
  • ARM核心做策略判断,如果数据处理没有做完,根据传递过来的信息来综合判断是否由ARM核继续执行剩余算法,如果不执行则Mailbox回传信息暂停信号处理流程,进行数据处理直至完成。

十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

相关文章:

雷达编程实战之提高探测速度

有效帧频率作为雷达一个非常核心的指标,它代表了雷达探测识别的速度,速度越快,后级各项智能驾驶功能就能得到更快、更有效的判断。本篇文章首先从硬件的角度,提供了一种合理利用片上资源提高探测识别速度的常用方法,然…...

pyspark常用功能记录

前言 pyspark中很多常用的功能,过段时间没有使用就容易忘记,需要去网上搜索,这里总结一下,省的以后还去去搜,供自己以后参考。 withColumn def hot_func(info_str):if info_str:eturn "1"return "0&…...

Spring面试题学习: 单例Bean是单例模式吗?

单例Bean是单例模式吗 学习背景答案扩展知识单例模式Spring BeanJava Bean单例Bean 个人评价我的回答 学习背景 想换工作. 学习记录, 算是一个输出. 答案 通常来说, 单例模式是指在一个JVM中, 一个类只能构造出一个对象. 有很多方法来实现单例模式, 比如饿汉模式. 但是我们通…...

EM@常用三角函数图象性质(中学部分)

文章目录 abstract正弦函数正弦型函数转动相关概念旋转角速度转动周期转动频率初相小结 余弦函数的图象与性质性质 正切函数的图象和性质由已知三角函数值求角任意角范围内反三角函数(限定范围内)反正弦反余弦反正切 abstract 讨论 sin ⁡ , cos ⁡ , tan ⁡ \sin,\cos,\tan s…...

一文拿捏Spring事务之、ACID、隔离级别、失效场景

1.🌟Spring事务 1.编程式事务 事务管理代码嵌入嵌入到业务代码中,来控制事务的提交和回滚,例如TransactionManager 2.声明式事务 使用aop对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目…...

input输入表头保存excel文件

input输入表头 input输入表头 (input内除了/,空格 回车 标点符号等 全部作为单元格分隔符)保存/storage/emulated/0/代码文件/ 没有就创建文件名命名方法:编号. 库 时间戳嗨!听说你有个需求,想根据用户输入…...

DataBinding双向绑定简介

一、简介 在Vue中使用的是MVVM架构。通过ViewModel可以实现M层和V层数据的双向绑定。Model层的数据发生变化后,会自动更新View层UI。UI层数据发生变化(用户输入),可以驱动Model层的数据发生变化,借助于Vue框架中的View…...

Is This The Intelligent Model(这是智能模型吗)

Is This The Intelligent Model 这是智能模型吗 Ruoqi Sun Academy of Military Science Defense Innovation Institute, Beijing, 100091, China E-mail: ruoqisun7163.com The exposed models are called artificial intelligent models[1-3]. These models rely on knowled…...

MySQL事务:特性、使用、并发事务问题和隔离级别

什么是事务? 在数据库中,事务是一组SQL操作,它们被视为一个单一的工作单元。事务必须同时成功或失败,以确保数据库的一致性。事务通常遵循ACID属性,即原子性(Atomicity)、一致性(Co…...

FFmpeg日志系统、文件与目录、操作目录

目录 FFmpeg日志系统 FFmpeg文件与目录操作 FFmpeg文件的删除与重命名 FFmpeg操作目录及list的实现 操作目录重要函数 操作目录重要结构体 FFmpeg日志系统 下面看一个简单的 demo。 #include <stdio.h> #include <libavutil/log.h>int main(int argc,char* …...

好奇喵 | Surface Web ---> Deep Web ---> Dark Web

前言 我们可能听说过深网(deep Web)、暗网(dark Web)等名词&#xff0c;有些时候可能会认为它们是一个东西&#xff0c;其实不然&#xff0c;两者的区别还是比较大的。 什么是deep web&#xff1f; 深网是网络的一部分&#xff0c;与之相对应的是表层网络&#xff08;surface …...

三、thymeleaf基本语法

3.1、基本语法 3.1.1变量表达式&#xff1a;${...} 变量表达式用于在页面中输出指定的内容&#xff0c;此内容可以是变量&#xff0c;可以是集合的元素&#xff0c;也可以是对象的属性。主要用于填充标签的属性值&#xff0c;标签内的文本&#xff0c;以及页面中js变量的值等…...

创建一个新的IDEA插件项目

启动IntelliJ IDEA并按照以下步骤创建新的插件项目&#xff1a; 打开IntelliJ IDEA并单击“Create New Project”&#xff08;创建新项目&#xff09;。 在左侧菜单栏中选择“IntelliJ Platform Plugin”&#xff08;IntelliJ平台插件&#xff09;。 在右侧窗格中&#xff0c…...

Doris数据库BE——冷热数据方案

新的冷热数据方案是在整合了存算分离模型的基础上建立的&#xff0c;其核心思路是&#xff1a;DORIS本地存储作为热数据的载体&#xff0c;而外部集群&#xff08;HDFS、S3等&#xff09;作为冷数据的载体。数据在导入的过程中&#xff0c;先作为热数据存在&#xff0c;存储于B…...

Python无废话-办公自动化Excel格式美化

设置字体 在使用openpyxl 处理excel 设置格式&#xff0c;需要导入Font类&#xff0c;设置Font初始化参数&#xff0c;常见参数如下&#xff1a; 关键字参数 数据类型 描述 name 字符串 字体名称&#xff0c;如Calibri或Times New Roman size 整型 大小点数 bold …...

竞赛 机器视觉的试卷批改系统 - opencv python 视觉识别

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…...

Django 数据库迁移(Django-04)

一 数据库迁移 数据库迁移是一种数据库管理技术&#xff0c;它用于在应用程序的开发过程中&#xff0c;根据模型&#xff08;Model&#xff09;的变化自动更新数据库结构&#xff0c;以保持数据库与代码模型的一致性。数据库迁移的主要目的是确保数据库与应用程序的模型定义同…...

Redis相关概念

1. 什么是Redis&#xff1f;它主要用来什么的&#xff1f; Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提…...

Scala第十八章节

Scala第十八章节 scala总目录 文档资料下载 章节目标 掌握Iterable集合相关内容.掌握Seq集合相关内容.掌握Set集合相关内容.掌握Map集合相关内容.掌握统计字符个数案例. 1. Iterable 1.1 概述 Iterable代表一个可以迭代的集合, 它继承了Traversable特质, 同时也是其他集合…...

JAVA学习(4)-全网最详细~

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...