前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >GNU Radio创建时间戳 C++ OOT块

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

作者头像
Gnep@97
发布于 2024-05-08 01:02:15
发布于 2024-05-08 01:02:15
17400
代码可运行
举报
运行总次数:0
代码可运行

前言

目前有这么样一个需求,我想在 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 块
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gr_modtool newmod myModule 
cd gr-myModule 
gr_modtool add timestamp_sender

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Enter block type: sync

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 核心部分程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 核心部分程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 部分核心配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parameters:
-   id: type
    label: Type
    dtype: enum
    options: [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 块
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gr_modtool newmod myModule 
cd gr-myModule 
gr_modtool add timestamp_receiver 

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Enter block type: sync

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 核心部分程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 核心部分程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private:
	size_t d_itemsize;

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parameters:
-   id: type
    label: Type
    dtype: enum
    options: [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 块
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gr_modtool newmod myModule 
cd gr-myModule 
gr_modtool add delayMicroSec

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Enter block type: sync

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 核心部分程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 延时指定的微秒数,只在第一次时延迟
if (first_time) {
 // 延时指定的微秒数
 std::this_thread::sleep_for(std::chrono::microseconds(d_delay_us));
 first_time = false; // 重置标志位,后续不再延迟
}

delayMicroSec_impl.h 核心部分程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private:
	size_t d_itemsize;
	int d_delay_us;
	bool first_time;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
parameters:
-   id: type
    label: Type
    dtype: enum
    options: [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_us
    label: delay us
    dtype: int
    default: 0 

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

二、编译及安装 OOT 块

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd gr-myModule

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rm -rf build/

3、创建 build/ 目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir build

4、进入 build 目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd build/ 

5、运行 cmake 来构建 makefile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmake ..

6、编译模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make

7、安装模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo make install

8、更新 myModule 库的链接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo ldconfig 

三、测试

打开 gnuradio-companion

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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块

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【笔记】《计算机图形学》(15)——曲线
这一章介绍了曲线的表示, 用到了比较多的数学. 前半部分主要是介绍了曲线的性质和表示方式, 并介绍了多项式插值曲线, 后半部分主要介绍了包括贝塞尔曲线和B样条曲线在内的拟合曲线. 样条曲线的内容在样条曲线曲面有过一些简单的介绍, 这一章没有介绍曲面部分, 但是在曲线部分则进行了更加详细的介绍, 我也对这部分有了更好的理解.
ZifengHuang
2021/06/29
3K0
B样条曲线
B样条曲线广泛应用于车辆以及航空航天等工业领域,例如:自动驾驶汽车路径规划时为了使得汽车运行平稳,需要使得运行路径的二阶导数连续(目前,AGV小车主要是通过直线和圆弧进行路径规划,由于两个阶段加速度不一致,因此在进行直线与圆弧转换过程中存在抖动问题),经常需要用到B样条曲线;其次,B样条曲线广泛应用于飞行器表面的描述。曲线的平滑处理包含近似拟合(曲线不经过点)以及插值拟合(曲线经过点)两种,在此进行简要分析。
联远智维
2022/01/20
1.5K0
B样条曲线
怎样在等值面上用 Wolfram 语言的神经网络拟合B样条曲线
读到这篇小文的朋友:新年好!今天我们将在本文中简单探索一个结合Wolfram语言的神经网络与B样条功能的有趣问题。
WolframChina
2021/03/15
1.8K0
怎样在等值面上用 Wolfram 语言的神经网络拟合B样条曲线
模拟试题B
1.灰度等级为256级,分辨率为2048*1024的显示器,至少需要的帧缓存容量为( )
步行者08
2018/10/09
4.3K2
Python+Matplotlib绘制三次B样条曲线基函数图像
在计算机图形学课程中,B样条曲线属于重要教学内容之一。已知,m+n+1个控制点可以确定m+1段光滑拼接的n次B样条曲线,其中第i段(i=0,1,2,...,m)曲线上点的定义为
Python小屋屋主
2023/08/29
5710
Python+Matplotlib绘制三次B样条曲线基函数图像
用OpenGL进行曲线、曲面的绘制
实验目的 1)理解Bezier曲线、曲面绘制的基本原理;理解OpenGL中一维、二维插值求值器的用法。 2)掌握OpenGL中曲线、曲面绘图的方法,对比不同参数下的绘图效果差异; 代码1:用四个控制点绘制一条三次Bezier曲线 #include "stdafx.h" #include <stdlib.h> #include <time.h> #include <GL/glut.h> //4个控制点的3D坐标——z坐标全为0 GLfloat ctrlpoints[4][3] = { { -4, -
Zoctopus
2018/06/04
3.2K0
可视化图表实现揭秘
1. 介绍 1.1 什么是数据可视化? 可视化是利用计算机图形学和图像处理技术,将数据转换成图形或者图像在屏幕上显示出来,再进行交互处理的理论、方法和技术。 数据可视化并不是简单的将数据变成图表,而是以数据为视角,看待世界。数据可视化就是将抽象概念形象化表达,将抽象语言具体化的过程。 1.2 为什么要用数据可视化 首先我们利用视觉获取的信息量绝对远远的比别的感官要多得多。 它能帮助分析的人对数据有更全面的认识,下面举个🌰 我们看下面几组数据: 对数据进行简单的数据分析,每组数据都有两个变量 X 和 Y,然
用户1097444
2022/06/29
1.2K0
可视化图表实现揭秘
Python+OpenGL绘制任意长度和次数的B样条曲线
对于给定的m+n+1个控制点,可以绘制m+1段光滑拼接的n次B样条曲线,每段曲线上点的位置由n+1个控制点决定,其中第i段曲线上参数t(0<=t<=1)对应的点为
Python小屋屋主
2022/06/05
1K0
Python+OpenGL绘制任意长度和次数的B样条曲线
Python+Matplotlib可视化三次贝塞尔曲线的4个调和函数
确定一条n次贝塞尔曲线需要n+1个控制点和n+1个对应的调和函数,每个调和函数的定义域和值域都为[0,1],且所有调和函数值之和恒等于1,与自变量取值无关。以三次贝塞尔曲线为例,需要4个控制点(记为P1、P2、P3、P4),相应的4个调和函数的表达式分别为:
Python小屋屋主
2022/06/05
9580
Python+Matplotlib可视化三次贝塞尔曲线的4个调和函数
实验11 B样条曲面生成
求值器能够描述任何角度的多项式或有理多项式样条或表面,包括B-样条,NURBS(非均匀有理B-样条)表面,Bezier曲线和表面,以及Hermite样条。由于求值器只提供了对曲线或表面底层描述,需要使用更高层次的NURBS接口来生成B样条曲面。 OpenGL提供了NURBS接口,该接口封装了大量代码,不仅包含渲染功能,也提供了修剪曲面等额外功能,NURBS函数使用平面多边形进行渲染。B样条曲面包含非均匀有理B-样条,另外Bezier的缺点是增加很多控制点时曲线变得不可控,而B样条曲面调整4个控制点可以得到较好的效果。 NURBS接口生成B样条曲面的过程如下。 (1)生成控制点和创建NURBS对象:
步行者08
2020/10/29
1.8K0
实验11 B样条曲面生成
贝塞尔曲线算法:求 t 在三阶贝塞尔曲线上的点、切向量、法向量
我们有 p1(锚点 1)、cp1(控制点 1)、cp2(控制点 2)、p2(锚点 2) 表示的一条三阶贝塞尔曲线,给定曲线参数 t,求其对应的点位置,以及这个点的切向量和法向量。
前端西瓜哥
2024/07/31
6460
贝塞尔曲线算法:求 t 在三阶贝塞尔曲线上的点、切向量、法向量
Python+OpenGL绘制沿B样条曲线运动的红色小球
任务描述: 绘制多条B样条曲线以及一个沿曲线运动的红色小球,具体功能有: 1)按1、2、3键可以切换1次B样条曲线、2次B样条曲线、3次B样条曲线; 2)鼠标左键选择一个控制点后按delete键可以
Python小屋屋主
2023/08/29
4190
Python+OpenGL绘制沿B样条曲线运动的红色小球
自动驾驶路径规划技术-三次样条插值(Cubic Spline Interpolation)曲线及Python代码实现
自动驾驶运动规划(Motion Planning)是无人驾驶汽车的核心模块之一,它的主要任务之一就是如何生成舒适的、碰撞避免的行驶路径和舒适的运动速度。生成行驶路径最经典方法之一就是是Sampling-Based Planner算法;基于采样的规划器可以规划出可行的轨迹,但这种轨迹往往是折线,为了保证车辆行驶过程中给乘客良好舒适的体验,需要对规划的轨迹进行平滑。Cubic Spline就是一种常用的插值平滑算法,通过一系列的控制点得到一条连续平滑的轨迹。
YoungTimes
2022/04/28
2.2K0
自动驾驶路径规划技术-三次样条插值(Cubic Spline Interpolation)曲线及Python代码实现
【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现
  RT,马三最近在参与一款足球游戏的开发,其中涉及到足球的各种运动轨迹和路径,比如射门的轨迹,高吊球,香蕉球的轨迹。最早的版本中马三是使用物理引擎加力的方式实现的足球各种运动,后来的版本中使用了根据物理学公式手动计算位置和物体速度的方式实现,现在这个版本中使用的是DoTween+贝塞尔曲线调节来实现。(关于它们之间的各种优缺点我们会在以后单独开一篇博客来探讨,届时也会放出源代码互相学习下)好了,言归正传,今天马三就来和大家一起学习一下游戏中的贝塞尔曲线以及其在Unity中如何实现。
