GNU Radio创建时间戳 C++ OOT块

文章目录

  • 前言
  • 一、创建自定义的 C++ OOT 块
    • 1、创建 timestamp_sender C++ OOT 模块
      • ①、创建 timestamp_sender OOT 块
      • ②、修改 C++ 代码
    • 2、创建 timestamp_receiver C++ OOT 模块
      • ①、创建 timestamp_receiver OOT 块
      • ②、修改 C++ 代码
    • 3、创建 delayMicroSec C++ OOT 模块
      • ①、创建 delayMicroSec OOT 块
      • ②、修改 C++ 代码
  • 二、编译及安装 OOT 块
  • 三、测试
    • 1、grc 图
    • 2、运行结果
  • 四、资源自取


前言

目前有这么样一个需求,我想在 GNU Radio 中计算从一个模块到其他模块执行所花费的时间,我的做法是将获取的时间戳信息作为标签添加到数据流中,然后传入到待计算时间的那个模块后再获取当前时间并与流标签中的时间戳信息进行相减,即可得到所耗费的时间,也就达到了计算时间间隔的目的。

因此本文将创建红框内的三个 C++ OOT块,实现时间测量。

在这里插入图片描述


一、创建自定义的 C++ OOT 块

参考官方教程 Creating C++ OOT with gr-modtool 创建自定义的 OOT块

1、创建 timestamp_sender C++ OOT 模块

可以参考我之前的博客内容,做法都是差不多的:GNU Radio创建Zadoff-Chu序列C++ OOT块

详细代码及配置文件文末自取

①、创建 timestamp_sender OOT 块

gr_modtool newmod myModule 
cd gr-myModule 
gr_modtool add timestamp_sender

当让你输入模块类型时,选择 sync

Enter block type: sync

当让你输入参数时,按照如下方式输入:

Enter valid argument list, including default arguments: 
size_t itemsize

②、修改 C++ 代码

修改 gr-myModule/lib/ 目录下的 timestamp_sender_impl.cctimestamp_sender_impl.h 文件和 gr-myModule/grc/ 目录下的配置文件myModule_timestamp_sender_impl.block.yml

timestamp_sender_impl.cc 核心部分程序:

auto now = std::chrono::high_resolution_clock::now();
// 返回自纪元(通常是1970年1月1日)以来的时间间隔, 获取以微秒为单位的时间间隔值
auto now_us = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()).count();	// 以微秒(microseconds)为单位输出// 创建标签并添加时间戳
pmt::pmt_t key = pmt::string_to_symbol("timestamp");
pmt::pmt_t value = pmt::from_long(now_us);
add_item_tag(0, nitems_written(0), key, value);

timestamp_sender_impl.h 核心部分程序:

private:// Nothing to declare in this block.size_t d_itemsize;public:timestamp_sender_impl(size_t itemsize);~timestamp_sender_impl();void send_timestamp(pmt::pmt_t msg);

myModule_timestamp_sender_impl.block.yml 部分核心配置:

parameters:
-   id: typelabel: Typedtype: enumoptions: [complex, float, int, short, byte]option_attributes:size: [gr.sizeof_gr_complex, gr.sizeof_float, gr.sizeof_int, gr.sizeof_short,gr.sizeof_char]hide: part

2、创建 timestamp_receiver C++ OOT 模块

①、创建 timestamp_receiver OOT 块

gr_modtool newmod myModule 
cd gr-myModule 
gr_modtool add timestamp_receiver 

当让你输入模块类型时,选择 sync

Enter block type: sync

当让你输入参数时,按照如下方式输入:

Enter valid argument list, including default arguments: 
size_t itemsize

②、修改 C++ 代码

修改 gr-myModule/lib/ 目录下的 timestamp_receiver_impl.cctimestamp_receiver_impl.h 文件和 gr-myModule/grc/ 目录下的配置文件myModule_timestamp_receiver_impl.block.yml

timestamp_receiver_impl.cc 核心部分程序:

