当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 一、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_lenlabel: Packet lengthdtype: int
-   id: len_keylabel: Packet length keydtype: stringdefault: ' "packet_len"'
-   id: forwardlabel: Forward/Reversedtype: enumoptions: ['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,欢迎交流!


相关文章:

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

文章目录 前言一、GNU Radio官方FFT弊端二、创建自定义的 C OOT 块1、创建 OOT 模块2、创建 OOT 块3、修改 C 和 CMAKE 文件4、编译及安装 OOT 块 三、测试1、grc 图2、运行结果①、时域波形对比②、频谱图对比 四、资源自取 前言 GNU Radio 自带的 FFT 模块使用起来不是很方便…...

125.两两交换链表中的节点(力扣)

题目描述 代码解决及思路 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), …...

APP精准推送广告是怎么做到的?

你有没有遇到这种情况,刚和家人聊起五一去哪玩,各种软件就刷到各地旅游景点。刚和朋友说到健身计划,转眼间网购平台就给你推荐各种健身用品,这些软件是如何知道我们的需求,难道我们的手机被监听了?从技术上…...

RapidJSON介绍

1.简介 RapidJSON 是一个 C 的 JSON 解析库,由腾讯开源。 支持 SAX 和 DOM 风格的 API,并且可以解析、生成和查询 JSON 数据。RapidJSON 快。它的性能可与strlen() 相比。可支持 SSE2/SSE4.2 加速。RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至…...

大型企业总分支多区域数据传输,效率为先还是安全为先?

大型企业为了业务拓展需要,会在全国乃至全球各地设立分公司和办事机构,以便更好地处理当地事务,并进行市场的开拓和客户维护,此时,企业内部就衍生出了新的业务需求,即多区域数据传输。 多区域很难准确定义&…...

C语言例题35、反向输出字符串(指针方式),例如:输入abcde,输出edcba

#include <stdio.h>void reverse(char *p) {int len 0;while (*p ! \0) { //取得字符串长度p;len;}while (len > 0) { //反向打印到终端printf("%c", *--p);len--;} }int main() {char s[255];printf("请输入一个字符串&#xff1a;");gets(s)…...

场景文本检测识别学习 day09(Swin Transformer论文精读)

Patch & Window 在Swin Transformer中&#xff0c;不同层级的窗口内部的补丁数量是固定的&#xff0c;补丁内部的像素数量也是固定的&#xff0c;如上图的红色框就是不同的窗口&#xff08;Window&#xff09;&#xff0c;窗口内部的灰色框就是补丁&#xff08;Patch&#…...

抖音小店个人店和个体店有什么不同?区别问题,新手必须了解!

哈喽~我是电商月月 新手开抖音小店入驻时会发现&#xff0c;选择入驻形式时有三个选择&#xff0c;个人店&#xff0c;个体店和企业店 其中&#xff0c;个人店和个体店只差了一个字&#xff0c;但个人店不需要营业执照&#xff0c;是不是入驻时选择个人店会更好一点呢&#x…...

动态规划入门和应用示例

文章目录 前言斐波那契数列爬楼梯总结优点&#xff1a;缺点&#xff1a; 前言 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是运筹学的一个分支&#xff0c;是求解决策过程最优化的数学方法。它主要用于解决一类具有重叠子问题和最优子结构性质的问题。…...

【C语言】精品练习题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目九&#xff1a; 题目十&#xff1a; 题目十一&#xff1a; 题目十二&#xff1a; 题目十…...

数据库(MySQL)—— DML语句

数据库&#xff08;MySQL&#xff09;—— DML语句 什么是DML语句添加数据给全部字段添加数据批量添加数据 修改数据删除数据 什么是DML语句 在MySQL中&#xff0c;DML&#xff08;Data Manipulation Language&#xff0c;数据操纵语言&#xff09;语句主要用于对数据库中的数…...

【最大公约数 并集查找 调和级数】1998. 数组的最大公因数排序

