GNU Radio创建FFT、IFFT C++ OOT块

news2024/11/18 15:28:59

文章目录

  • 前言
  • 一、GNU Radio官方FFT弊端
  • 二、创建自定义的 C++ OOT 块
    • 1、创建 OOT 模块
    • 2、创建 OOT 块
    • 3、修改 C++ 和 CMAKE 文件
    • 4、编译及安装 OOT 块
  • 三、测试
    • 1、grc 图
    • 2、运行结果
      • ①、时域波形对比
      • ②、频谱图对比
  • 四、资源自取


前言

GNU Radio 自带的 FFT 模块使用起来不是很方便,这个模块要求输入和输出数据长度预先设定,且一旦设定后就要求前后的 block 与其具有相同长度的输入输出,并不满足我目前的需求,因此需要有必要重新自己做一个 FFT 和 IFFT OOT块。


一、GNU Radio官方FFT弊端

举一个简单的例子,我目前想要将正弦波信号源产生的信号连接 Throttle 限流器,再经过 FFT 和 IFFT,然后将信号送给示波器进行显示。
在这里插入图片描述
但是当前出现两个报错,提示长度不匹配,信号源端口为复数类型,端口 IO 大小为 8 字节,然而 FFT 长度为 1024,那么经过 FFT 和 IFFT 端口大小为 8*1024 = 8192 字节,因为 8 ≠ 8192 8\neq 8192 8=8192,所以出现了如下报错:
在这里插入图片描述

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

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

1、创建 OOT 模块

GNU Radio 附带 gr_modtool,这是一个用于创建树外 (OOT) 模块的软件工具。 OOT 模块可以被视为自定义 GNU Radio 块的集合。使用 gr_modtool 创建一个名为 myModule 的 OOT 模块:

gr_modtool newmod myModule 

创建目录 gr-customModule,其中包含 OOT 模块的所有骨架代码,但它还没有任何块。进入 gr-myModule 目录:

cd gr-myModule 

列出 OOT 模块中的所有文件和目录:

ls

在这里插入图片描述

2、创建 OOT 块

①、在 gr-myModule 目录下添加一个名为 Zadoff-Chu 的新块:

gr_modtool add tsfft

将显示块的类型:

GNU Radio module name identified: myModule
('sink', 'source', 'sync', 'decimator', 'interpolator', 'general', 'tagged_stream', 'hier', 'noblock')

②、FFT 模块作为标签流模块,因此这里将模块类型设置为 tagged_stream

Enter block type: tagged_stream

③、使用 C++ 代码实现

Language (python/cpp): cpp
Language: C++
Block/code identifier: tsfft

④、输入版权所有者的名称或组织:

Please specify the copyright holder: gnep

⑤、输入三个参数,分别是包长度(FFT 长度),长度标签,FFT 或 IFFT 选择

Enter valid argument list, including default arguments: 
int packet_len, const std::string& len_key, bool forward

⑥、选择是否需要 QA 代码:

Add Python QA code? [Y/n] n
Add C++ QA code? [Y/n] n

⑦、然后将创建或修改多个文件:

Adding file 'lib/tsfft_impl.h'...
Adding file 'lib/tsfft_impl.cc'...
Adding file 'include/myModule/tsfft.h'...
Editing swig/myModule_swig.i...
Adding file 'grc/myModule_tsfft.block.yml'...
Editing grc/CMakeLists.txt...

相关配置如下图:
在这里插入图片描述

3、修改 C++ 和 CMAKE 文件

修改 gr-myModule/lib/ 目录下的 tsfft_impl.cctsfft_impl.hCMakeLists.txt 文件以及 gr-myModule/grc/目录下 myModule_tsfft.block.yml 目录下的配置文件

lib/tsfft_impl.h 核心部分程序:

fftwf_plan d_fft_plan;
fftwf_complex* d_buffer;
int d_packet_len;
bool d_forward;

lib/tsfft_impl.cc 核心部分程序:

gr_complex* in = (gr_complex*)input_items[0];
gr_complex* out = (gr_complex*)output_items[0];

// Set output to one packet (defined with tagged stream)
noutput_items = ninput_items[0];

