GNURadio中的PMTs(Polymorphic Types)数据类型

2023-05-16

目录

1、整体概述

2、使用方法的举例说明

3、对于PMT类型的补充说明


1、整体概述

PMTs在GNURadio中代表多态类型(Polymorphic Types),这种类型不像float、int一样是严格意义上的数据类型,更像是为了模块间信息传输的方便而对不同的数据类型进行统一的包装(在GR模块中,相互之间的数据传输必须是同一种数据类型)。该数据类型可以用来存储任何类型的数据,并且可以简单地转换为常见的数据类型,如bool、long、vector等,常用于流标签(stream tags)以及数据传送接口(message passing )中。当所有的数据都定义为pmt类型时,由于数据具有相同的类型,大大简化了GR块之间的数据传输。

2、使用方法的举例说明

下面是一些简单的李子来说明pmt数据的作用。

首先是一般的定义方式(Python):

import pmt
# 定义pmt数据
p1 = pmt.from_long(23)
print("type of p1:",type(p1))
print(p1)
# 定义pmt数据p2
p2 = pmt.from_complex(1j)
print("type of p2:", type(p2))
print(p2)
print("Is p2 a complex?:", pmt.is_complex(p2))
# 在不确定原始数据类型的情况下,is_*可以用来精确的恢复原始数据类型
if pmt.is_complex(p2):
    d = pmt.to_complex(p2)
elif pmt.is_integer(p2):
    d = pmt.to_long(p2)
else: # 抛出异常
    raise ValueError("expected an integer or complex")

'''  运行结果  
type of p1: <class 'pmt.pmt_swig.swig_pmt_ptr'>
23
type of p2: <class 'pmt.pmt_swig.swig_pmt_ptr'>
0+1i
Is p2 a complex?: True
'''

上述代码首先定义了pmt类型数据p1和p2,分别将一个整型数据和一个复数型数据转换为pmt类型。我们可以打印出p1和p2的数据类型可以发现都是pmt.pmt_swig.swig_pmt_ptr类型,但是打印出来后仍然是各自原始类型的形式,这是由于在打印时,pmt是将原类型的数据转化为字符串输出。另我们可以调用类似is_complex()的方法来查询pmt数据的原始数据类型。在不确定原始数据类型的情况下,is_*方法可以用来精确的恢复原始数据类型。

下面是c++版本的定义方式:

#include "iostream"
#include "pmt/pmt.h"
int main()
{
    // long型数据转化为pmt型
    pmt::pmt_t p1 = pmt::from_long(23);
    // 打印该pmt数据,结果仍是23
    std::cout << "p1: " << p1 << std::endl;
    // 复数(0+1j)转化为pmt型
    pmt::pmt_t p2 =pmt::from_complex(0, 1);
    // 同样的,结果仍是0+1j
    std::cout << "p2: " << p2 << std::endl;
    // 验证P2是否仍是复数,结果为1(true)
    std::cout << "is p2 a complex?: " << pmt::is_complex(p2) << std::endl;
    return 0;
}

/*   运行结果
p1: 23
p2: 0+1i
is p2 a complex?: 1
*/

在terminal中输入指令 g++ test.cpp -lgnuradio-pmt -o test来进行编译,输入./test来运行。实际命令需要根据实际情况进行修改。

当将一个非pmt数据转化为pmt数据时,可以使用from_*方法,反过来可以使用to_*的方法将pmt数据转换回来

pmt::pmt_t P_int = pmt::from_long(42);
int i = pmt::to_long(P_int);
pmt::pmt_t P_double = pmt::from_double(0.2);
double d = pmt::to_double(P_double);
pmt::pmt_t P_double = pmt::mp(0.2);

pmt::mp是一种简写方式,可以从给定的数据中自动推断出正确的from_类型并转化为pmt

类似于pmt::mp,在Python中也可以使用动态转化方法pmt.to_pmt。另外pytohn中多了一个动态恢复的函数pmt.to_python,自动获取pmt数据的原始类型并恢复。

p_int = pmt.to_pmt(42)
i = pmt.to_python(p_int)
print("i: ", i, "type of i: ", type(i))
p_double = pmt.to_pmt(42.0)
d = pmt.to_double(p_double)
print("d: ", d, "type of d: ", type(d))

'''  运行结果
i:  42 type of i:  <class 'int'>
d:  42.0 type of d:  <class 'float'>
'''

另外,在pmt中有三个常用的常量(python版)

P_true = pmt.PMT_T
P_false = pmt.PMT_F
P_nil = pmt.PMT_NIL

以上三中数据类型分别代表布尔pmt类型的true、false,以及NULL或者None, 可用来做默认参数或者返回值等。c++中的定义于python类似。

字符串类型在PMTs中有着重要的作用

pmt::pmt_t P_str = pmt::string_to_symbol("spam");
pmt::pmt_t P_str2 = pmt::intern("spam");
std::string str = pmt::symbol_to_string(P_str);