本文涉及知识点 最大公约数 并集查找 调和级数 LeetCode1998. 数组的最大公因数排序 给你一个整数数组 nums &#xff0c;你可以在 nums 上执行下述操作 任意次 &#xff1a; 如果 gcd(nums[i], nums[j]) > 1 &#xff0c;交换 nums[i] 和 nums[j] 的位置。其中 gcd(nums…...

iOS实现一个高性能的跑马灯

效果图 该跑马灯完全通过CATextLayer 实现&#xff0c;轻量级&#xff0c;并且通过 系统的位移动画实现滚动效果&#xff0c;避免了使用displaylink造成的性能瓶颈&#xff0c;使用系统动画&#xff0c;系统自动做了很多性能优化&#xff0c;实现更好的性能&#xff0c;并使用…...

MySQL的视图、存储过程、触发器

视图 介绍 视图是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。通俗的讲&#xff0c;视图只保存了查询的SQL逻辑&#xff0c;不保存查询结果。所以我们在创建视图的时…...

【图像特征点匹配】

图像特征点匹配 图像特征点匹配是计算机视觉中的一项关键技术,它涉及在两个或多个图像之间寻找并匹配具有独特属性的点,这些点被称为特征点。 立体视觉:通过匹配同一场景的不同视角图像中的特征点,可以重建场景的三维结构。物体识别:通过匹配物体表面的特征点,可以识别和…...

GZIPOutputStream JSON压缩

一、背景 小王瞥了一眼历史记录表&#xff0c;不禁惊呼&#xff1a;“这表怎么这么大&#xff1f;”同事们闻声纷纷围拢过来查看。仔细一瞧&#xff0c;发现这个表的大小竟然超过了3G。主管随即指示小王打开相应的表数据检查&#xff0c;发现其中存储了用户的权限信息&#xf…...

毫米波雷达原理(含代码)(含ARS548 4D毫米波雷达数据demo和可视化视频)

