雷达编程实战之提高探测速度
有效帧频率作为雷达一个非常核心的指标,它代表了雷达探测识别的速度,速度越快,后级各项智能驾驶功能就能得到更快、更有效的判断。本篇文章首先从硬件的角度,提供了一种合理利用片上资源提高探测识别速度的常用方法,然后又根据不同芯片平台资源情况,提供了两种嵌入式软件能够提高有效帧频率的两种方法,为各位读者在类似的工作中提供一些思路。
目录
利用DMA实现乒乓操作
设计步骤与注意事项
软件流程图与代码
瓶颈优化策略
利用DMA实现乒乓操作
“乒乓操作”是一种典型的用空间换时间操作,它本身并不能弥补高速数据流与低速计算单元之间的矛盾,高速数据流还是要“等待”低速运算完成,但是“乒乓操作”给高速数据流提供了两条独立的数据存储的链路,使得运算单元能够提前起跑,降低了整个链路的时间。
在雷达编程中这种乒乓操作实现在高速ADC采样和FFT运算之间,这里读者可以把DMA想象成一个专用的核心,它的功能仅仅是对数据进行搬运。DMA通常用于将数据传输到一个缓冲器,同时 CPU使用另一个缓冲器进行FFT运算。如下图所示,蓝色路径显示 DMA 将数据传输到缓冲区 1,CPU 从缓冲区 2 获取数据。当路径切换时,DMA 将数据传输到缓冲区 2,CPU 从 缓冲区 1 获取数据。这种技术的好处是整个应用程序的运行时更短,因为 CPU 在任何时候都可以自由地对一部分 数据进行操作。在该示例中,ADC 配置为单次转换模式,DMA 和 CPU 将在每次转换后在缓冲区之间切换。
设计步骤与注意事项
设计步骤如下:
- 根据给定的模拟输入和设计要求确定 ADC 的配置,包括基准源、基准值、分辨率和采样率。
- 生成 2 个数组缓冲区来存储 ADC 数据并将缓冲区大小和 DMA 传输大小设置为相同,以便 DMA 填充整个缓 冲区。
- 根据步骤 1 中的工程要求在 SysConfig 中配置 ADC。
- 在 SysConfig 中,在 ADC 部分中配置 DMA。
- 编写应用程序代码以动态更改 DMA 的目标地址,从而在两个缓冲区之间交替。
设计要注意的事项如下:
- 最大采样速度:ADC 的采样速度基于输入信号频率、模拟前端、滤波器或任何其他影响采样的设计参数。
- ADC 基准:选择与预期最大输入保持一致的基准,以利用 ADC 的满量程范围。
- 点击“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)等名词,有些时候可能会认为它们是一个东西,其实不然,两者的区别还是比较大的。 什么是deep web? 深网是网络的一部分,与之相对应的是表层网络(surface …...
三、thymeleaf基本语法
3.1、基本语法 3.1.1变量表达式:${...} 变量表达式用于在页面中输出指定的内容,此内容可以是变量,可以是集合的元素,也可以是对象的属性。主要用于填充标签的属性值,标签内的文本,以及页面中js变量的值等…...
创建一个新的IDEA插件项目
启动IntelliJ IDEA并按照以下步骤创建新的插件项目: 打开IntelliJ IDEA并单击“Create New Project”(创建新项目)。 在左侧菜单栏中选择“IntelliJ Platform Plugin”(IntelliJ平台插件)。 在右侧窗格中,…...
Doris数据库BE——冷热数据方案
新的冷热数据方案是在整合了存算分离模型的基础上建立的,其核心思路是:DORIS本地存储作为热数据的载体,而外部集群(HDFS、S3等)作为冷数据的载体。数据在导入的过程中,先作为热数据存在,存储于B…...
Python无废话-办公自动化Excel格式美化
设置字体 在使用openpyxl 处理excel 设置格式,需要导入Font类,设置Font初始化参数,常见参数如下: 关键字参数 数据类型 描述 name 字符串 字体名称,如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)
一 数据库迁移 数据库迁移是一种数据库管理技术,它用于在应用程序的开发过程中,根据模型(Model)的变化自动更新数据库结构,以保持数据库与代码模型的一致性。数据库迁移的主要目的是确保数据库与应用程序的模型定义同…...
Redis相关概念
1. 什么是Redis?它主要用来什么的? Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提…...
Scala第十八章节
Scala第十八章节 scala总目录 文档资料下载 章节目标 掌握Iterable集合相关内容.掌握Seq集合相关内容.掌握Set集合相关内容.掌握Map集合相关内容.掌握统计字符个数案例. 1. Iterable 1.1 概述 Iterable代表一个可以迭代的集合, 它继承了Traversable特质, 同时也是其他集合…...
JAVA学习(4)-全网最详细~
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...
【单片机】12-串口通信和RS485
1.通信有关的常见概念 区分:串口,COM口,UART,USART_usart和串口区别-CSDN博客 串口、COM口、UART口, TTL、RS-232、RS-485区别详解-CSDN博客 1.什么是通信 (1)人和人之间的通信:说话ÿ…...
一步步教你使用GDB调试程序:从入门到精通的全面指南
文章目录 Step1:安装GDB1.1、包管理器安装1.2、下载源码编译安装 Step2:编译程序时添加调试信息Step3:GDB启动、退出、查看代码Step4:GDB断点操作Step5:GDB调试操作5.1 单步调试5.2 多进程调试 调试是软件开发中非常重…...
OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列
OpenCV读取RGB图像 在OpenCV中,读取的图片默认是HWC格式,即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C,因此最小颗粒度是C。 例如,一张形状为2562563的RGB图像,在OpenCV中读取后的格式…...
基于安卓android微信小程序的校园维修平台
项目介绍 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整…...
mysql面试题16:说说分库与分表的设计?常用的分库分表中间件有哪些?分库分表可能遇到的问题有哪些?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说说分库与分表的设计? 在MySQL中,分库与分表是常用的数据库水平扩展技术,可以提高数据库的吞吐量和扩展性。下面将具体讲解MySQL中分库与分表…...
AlexNet网络复现
1. 引言 在现代计算机视觉领域,深度学习已经成为了一个核心技术,其影响力远超过了传统的图像处理方法。但深度学习,特别是卷积神经网络(CNN)在计算机视觉的主导地位并不是从一开始就有的。在2012年之前,计…...
pytorch模型量化和移植安卓详细教程
十一下雨,在家撸模型,希望对pytorch模型进行轻量化,间断摸索了几天,效果不错,做个总结分享出来。 量化是一种常见的技术,人们使用它来使模型在推断时运行更快,具有更低的内存占用和更低的功耗,而无需更改模型架构。在这篇博客文章中,我们将简要介绍量化是什么以及如何…...
C++(List)
本节目标: 1.list介绍及使用 2.list深度剖析及模拟实现 3.list和vector对比 1.list介绍及使用 1.1list介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list的底层是双向链表结构,…...
分布式架构篇
1、微服务 微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API。这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。这些…...
ros编译报错-- Could NOT find ros_ethercat_eml (missing: ros_ethercat_eml_DIR)
– Could NOT find ros_ethercat_eml (missing: ros_ethercat_eml_DIR) – Could not find the required component ‘ros_ethercat_eml’. The following CMake error indicates that you either need to install the package with the same name or change your environment …...
wordpress支持的语言种类/一般的电脑培训班要多少钱
题意: 在一个n∗n的国际象棋的棋盘上放两个象,要求不能有位置同时被两个象攻击到,然后被一个象攻击到的位置上获得得分。(象放的位置也获得该位置得分),求得分的最大值。 题目描述 Gargari is jealous that…...
手机端网站开发页/建网站哪个平台好
请用程序实现 输入一段仅由英文字母、空格组成的文本,并通过split()方法统计这段文本中的单词数量,并将统计结果输出。 def word_len(text):return len([i for i in text.split( ) if i]) def main():text str(input("请输入字符串:&q…...
wordpress主题模板仿/免费技能培训在哪里报名
导航:网站首页 >before和after区别 after的用法before和after区别 after的用法相关问题:匿名网友:一、意思不同1、before作连词意思是在 ... 以前。作介词意思是在 ... 以前;在..前面。作副词意思是以前;以往;之前。2、after作…...
web页wordpress/网站推广软文
脑图...
网站默认首页/郴州网站推广
https://blog.csdn.net/qq_41996454/article/details/107687041...
金湖建设局网站/重庆seo务
当前的网站是一个渐变波浪生成器,它提供了很多的参数,让您可以创建漂亮的渐变波浪。在此处按下并向右侧拖动,可以增加波浪的数量。 点击此处的滑杆,可以减少波浪的数量。 在此处按下并向右侧拖动,可以增加水平方向上的振幅。 点击此处的滑杆,可以增加垂直方向上的振幅…...