pmt::intern方法的作用同pmt::string_to_symbol,同上文提到的pmt::mp一样,也是一种简写方式。

其他一些复杂数据类型的定义就一起写在下面供参考(Python版):

# 元组类型的转换
P_tuple = pmt.to_pmt((1, 2, 3, 'spam', 'eggs'))
# 字典类型的转换
P_dict = pmt.to_pmt({'spam': 42, 'eggs': 23})
# np数组的转化
P_f32vector = pmt.to_pmt(numpy.array([2.0, 5.0, 5.0, 5.0, 5.0], dtype=numpy.float32))
print pmt.is_f32vector(P_f32vector) # Prints 'True'

c++版本的要稍微复杂一些:

 对于c++创建字典类型的pmt,需要首先创建一个字典,然后分别添加每一个键值对

pmt::pmt_t P_dict = pmt::make_dict();
P_dict = pmt::dict_add(P_dict, pmt::string_to_symbol("spam"), pmt::from_long(42));
P_dict = pmt::dict_add(P_dict, pmt::string_to_symbol("eggs"), pmt::from_long(23));

对于元组类型,c++代码如下:

pmt::pmt_t P_tuple = pmt::make_tuple(pmt::from_long(1), pmt::from_long(2), pmt::from_long(3), pmt::string_to_symbol("spam"), pmt::string_to_symbol("eggs"))

对于向量来说,可以先初始化一个使用初始值进行填充的确定长度的向量,然后可以对其进行数据修改。

// 创建一个含有五个视觉,每个数据都是23的向量
pmt::pmt_t P_vector = pmt::make_vector(5, pmt::from_long(23)); 
// 将第一个数据改为42
pmt::vector_set(P_vector, 0, pmt::from_long(42)); 
// 打印结果将是 42
std::cout << pmt::vector_ref(P_vector, 0); 

在c++的元组定义中可以发现,元组内的数据类型必须全部转化为pmt。而向量不同于元组,我们可以在向量中直接载入非pmt类型的数据。比如,我们想传送8个float型(比如,这些数据可以是一个滤波器的一些参数)的数据到另一个模块,而将每个元素与 PMT 相互转换会很麻烦,这时我们可以使用如下所示的特殊向量类型:

// 创建一个含有8个值为5.0的float数据的pmt向量,注意这里float数据无需转换为pmt类型
pmt::pmt_t P_f32vector = pmt::make_f32vector(8, 5.0); 
pmt::f32vector_set(P_f32vector, 0, 2.0); // 将第一个元素赋值为2.0
float f = f32vector_ref(P_f32vector, 0);
std::cout << f << std::endl; // 打印结果为 2.0
size_t len;
float *fp = pmt::f32vector_elements(P_f32vector, len);
for (size_t i = 0; i < len; i++)
    std::cout << fp[i] << std::endl; // 一词打印P_f32vector中的所有元素

3、对于PMT类型的补充说明

PMT数据在程序中的数据类型为:pmt::pmt_t。除上文提到的pmt vectors类型外,pmt类型的数据都不可改变,相当于只读的。主要原因是考虑到线程安全的问题,这样就不会发生在一个线程(模块)读pmt数据的同时另一个线程也在修改该pmt数据的线程安全问题,事实上,我们写数据到PMT中的操作自始至终都是一个创建新的pmt数据的过程。

参考:Polymorphic Types (PMTs) - GNU Radio

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GNURadio中的PMTs(Polymorphic Types)数据类型 的相关文章