马三小伙儿
2018/09/12
4.5K0
【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现
贝塞尔曲线方程---插值算法的完美解释(附matlab完整代码)
下面的这个就是鸢尾花里面的二阶贝塞尔曲线,有三个控制点组成,以此类推,n阶的贝塞尔曲线有n+1个点组成的;
阑梦清川
2025/02/24
2480
贝塞尔曲线方程---插值算法的完美解释(附matlab完整代码)
图形学复习
​ 令 \Delta_{1} = 2a,\Delta_{2} = 2(a+b) ;
努力的Greatiga
2022/07/25
1.8K0
【笔记】《计算机图形学》(16)——计算机动画
这一章介绍了计算机动画相关的内容, 主要介绍了动画的基本概念, 动画之间的插值, 几何变形, 角色动画, 物理动画, 生成式动画和对象组动画这几个领域, 这些领域书中都只介绍了最基础的内容, 想要深入了解某个领域的话必须阅读其它资料.
ZifengHuang
2021/07/23
1.8K0
【笔记】《计算机图形学》(16)——计算机动画
Android之贝赛尔曲线及其应用场景
导语 本文对贝赛尔曲线的公式及推导过程进行了深入学习,同时结合网上的资料,整理了一些其常用的应用场景。 前段时间做送礼动画需求的时候遇到送礼轨迹需要平滑的要求,因此对常用的平滑轨迹贝赛尔曲线进行了
MelonTeam
2018/01/04
1.8K0
Android之贝赛尔曲线及其应用场景
【GAMES101】Lecture 11 贝塞尔曲线
很早之前说过的这种矢量图是不会随着放大而失真的,像这种字体,就是用了逐段的三次贝塞尔曲线实现的
叶茂林
2024/01/29
2170
【GAMES101】Lecture 11 贝塞尔曲线
贝塞尔曲线
贝塞尔曲线 (Bézier Curve) 是由法国工程师皮埃尔·贝兹 (Pierre Bézier) 于 1962 年所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计 1。贝塞尔曲线最初由保尔·德·卡斯特里奥 (Paul de Casteljau) 于 1959 年运用德卡斯特里奥算法 (De Casteljau’s Algorithm) 开发,以稳定数值的方法求出贝塞尔曲线。
为为为什么
2024/09/20
1690
贝塞尔曲线
推荐阅读
相关推荐
【笔记】《计算机图形学》(15)——曲线
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 前言
  • 一、创建自定义的 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、运行结果
  • 四、资源自取
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档