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)数据类型 的相关文章

  • 如何将 interface{} 转换回其原始结构?

    我需要一种方法将结构 接口动态转换回其原始对象 我可以在里面添加方法 函数 基本上我需要这样的东西 MyStruct gt Interface gt MyStruct 在最终转换时 除了结构内部的内容之外 我对原始结构一无所知 所以我不能这
  • 识别输入的数据类型

    我正在尝试打印用户输入的数据类型并生成如下表 ABCDEFGH String 1 09 float 0 int true bool etc 我正在使用 Python 3 2 3 并且我知道我可以使用type 获取数据的类型 但在Python
  • Maven 依赖类型 ejb 与 jar

    有什么区别
  • time_t 最终的 typedef 是什么?

    我搜索了我的 Linux 机器并看到了这个 typedef typedef time t time t 但我找不到 time t定义 The 文章对此进行了一些阐述 底线是类型time tC 规范中不保证 The time tdatatyp
  • 检查对象类型是否继承抽象类型

    说我有一个对象 someDrink 它可能是类型CocaCola or Pepsi两者都继承了抽象Cola 它继承了Drink 或任何种类的饮料 我有一个方法可以返回一串最喜欢的饮料 public string PreferredDrink
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • DataFrame 中的字符串,但 dtype 是对象

    为什么 Pandas 告诉我我有对象 尽管所选列中的每个项目都是一个字符串 即使在显式转换之后也是如此 这是我的数据框
  • 如何在一列中存储数组或多个值

    运行 Postgres 7 4 是的 我们正在升级 我需要将 1 到 100 个选定项目存储到数据库的一个字段中 98 的情况下 只会输入 1 个项目 而 2 的情况下 如果是这样的话 会输入多个项目 这些项目只不过是文本描述 截至目前 长
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 如何手动推断表达式的类型

    给定 Haskell 函数 head filter fst 现在的问题是如何手动 手动 找到类型 如果我让 Haskell 告诉我我得到的类型 head filter fst Bool b gt Bool b 但我想了解仅使用所用函数的签名
  • 什么是欣德利米尔纳?

    我遇到过这个词欣德利 米尔纳 我不确定是否理解它的意思 我已阅读以下帖子 史蒂夫 叶格 动态语言的反击 http steve yegge blogspot com 2008 05 dynamic languages strike back
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • Java 泛型 - 重写抽象方法并具有子类的返回类型

    我正在尝试创建一个设置 其中一组子类覆盖超类 这个超类包含一个抽象方法 理想情况下 其返回类型是调用该方法的对象的返回类型 这样它的有效行为如下 public abstract class SuperClass public abstrac
  • 在 C 中如何将一种类型的变量更改为另一种类型?

    我要做 int main bla bla bla void onetype switch USER INPUT TYPE CASE CONVERT TO CHAR convert onetype VOID TO CHAR gt gt gt
  • C++ 强制转换运算符重载 [重复]

    这个问题在这里已经有答案了 我有一个只有一个 int 成员的类 例如 class NewInt int data public NewInt int val 0 constructor data val int operator int N
  • 过滤器的 Scala 集合类型

    假设您有一个 List 1 1 其类型为 List Any 这当然是正确的且符合预期 现在如果我像这样映射列表 scala gt List 1 1 map case x Int gt x case y String gt y toInt 结
  • int(int)& 或 int(int) const & 是什么类型?

    std is function专门用于具有类似于以下签名的类型 int int 看这里 std is function http en cppreference com w cpp types is function 但这既不是指向成员方法
  • PolyML 函数和类型

    一对函数tofun int gt a gt a and fromfun a gt a gt int这样 fromfun o tofun n评估为n对于每一个n int 任何人都可以向我解释这实际上要求什么 我正在寻找更多对此的解释 而不是实
  • C++dynamic_cast vs 在静态枚举中存储对象类型?

    我正在为一个框架开发一个大的类层次结构 完成后将需要大量的类型转换 我的问题是 放入一个使用枚举来存储层次结构中所有对象类型的静态成员是多么愚蠢的想法 让每个类的成员都是静态的不会增加实例化对象的大小 并且会提供一种 可能 比dynamic

随机推荐

  • 云服务器下载的镜像文件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一样是严