毫米波雷达原理 1. 传统毫米波雷达1.1 雷达工作原理1.2 单目标距离估计1.3 单目标速度估计1.4 单目标角度估计1.5 多目标距离估计1.6 多目标速度估计1.7多目标角度估计1.7 总结 3. FMCW雷达数据处理算法4. 毫米波雷达的目标解析(含python代码)5. ARS548 4D毫米波雷达数据demo(含…...

3.1 Gateway之路由请求和转发

1.依赖坐标 <!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--服务注册和发现--><dependency><groupId>com.alibab…...

人脸识别开源算法库和开源数据库

目录 1. 人脸识别开源算法库 1.1 OpenCV人脸识别模块 1.2 Dlib人脸识别模块 1.3 SeetaFace6 1.4 DeepFace 1.5 InsightFace 2. 人脸识别开源数据库 2.1 CelebA 2.2 LFW 2.3 MegaFace 2.4 Glint360K 2.5 WebFace260M 人脸识别 (Face Recognition) 是一种基于人的面部…...

Excel 中用于在一个范围中查找特定的值,并返回同一行中指定列的值 顺序不一样 可以处理吗

一、需求 Excel 中&#xff0c;在一列&#xff08;某范围内&#xff09;查找另一列特定的值&#xff0c;并返回同一行中另一指定列的值&#xff0c; 查找列和返回列的顺序不一样 二、 实现 1、下面是一个使用 INDEX 和 MATCH 函数的例子&#xff1a; 假设你有以下数据&…...

病床前尽孝心,脊柱 “被折得濒临损伤”!

长期弯腰照顾卧床病人、喂饭、翻身、擦洗&#xff0c;颈腰椎损伤风险显著。弯腰时腰椎弯曲角度过大&#xff0c;椎间盘承受压力剧增&#xff1b;反复弯腰起身照顾病人&#xff0c;肌肉与椎间盘反复冲击&#xff1b;低头专注护理时&#xff0c;颈椎前伸与腰椎受力形成双重负担。…...

无人机海上搜救数据集 海上搜救人员识别 违规游泳识别 无人艇自主导航数据集 海洋安全监控及水上救援预警等场景 深度学习yolo格式地10625期

海洋目标检测数据集 README 项目概述 本数据集聚焦于海洋场景下的目标识别与安全监测任务&#xff0c;为海上搜救、智能无人艇导航及海洋环境监控等领域提供高质量标注数据&#xff0c;助力海洋视觉感知技术的落地应用。核心数据信息维度内容数据类别共5类&#xff1a;船只、浮…...

别再手动算了!用Matlab RF Toolbox一键搞定S/Z/Y/ABCD参数转换(附3dB电桥实例代码)

射频工程师的救星&#xff1a;Matlab RF Toolbox参数转换全攻略 每次面对S/Z/Y/ABCD参数的手动转换&#xff0c;是不是总有种想摔计算器的冲动&#xff1f;那些复杂的矩阵运算和容易出错的推导过程&#xff0c;简直是在浪费生命。作为一名射频工程师&#xff0c;我深知这种痛苦…...

给SAP财务新人的年结实操笔记:从FAGLGVTR总账结转到F.07往来结转,一次讲清

SAP财务年结实战指南&#xff1a;从总账到往来的完整逻辑解析 刚接触SAP财务模块的新人面对年结时&#xff0c;往往会被一连串的事务代码和操作步骤弄得晕头转向。FAGLGVTR、AJRW、F.07这些看似冰冷的代码背后&#xff0c;其实蕴含着清晰的财务逻辑。本文将带你穿透操作表象&am…...

CAN FD通信中,如何用AUTOSAR配置搞定TDC和SSP?一个80% Offset的实战案例

CAN FD通信中AUTOSAR配置实战&#xff1a;TDC与SSP的80% Offset实现 在汽车电子领域&#xff0c;CAN FD&#xff08;Controller Area Network Flexible Data-rate&#xff09;正逐步取代传统CAN总线&#xff0c;成为车载网络的主流选择。随着数据传输速率提升至2Mbps甚至更高&a…...

影刀经验库共建:5个岗位提效的RPA模板分享

影刀RPA岗位提效模板分享影刀RPA&#xff08;机器人流程自动化&#xff09;能够显著提升企业运营效率&#xff0c;尤其在重复性高、规则明确的任务中表现突出。以下是5个适用于不同岗位的RPA模板&#xff0c;帮助团队快速实现自动化提效。财务岗位&#xff1a;自动化发票处理通…...

SenseVoice-small语音识别效果惊艳:中英混杂技术文档语音精准分段转写

SenseVoice-small语音识别效果惊艳&#xff1a;中英混杂技术文档语音精准分段转写 1. 引言&#xff1a;当技术文档遇上中英混杂的语音 想象一下这个场景&#xff1a;你正在参加一场技术分享会&#xff0c;台上的专家用流利的中文讲解&#xff0c;但时不时会蹦出几个英文专业术…...

Ollama一键部署translategemma-27b-it:图文翻译模型在国产统信UOS验证通过

Ollama一键部署translategemma-27b-it&#xff1a;图文翻译模型在国产统信UOS验证通过 1. 开篇&#xff1a;当翻译遇上图文对话 想象一下&#xff0c;你拿到一份产品说明书&#xff0c;上面有中文文字和复杂的图表。你需要把它翻译成英文&#xff0c;但传统的翻译工具只能处理…...

AI Agent驱动业务规则测试:从复杂逻辑到精准用例的自动化实践

1. AI Agent如何重塑业务规则测试 第一次接触AI Agent驱动的测试用例生成时&#xff0c;我正被一个保险理赔系统的测试工作折磨得焦头烂额。那套系统里有上百条复杂的业务规则&#xff0c;光是理解"投保人年龄超过60岁且保单满5年但未达10年时&#xff0c;赔付比例调整为8…...

Qwen3-TTS声音克隆入门指南:上传音频→选择语种→生成自然语音三步走

Qwen3-TTS声音克隆入门指南&#xff1a;上传音频→选择语种→生成自然语音三步走 想不想让AI用你自己的声音说话&#xff1f;或者&#xff0c;想不想用一段短短的录音&#xff0c;就克隆出能说十几种语言的“数字分身”&#xff1f;今天&#xff0c;我们就来手把手教你&#x…...