随机推荐

  • 云服务器下载的镜像文件raw格式转vmdk

    使用软件qemu img https qemu weilnetz de w64 2021 下载之后安装 xff0c 然后进入安装的文件夹 xff0c 打开命令行工具然后执行下面命令 qemu img exe convert p f raw
  • keil5使用Arm Compiler 6编译出错

    Using Compiler 39 V6 15 39 folder 39 D Keil v5 ARM ARMCLANG Bin 39 main c 16 warning In file included from USER stm32f4x
  • 浏览器的相关知识

    今天在网上找到了一些需要大致了解的有关浏览器的相关知识分享 xff0c 原文链接在下方 1 浏览器的主要组成部分是什么 xff1f 用户界面 包括地址栏 前进 后退按钮 书签菜单等 除了浏览器主窗口显示的您请求的页面外 xff0c 其他显示
  • MySQL--用Navicat连接MySQL8.0报错1251问题解决

    文章目录 一 安装后直接用Navicat连接1251报错二 仍报错为 39 mysql 39 不是内部或外部命令 1 环境变量配置 三 找不到MySQL Server 8 0 bin路径四 解决上述全部问题 一 安装后直接用Navicat连
  • 10 分钟让你明白 MySQL 是如何利用索引的

    一 前言 在MySQL中进行SQL优化的时候 xff0c 经常会在一些情况下 xff0c 对 MySQL 能否利用索引有一些迷惑 譬如 MySQL 在遇到范围查询条件的时候就停止匹配了 xff0c 那么到底是哪些范围条件 xff1f MyS
  • 吊炸天的 Docker 图形化工具 —— Portainer

    一 Docker图形化工具二 DockerUI三 船坞四 搬运工1 查看portainer平均值2 选择喜欢的portainer风格整合 xff0c 下载3 启动dockerui容器4 xff0c 网页管理 一 Docker图形化工具 Do
  • 为提高面试通过率,技术岗可以提前做好哪些面试准备?

    Hi xff0c 大家好 xff0c 我是小庄 目前2023届秋招提前批已经陆续开始了 xff0c 考虑到一些校招的同学可能是第一次接触面试 xff08 该文章适用于校招 社招 xff09 xff0c 所以这篇文章就是为了记录一些面试技巧
  • GNU Radio自定义模块:Embedded Python Block的使用

    GNU Radio 学习使用 OOT 系列教程 xff1a GNU Radio3 8创建OOT的详细过程 基础 C 43 43 GNU Radio3 8创建OOT的详细过程 进阶 C 43 43 GNU Radio3 8创建OOT的详细过程
  • 中文分词

    本文首先介绍下中文分词的基本原理 xff0c 然后介绍下国内比较流行的中文分词工具 xff0c 如jieba SnowNLP THULAC NLPIR xff0c 上述分词工具都已经在github上开源 xff0c 后续也会附上github
  • (1)GNSS驱动nmea_navsat_driver 功能包的使用

    总览 该软件包为输出兼容NMEA语句的GPS设备提供了ROS接口 有关原始格式的详细信息 xff0c 请参见NMEA句子的GPSD文档 在成千上万的NMEA兼容GPS设备中 xff0c 我们正在汇编已知支持的设备列表 这个包是与兼容geog
  • (2)ROS传感器之GPS实践

    一 GPS接口类型 GPS接口大体可以分为两类 xff0c 一是单独的GPS接收器 xff0c 通常为USB接口 xff1b 二是与其他传感器集成 xff0c 例如激光雷达或者imu xff0c 大多是USB或者网络接口 xff0c 本文主
  • (6)GPS坐标与UTM坐标的转换

    1 简介 1 1 消息 gps common定义了两个通用消息 xff0c 供GPS驱动程序输出 xff1a gps common GPSFix和gps common GPSStatus 在大多数情况下 xff0c 这些消息应同时发布 xf
  • scanf("%c",&m)中%c前面加空格的作用

    c前面加空格不是必须的 xff0c 但有了空格就可以忽略你输入的空格 例如 xff1a scanf 34 c 34 amp m xff0c 你输入了 a a前面有个空格 xff0c a就能被c接受 但控制符前如果没空格 xff0c 那c就接
  • 聊一聊cropper.js

    最近的项目中有一个纯前端实现的功能困扰了我好久 xff0c 就是用户上传图片以后需要用户进入图片裁剪页并完成上传的功能 xff0c 一开始我是打算自己去用canvas去写这样一个页面的 xff0c 但是项目开发周期短 xff0c 任务紧 x
  • CAS服务(5.3)使用mysql验证

    CAS服务使用mysql验证 一 添加相关依赖 在pom文件里添加下面的依赖 这里cas的版本是5 3 14 lt dependency gt lt groupId gt org apereo cas lt groupId gt lt ar
  • Realsense L515 例程详解 Tutorial 1

    最近在用Realsense L515做一个机器人的视觉部分 看到网上相关资料较少 xff0c 和大家分享一下最近一周所学 第一个例程比较简单 xff0c 实现的功能也比较朴实 实现了什么功能呢 xff1f 就是把从相机得到的深度信息通过控制
  • #AI边缘计算单元-想搞开发,买树莓派还是Nano?

    作者 xff1a Blue Hole 个人网站 xff1a https www wcfde xyz xff0c 欢迎交流 近几年边缘计算快速发展 xff0c 已经渗透到各个行业 边缘计算单元也像雨后春笋涌现出来 xff0c 面对如此多的开发
  • 算法要怎么学习

    学习算法 xff0c 切记不要一上来就开始啃 算法导论 xff0c 毕竟这本书并不适合新手学习 xff0c 如果你之前的算法基础比较薄弱 xff0c 只会一直陷在 拿起来又放下 的循环里 可以怎么入门呢 xff1f 建议还是看书 43 实战
  • EGO-Swarm代码解读-地图部分

    文章目录 1 参数解读2 主要函数解读 1 参数解读 一 MappingData md 中的参数含义 xff1a local bound min span class token punctuation span local bound m
  • GNURadio中的PMTs(Polymorphic Types)数据类型

    目录 1 整体概述 2 使用方法的举例说明 3 对于PMT类型的补充说明 1 整体概述 PMTs在GNURadio中代表多态类型 xff08 Polymorphic Types xff09 xff0c 这种类型不像float int一样是严