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://xiahunao.cn/news/3017781.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Apple OpenELM设备端语言模型

Apple 发布的 OpenELM&#xff08;一系列专为高效设备上处理而设计的开源语言模型&#xff09;引发了相当大的争论。一方面&#xff0c;苹果在开源协作和设备端AI处理方面迈出了一步&#xff0c;强调隐私和效率。另一方面&#xff0c;与微软 Phi-3 Mini 等竞争对手相比&#xf…

k8s部署Kubeflow v1.7.0

文章目录 环境介绍部署访问kubeflow ui问题记录 环境介绍 K8S版本&#xff1a;v1.23.17&#xff0c;需要配置默认的sc 参考&#xff1a;https://github.com/kubeflow/manifests/tree/v1.7.0 部署 #获取安装包 wget https://github.com/kubeflow/manifests/archive/refs/tag…

数控六面钻适用场景-不止家具制造

在快节奏的现代生活中&#xff0c;家具作为我们生活的重要组成部分&#xff0c;其美观度和实用性日益受到人们的关注。而在这背后&#xff0c;一个不可或缺的“工匠”正默默地发挥着它的作用——那就是数控六面钻。 数控六面钻&#xff0c;顾名思义&#xff0c;是一种高度自动…

Ansible自动运维工具之playbook

一.inventory主机清单 1.定义 Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 2.变量 &#xff08;1&#xff09;主机变量 [webservers] 192.168.10.14 ansible_port22 ansible_userroot ans…

【Redis分布式缓存】 哨兵机制

Redis 哨兵机制 哨兵作用和原理 Redis提供了哨兵&#xff08;Sentinel&#xff09;机制来实现主从集群的自动故障恢复。 哨兵的作用 监控&#xff1a;Sentinel 会不断检查您的master和slave是否按预期工作自动故障恢复&#xff1a;如果master故障&#xff0c;Sentinel会将一…

(三)Appdesigner-界面转换及数据导入和保存

提示&#xff1a;文章为系列文章&#xff0c;可以在对应学习专栏里面进行学习。对应资源已上传 目录 前言 一、Appdesigner是什么&#xff1f; 二、界面切换 三、数据导入及保存 &#xff08;一&#xff09;数据导入 &#xff08;二&#xff09;数据保存 总结 前言 Appd…

设置 kafka offset 消费者位移

文章目录 1.重设kafka消费者位移2.示例2.1 通过 offset 位置2.2 通过时间2.3 设置到最早 1.重设kafka消费者位移 维度策略含义位移Earliest把位移调整到当前最早位移处位移Latest把位移调整到当前最新位移处位移Current把位移调整到当前最新提交位移处位移Specified-Offset把位…

0507华为od二面

只记录自己没回答上的问题 1、ZGC的缺点&#xff1a; 1)只是适用于32位系统 2)最大只是支持4TB内存容量 3)最糟糕的情况下吞吐量会下降15%&#xff0c;这都不是事至于吞吐量&#xff0c;通过扩容分分钟解决 4)分代的原因:不同对象的生命周期不相同&#xff0c;可能会扫描整个堆…

对于SOMP算法的测试

刚开始只上传了SOMP算法的代码&#xff0c;并没有过多介绍。 所以本篇文章对SOMP算法用法进行一个介绍 SOMP算法代码 function [X_hat] MMV_SOMP(Y, PHI, s)% SOMP:同时正交匹配追踪 simultaneous orthogonal matching pursuit% 论文&#xff1a;J. Determe, J. Lo…

【verilog-语法】编译命令( compiler directives )

一、前言 编译器指令的范围是从它的出现的点延伸到处理的所有文件&#xff0c;直到另一个编译器指令取代它或处理结束。编所有的编译命令都有重音符 " "引出。在IEEE std1364-2005中共介绍了19条编译命令&#xff0c;这19条命令又可分为12组命令进行独立或组合使用…

指针再学习笔记

概念 示例 类型 示例 作用 注意&#xff1a;有些内存地址可能系统不会允许任意访问 运算 示例 空指针

C语言程序设计(三)

1、数据的两种表现形式 常量&#xff1a;其值不能被改变的量称为常量。 变量&#xff1a; 单撇号内只能包含一个字符。双撇号内可以包含一个字符串。 注意&#xff1a;要区分符号常量和变量,不要把符号常量误认为变量。符号常量不占内存只是一个临时符号,代表一个值,在预编译…

免费地理信息系统(GIS)数据集合网站,500合1

超过500个免费的地理数据网站&#xff0c;数据涵盖多种主题。 这是一个免费的地理信息系统(GIS)数据源列表&#xff0c;涵盖了全球范围内的各种地理数据&#xff0c;包括自然环境、行政边界、人口、交通等多个领域的数据。 该数据列表由作者 Robin Wilson 收集整理&#xff0…

软件设计师-应用技术-UML建模题3

基础知识及技巧&#xff1a; 1. 用例图&#xff1a; 1.1 考点&#xff1a; 题干里面有关项目的详细描述&#xff0c;完整用例图中的某些参与者和某些用来扣掉&#xff0c;根据题干内容和已有用例图补充。根据题干&#xff0c;分析用例图之间的关系。 1.2 基础知识&#xff…

学习通下载PDF资源

今天突然发现&#xff0c;学习通的pdf资源居然是没有下载入口的&#xff0c;这整的我想cv一下我的作业都搞不了&#xff0c;于是我一怒之下&#xff0c;怒了一下。 可以看到学习通的pdf资源是内嵌在网页的&#xff0c;阅读起来很不方便&#xff0c;虽然他内置了阅读器&#xf…

如何更好地使用Kafka? - 运行监控篇

要确保Kafka在使用过程中的稳定性&#xff0c;需要从kafka在业务中的使用周期进行依次保障。主要可以分为&#xff1a;事先预防&#xff08;通过规范的使用、开发&#xff0c;预防问题产生&#xff09;、运行时监控&#xff08;保障集群稳定&#xff0c;出问题能及时发现&#…

技术分享-上海泗博MPI转以太网模块MPI-131实现Node-RED直接访问西门子PLC数据

上海泗博自动化MPI-131是一款用于西门子S7系列PLC&#xff08;包括S7-200、S7-300、S7-400&#xff09;以及西门子数控机床&#xff08;如840D、840DSL等&#xff09;的以太网通讯模块&#xff0c;无需编程&#xff0c;即插即用&#xff0c;支持通过模块上下载PLC程序和数据监控…

【Linux入门】基础开发工具

本篇博客整理了Linux&#xff08;centOS版本&#xff09;中基础开发工具的用途和用法&#xff0c;旨在透过开发工具的使用&#xff0c;帮助读者更好地理解可执行程序的编写、编译、运行等。 目录 一、软件包管理器 yum 1.软件的下载与安装 2.Linux应用商店&#xff1a;yum …

【busybox记录】【shell指令】tr

目录 内容来源&#xff1a; 【GUN】【tr】指令介绍 【busybox】【tr】指令介绍 【linux】【tr】指令介绍 使用示例&#xff1a; 转换字符 - 默认 转换字符 - 不翻译指定字符数组 此指令目前接触少&#xff0c;用得少&#xff0c;把精力放到其他常用指令上 常用组合指令…

flutter安卓项目生成MD5、sha1、公钥等

一&#xff1a;MD5、SHA1等生成方式 工具&#xff1a;Android Studio 1. 打开flutter项目下的Android目录 2. 创建signingReport运行配置项 3. build apk&#xff1a; 导航栏->build->Generate Signed App Bundle / APK... 4. 填写存放路径&#xff0c;同时创建文件xx…