// Execute fft plan
memcpy(d_buffer, in, d_packet_len * sizeof(gr_complex));
fftwf_execute(d_fft_plan);
memcpy(out, d_buffer, d_packet_len * sizeof(gr_complex));

// Tell runtime system how many output items we produced.
return noutput_items;

lib/CMakeLists.txt 部分只需增添下面两行代码:

find_library(FFTW3F_LIB NAMES fftw3f PATHS /usr/lib/x86_64-linux-gnu)
target_link_libraries(gnuradio-myModule ${FFTW3F_LIB})

grc/myModule_tsfft.block.yml 部分核心配置:

parameters:
-   id: packet_len
    label: Packet length
    dtype: int
-   id: len_key
    label: Packet length key
    dtype: string
    default: ' "packet_len"'
-   id: forward
    label: Forward/Reverse
    dtype: enum
    options: ['True', 'False']
    option_labels: [Forward, Reverse]

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

4、编译及安装 OOT 块

1、该块需要编译和安装,确保目前位于 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

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

1、grc 图

创建一个简单的测试用例,一个频率为 1KHz 的正弦波信号源,将其转换为标签流,再经过 FFT 和 IFFT,最后喂给示波器显示,分别在接 FFT 和 IFFT 块前后分别放置示波器及频谱仪,观察是否一致。
在这里插入图片描述

2、运行结果

①、时域波形对比

在这里插入图片描述

②、频谱图对比

在这里插入图片描述
从上图可以看出,无论是时域图还是频域图,原始信号和经过 FFT 及 IFFT 信号一模一样,即原始信号经过 FFT 及 IFFT后可以复原,也可以证明我们所做的 FFT OOT 成功了

四、资源自取

链接:GNU Radio创建FFT、IFFT C++ OOT块
在这里插入图片描述


我的qq:2442391036,欢迎交流!


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

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

相关文章

opengauss概述-基础知识篇-备考华为高斯

目录 🧨考前准备: 🎡数据库操作语言 ✨OLTP和OLAP 🎯常用函数 🧲字符处理函数 关于 left 和 right 特别重点的字符串函数 🧲数字操作函数 关于 ceil 和 floor 🧲时间和日期处理函数 &#x1f9f…

karpathy Let‘s build GPT

1 introduction 按照karpathy的教程,一步步的完成transformer的构建,并在这个过程中,加深对transformer设计的理解。 karpathy推荐在进行网络设计的过程中,同时利用jupyter notebook进行快速测试和python进行主要的网络的构建。 …

安卓 app icon大小 安卓app界面尺寸大小

移动应用的界面设计画布尺寸设计多大(特别是Android)、图标和字体大小怎么定、需要设计多套设计稿么、如何切图以配合开发的实现? 本篇将结合iOS和android官方的设计规范、搜集的资料以及工作中的摸索,来分享移动应用界面设计中的…

《Fundamentals of Power Electronics》——基础交流建模方法

PWM整流器小信号交流模型建模的主要步骤为: (a)利用小纹波近似的动态版本,建立与电感和电容波形的低频平均值有关的方程; (b)平均方程的扰动和线性化; (c)交流等效电路模型的建立。 以下图buck-boost电路为例进行分析。 首先测…

分类规则挖掘(一)

目录 一、分类问题概述(一)分类规则挖掘(二)分类规则评估(三)分类规则应用 二、k-最近邻分类法 一、分类问题概述 动物分类:设有动物学家陪小朋友林中散步,若有动物突然从小朋友身边…

电路板/硬件---器件

电阻 电阻作用 电阻在电路中扮演着重要的角色,其作用包括: 限制电流:电阻通过阻碍电子流动的自由而限制电流。这是电阻最基本的功能之一。根据欧姆定律,电流与电阻成正比,电阻越大,通过电阻的电流就越小。…

【机器视觉】C# .NET 8 部署yolov9 onnx对象检测

这段代码展示了一个使用YOLOv9进行对象检测的简单测试框架。代码主体以及其功能分为以下几个关键部分: 创建测试图片数组 _testImages,它包含了图片文件名和对应的标签。使用 buildTests 方法来从给定的文件名中加载图片并调整尺寸,准备测试数…