std::vector<tag_t> tags;
get_tags_in_window(tags, 0, 0, noutput_items);	// 获取输入样本范围内的所有标签,并存储在 tags 向量中for (const auto& tag : tags)					// 遍历 tags 向量中的每个标签
{calculate_delay(tag.key, tag.value);
}

timestamp_receiver_impl.h 核心部分程序:

private:size_t d_itemsize;void calculate_delay(const pmt::pmt_t& key, const pmt::pmt_t& value);

myModule_timestamp_receiver_impl.block.yml 部分核心配置:

parameters:
-   id: typelabel: Typedtype: enumoptions: [complex, float, int, short, byte]option_attributes:size: [gr.sizeof_gr_complex, gr.sizeof_float, gr.sizeof_int, gr.sizeof_short,gr.sizeof_char]hide: part

3、创建 delayMicroSec C++ OOT 模块

①、创建 delayMicroSec OOT 块

gr_modtool newmod myModule 
cd gr-myModule 
gr_modtool add delayMicroSec

当让你输入模块类型时,选择 sync

Enter block type: sync

当让你输入参数时,按照如下方式输入:

Enter valid argument list, including default arguments: 
size_t itemsize, int delay_us

②、修改 C++ 代码

修改 gr-myModule/lib/ 目录下的 delayMicroSec_impl.ccdelayMicroSec_impl.h 文件和 gr-myModule/grc/ 目录下的配置文件myModule_delayMicroSec_impl.block.yml

delayMicroSec_impl.cc 核心部分程序:

// 延时指定的微秒数,只在第一次时延迟
if (first_time) {// 延时指定的微秒数std::this_thread::sleep_for(std::chrono::microseconds(d_delay_us));first_time = false; // 重置标志位,后续不再延迟
}

delayMicroSec_impl.h 核心部分程序:

private:size_t d_itemsize;int d_delay_us;bool first_time;

myModule_delayMicroSec_impl.block.yml 部分核心配置:

parameters:
-   id: typelabel: Typedtype: enumoptions: [complex, float, int, short, byte]option_attributes:size: [gr.sizeof_gr_complex, gr.sizeof_float, gr.sizeof_int, gr.sizeof_short,gr.sizeof_char]hide: part
-   id: delay_uslabel: delay usdtype: intdefault: 0 

详细代码及配置文件文末自取

二、编译及安装 OOT 块

1、上面创建的三个 OOT 块需要编译和安装,确保目前位于 gr-myModule 目录中:

cd gr-myModule

2、如果 build/ 目录已存在,请将其删除:

rm -rf build/

3、创建 build/ 目录

mkdir build

4、进入 build 目录

cd build/ 

5、运行 cmake 来构建 makefile

cmake ..

6、编译模块

make

7、安装模块

sudo make install

8、更新 myModule 库的链接

sudo ldconfig 

三、测试

打开 gnuradio-companion

gnuradio-companion

可以看到安装成功的模块
在这里插入图片描述

1、grc 图

正弦波信号源通过限流器后传递给 timestamp_sender 模块,timestamp_sender 将数据流附加上时间戳标签后,通过延时模块对信号延时 2s 后再将其传递至 timestamp_receiver 模块,timestamp_receiver 模块会计算所经历的时间间隔,当计算完成后会向 timestamp_sender 模块传递消息,告知 timestamp_sender 模块模块我目前已经计算完成,你可以继续往数据流上面附加时间戳标签方便我进行下次的计算。
在这里插入图片描述

2、运行结果

首先可以看到正弦波信号时域波形图附加着时间戳标签(微秒)
在这里插入图片描述
其次可以在console 端看到打印的时间间隔信息,为 2001073 us,大约为 2s,因为程序执行也需要一定的时间,当我们进行时间测量的时候,可以先将程序运行所需要的时间计算出来,并在计算时间间隔的时候减去这个值,以便计算的时间更加精准。
在这里插入图片描述

四、资源自取

链接:GNU Radio创建时间戳 C++ OOT块

在这里插入图片描述


我的qq:2442391036,欢迎交流!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/11819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3实战笔记(20)—封装头部导航组件

文章目录 前言一、封装头部导航栏二、使用步骤总结 前言 Vue 3 封装头部导航栏有助于提高代码复用性、统一风格、降低维护成本、提高可配置性和模块化程度&#xff0c;同时还可以实现动态渲染等功能&#xff0c;有利于项目开发和维护。 一、封装头部导航栏 封装头部导航栏&am…

HFSS学习-day4-建模操作

通过昨天的学习&#xff0c;我们已经熟悉了HFSS的工作环境&#xff1b;今天我们来讲解HFSS中创建物体模型的县体步骤和相关操作。物体建模是HFSS仿真设计工作的第一步&#xff0c;HFSS中提供了诸如矩形、圆面、长方体圆柱体和球体等多种基本模型(Primitive)&#xff0c;这些基本…

新书速览|MATLAB科技绘图与数据分析

提升你的数据洞察力&#xff0c;用于精确绘图和分析的高级MATLAB技术。 本书内容 《MATLAB科技绘图与数据分析》结合作者多年的数据分析与科研绘图经验&#xff0c;详细讲解MATLAB在科技图表制作与数据分析中的使用方法与技巧。全书分为3部分&#xff0c;共12章&#xff0c;第1…

精英都是时间控!职场精英的完美一天~~~谷歌FB都在用的时间管理术!

如何超高效使用24小时 每个人的一天都只有24小时&#xff0c;使用时间的方法将决定整个人生。时间管理术并不提倡把自己忙死榨干&#xff0c;而是通过在合适的时间做合适的事情&#xff0c;把大脑机能发挥到极致&#xff0c;从而提高效率&#xff0c;节省下更多时间用于生活与…