Linux搭建sqlilabs靶场

提前准备: 文章中所使用到的Linux系统:Ubantu20.4sqlilabs靶场下载地址:GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based. 一. 安装phpstudy phpstudy安装命令:wget -O install.sh h…

【链表-双向链表】

链表-双向链表 1.链表的分类1.1 分类依据1.2 常用类型 2.双向链表的2.1 双向链表的结构2.2 双向链表的操作2.2.1 **初始化**2.2.2 **尾插**2.2.3 **头插**2.2.4 **尾删**2.2.5 **头删**2.2.6 在pos位置之后插入数据2.2.7 删除pos节点2.2.8 查找2.2.9 销毁 1.链表的分类 1.1 分…

Java如何获取当前日期和时间?

Java如何获取当前日期和时间? 本文将为您介绍 Java 中关于日期和时间获取的方法,以及介绍 Java 8 中获取日期和时间的全新API。 1、 System.currentTimeMillis() 获取标准时间可以使用 System.currentTimeMillis() 方法来获取,此方法优势是…

Qt与MySQL连接

QT连接Mysql数据库(详细成功版)-CSD N博客 我的MySQL是64位的,所以我的Qt的套件也需要是64位的 遇到的问题: (available drivers中已经有QMYSQL QMYSQL3,还是not loaded) QSqlDatabase: QMYS…

专项技能训练五《云计算网络技术与应用》实训7-1:安装mininet

文章目录 mininet安装1. 按6-1教程安装opendaylight控制器。2. 按6-2教程安装RYU控制器。3. 按5-1教程安装openvswitch虚拟交换机并开启服务。4. 将老师所给mininet安装包试用winSCP传送至电脑端。5. 安装net-tools。6. 安装mininet7. 安装完成后,使用命令建立拓扑&…

Jenkins集成Kubernetes 部署springboot项目

文章目录 准备部署的yml文件Harbor私服配置测试使用效果Jenkins远程调用参考文章 准备部署的yml文件 apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metada…

腾讯云IM即时通信引入(React Web端组件式)

开发环境要求 React ≥ v18.0 (17.x 版本不支持) TypeScript node(12.13.0 ≤ node 版本 ≤ 17.0.0, 推荐使用 Node.js 官方 LTS 版本 16.17.0) npm(版本请与 node 版本匹配) chat-uikit-react 集成 …

软件工程习题答案2024最新版

习题一答案 一、选择题 软件的主要特性是(A B C)。 A) **无形 **B) 高成本 C) **包括程序和文档 ** D) 可独立构成计算机系统 软件工程三要素是(B)。 A) 技术、方法和工具 B) 方法、工具和过程 C) 方法、对象和类 D) 过程、模型、方法 包含风险分析的软件工程模型是(A)…

算法设计与分析——期末1h

目录 第一章 算法的定义 算法的三要素 算法的基本性质 算法的时间复杂度数量级: 第二章 兔子繁殖问题(递推法) 猴子吃桃问题(递推法) 穿越沙漠问题(递推法(倒推)) 百钱百…

Linux基础之yum和vim

目录 一、软件包管理器yum 1.1 软件包的概念 1.2 软件包的查看 1.3 软件包的安装和删除 二、Linux编辑器之vim 2.1 vim的基本概念 2.2 正常模式(命令模式) 2.3 底行模式 2.4 输入模式 2.5 替换模式 2.6 视图模式 2.7 总结 一、软件包管理器yu…

基于springboot+vue+Mysql的幼儿园管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

【Flask 系统教程 5】视图进阶

类视图 在 Flask 中,除了使用函数视图外,你还可以使用类视图来处理请求。类视图提供了一种更为结构化和面向对象的方式来编写视图函数,使得代码组织更清晰,并且提供了更多的灵活性和可扩展性。 创建类视图 要创建一个类视图&am…

Reactor模型详解

目录 1.概述 2.Single Reactor 3.muduo库的Multiple Reactors模型如下 1.概述 维基百科对Reactor模型的解释 The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs.…