(项目)-KDE巡检报告(模板

金山云于12月26日对建行共计【30】个KDE集群,合计【198】台服务器进行了巡检服务。共发现系统风险【135】条,服务风险【1912】条,服务配置风险【368】条。 一、系统风险 1、风险分析(图片+描述) (1)磁盘使用率高 问题描述多个集群的多台服务器磁盘使用率较高,远超过…

答辩PPT模版如何选择?aippt快速生成

这些网站我愿称之为制作答辩PPT的神&#xff01; 很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT…

简述RocketMQ系统架构及其相关概念

一、概述 RocketMQ是一款高性能、高吞吐量的分布式消息队列系统&#xff0c;它采用了分布式架构&#xff0c;支持多生产者和消费者并发读写&#xff0c;具有高可用性、高吞吐量、低延迟等特点。本文将对RocketMQ的系统架构进行详细解析。 二、架构设计 RocketMQ采用了分布式架…

入门物联网就是这么简单——青创智通

工业物联网解决方案-工业IOT-青创智通 MQTT&#xff0c;全称为Message Queuing Telemetry Transport&#xff0c;是一种轻量级的发布/订阅消息传输协议&#xff0c;广泛应用于物联网领域。 MQTT协议以其高效、可靠、灵活的特性&#xff0c;成为物联网设备间通信的理想选择。本…

升级版ComfyUI InstantID 换脸:FaceDetailer + InstantID + IP-Adapter

在使用ComfyUI的InstantID进行人脸替换时&#xff0c;一个常见问题是该工具倾向于保留原始参考图的构图&#xff0c;即使用户的提示词与之不符。 例如&#xff0c;即使用户提供的是大头照并请求生成全身照&#xff0c;结果仍是大头照&#xff0c;没有显示出用户所期望的构图。…

MySQL_DDL语句

1.Data类临时数据的弊端 我们之前在将ServletJSP配合处理请求的过程中 数据库起到一个存取数据的作用 但是我们之前的案例中 数据是在Data类中临时定义的 并不是从数据库中获取的 这样做是不好的 因为每一次服务器关闭之后 那么部署在其上的类也会随着卸载 紧接着和类相挂钩的静…

基于C#开发web网页管理系统模板流程-登录界面

前言&#xff0c;首先介绍一下本项目将要实现的功能 &#xff08;一&#xff09;登录界面 实现一个不算特别美观的登录窗口&#xff0c;当然这一步跟开发者本身的设计美学相关&#xff0c;像蒟蒻博主就没啥艺术细胞&#xff0c;勉强能用能看就行…… &#xff08;二&#xff09…

使用Tkinter开发Python棋盘游戏

使用 Tkinter 开发一个简单的棋盘游戏是很有趣的&#xff01;下面是一个示例&#xff0c;演示如何使用 Tkinter 创建一个简单的五子棋游戏&#xff1a;这个是我通过几个夜晚整理出来的解决方案和实际操作教程。 1、问题背景 目标是开发一个 Python 棋盘游戏&#xff0c;玩家可…

人力资源管理:员工体验平台设计

员工体验是员工的感受&#xff0c;是员工作为企业一份子观察到、感受到和与之互动的一切&#xff0c;包含企业为员工提供的物质条件、人文环境等各方面的内容。 是在工作过程中接触到的所有接触点所产生的对自己与用人单位关系的整体感知&#xff0c;员工体验从员工入职开始贯…

使用Go和JavaScript爬取股吧动态信息的完整指南

引言 在现代金融生态系统中&#xff0c;信息流动的速度和效率对于市场的健康和投资者的成功至关重要。股市信息&#xff0c;特别是来自活跃交流平台如股吧的实时数据&#xff0c;为投资者提供了一个独特的视角&#xff0c;帮助他们洞察市场趋势和投资者情绪。这些信息不仅能够…

NumPy常用操作

目录 一&#xff1a;简介 二&#xff1a;NumPy 常用操作 三&#xff1a;总结 一&#xff1a;简介 是一个开源的Python库&#xff0c;它为Python提供了强大的多维数组对象和用于处理这些数组的函数。NumPy的核心是ndarray&#xff0c;它是一个高效的多维数组容器&#xff0c;用…

力扣【旋转函数】python

如果直接用暴力的话&#xff0c;只能过4个样例好像&#xff0c;超时 因此得用递推公式 F1F0前n-1个数-(n-1)*第n个数 F0sum(nums)-n*第n个数 nlen(nums) ans[]#定义一个存最大值值的列表 ss sum(nums) dm 0 for j in range(n):dm j * nums[j] ans.append(dm) print(dm) n…

面试中的算法(查找缺失的整数)

在一个无序数组里有99个不重复的正整数&#xff0c;范围是1~100&#xff0c;唯独缺少1个1~100中的整数。如何找出这个缺失的整数? 一个很简单也很高效的方法&#xff0c;先算出1~100之和&#xff0c;然后依次减去数组里的元素&#xff0c;最后得到的差值&#xff0c;就是那个缺…

集合系列(二十五) -二叉树、平衡二叉树、红黑树性能总结

一、摘要 二叉树&#xff0c;作为一种数据结构&#xff0c;在实际开发中&#xff0c;有着非常广泛的应用&#xff0c;尤其是以平衡二叉树、红黑树为代表&#xff0c;在前几篇文章中&#xff0c;我们详细的介绍了BST、AVL、RBT的算法以及代码实践&#xff0c;下面简要概括描述一…

deveco studio 打开官方案例,不显示运行按钮。

就拿官方的search举例好了 git 地址 https://gitee.com/harmonyos/samples/tree/master/ETSUI/Search 使用deveco studio打开Search项目&#xff0c;打开Tools->Device-Manager中的Local Emulator本地模拟器&#xff0c; 此时会发现&#xff0c;运行按钮是灰色的&#xff0…

一道dp错题

dis(a,b)就是两点之间的距离公式 那么这道题该怎么解呢,.先看数据范围x,y<1e4,so,18个点两点之间距离最大18*1e4*sqrt(2)<2^18,所以如果跳过的点大于18个点,那么显然一个区间内最多不会跳跃超过17个点 现在我们想知道前i个点跳跃几次在哪跳跃能够达到最小花费,不妨设跳…