解决GNU Radio+USRP实现OFDM收发在接收端QPSK星座图映射无“抖动”问题

文章目录

  • 前言
  • 一、遇到的问题
  • 二、解决方案
  • 三、重新编译安装
  • 四、验证
  • 五、资源自取


前言

本文记录在 GNU Radio+USRP 实现 OFDM 收发时,在接收端 QPSK 星座图映射无“抖动”问题的解决方法,


一、遇到的问题

我遇到的问题是,现在搭建的 OFDM 模型在接收端做信道均衡时,接收端的 QPSK 星座图映射在有噪声的情形下并没有出现 “抖动” 现象。如下图所示,可以看到 OFDM 头和负载的 BSPK 和 QPSK 都是比较规则的。
在这里插入图片描述
经过初步的分析,问题应当是出在了接收端的 “信道均衡模块” (OFDM Frame Equalizer Module), 这个模块不仅仅进行了信道估计和信道均衡,同时进行了最小距离分析并把含有噪声的点强行 “拉回” 星座图上的标准映射点。这个与我们一般意义下理解的“信道均衡” 是不同的,一般不会“拉回去” 。所以,现在的任务就是找出与 equalizer 相关的 .h 和 .cc 文件,阅读源代码,并对源代码进行修改。

二、解决方案

在 gnuradio/gr-digital/include/gnuradio/digital/ 文件夹下找到了所有与 equalizer 有关的 .h 文件
在 gnuradio/gr-digital/lib/ 文件夹下找到了所有上述.h 文件对应的.cc 源文件

最后直接定位到 ofdm_equalizer_simpledfe.cc

其源文件完整源码如下:

/* -*- c++ -*- */
/* Copyright 2012 Free Software Foundation, Inc.** This file is part of GNU Radio** GNU Radio is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 3, or (at your option)* any later version.** GNU Radio is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with GNU Radio; see the file COPYING.  If not, write to* the Free Software Foundation, Inc., 51 Franklin Street,* Boston, MA 02110-1301, USA.*/#ifdef HAVE_CONFIG_H
#include "config.h"
#endif#include <gnuradio/digital/ofdm_equalizer_simpledfe.h>namespace gr {
namespace digital {ofdm_equalizer_simpledfe::sptr
ofdm_equalizer_simpledfe::make(int fft_len,const gr::digital::constellation_sptr& constellation,const std::vector<std::vector<int>>& occupied_carriers,const std::vector<std::vector<int>>& pilot_carriers,const std::vector<std::vector<gr_complex>>& pilot_symbols,int symbols_skipped,float alpha,bool input_is_shifted)
{return ofdm_equalizer_simpledfe::sptr(new ofdm_equalizer_simpledfe(fft_len,constellation,occupied_carriers,pilot_carriers,pilot_symbols,symbols_skipped,alpha,input_is_shifted));
}ofdm_equalizer_simpledfe::ofdm_equalizer_simpledfe(int fft_len,const gr::digital::constellation_sptr& constellation,const std::vector<std::vector<int>>& occupied_carriers,const std::vector<std::vector<int>>& pilot_carriers,const std::vector<std::vector<gr_complex>>& pilot_symbols,int symbols_skipped,float alpha,bool input_is_shifted): ofdm_equalizer_1d_pilots(fft_len,occupied_carriers,pilot_carriers,pilot_symbols,symbols_skipped,input_is_shifted),d_constellation(constellation),d_alpha(alpha)
{
}ofdm_equalizer_simpledfe::~ofdm_equalizer_simpledfe() {}void ofdm_equalizer_simpledfe::equalize(gr_complex* frame,int n_sym,const std::vector<gr_complex>& initial_taps,const std::vector<tag_t>& tags)
{if (!initial_taps.empty()) {d_channel_state = initial_taps;}gr_complex sym_eq, sym_est;for (int i = 0; i < n_sym; i++) {for (int k = 0; k < d_fft_len; k++) {if (!d_occupied_carriers[k]) {continue;}if (!d_pilot_carriers.empty() && d_pilot_carriers[d_pilot_carr_set][k]) {d_channel_state[k] = d_alpha * d_channel_state[k] +(1 - d_alpha) * frame[i * d_fft_len + k] /d_pilot_symbols[d_pilot_carr_set][k];frame[i * d_fft_len + k] = d_pilot_symbols[d_pilot_carr_set][k];} else {sym_eq = frame[i * d_fft_len + k] / d_channel_state[k];// The `map_to_points` function will treat `sym_est` as an array// pointer.  This call is "safe" because `map_to_points` is limited// by the dimensionality of the constellation. This class calls the// `constellation` class default constructor, which initializes the// dimensionality value to `1`. Thus, Only the single `gr_complex`// value will be dereferenced.d_constellation->map_to_points(d_constellation->decision_maker(&sym_eq),&sym_est);d_channel_state[k] = d_alpha * d_channel_state[k] +(1 - d_alpha) * frame[i * d_fft_len + k] / sym_est;frame[i * d_fft_len + k] = sym_est;}}if (!d_pilot_carriers.empty()) {d_pilot_carr_set = (d_pilot_carr_set + 1) % d_pilot_carriers.size();}}
}} /* namespace digital */
} /* namespace gr */

我们需要对其进行修改,有关其修改内容及解决办法已放到文末,有需求的通信爱好者可以自取。

三、重新编译安装

首先进入安装的时候的 gnuradio 文件夹下,之后进入 build 文件夹下,在这个文件夹下开启 terminal
之后在 terminal 中输入下面命令:

cd workarea/gnuradio/buildcmake -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=/usr/bin/python3 ../
make -j4 
sudo make install
sudo ldconfig

四、验证

打开 OFDM 工程,运行可以看到下面界面:

1、发端效果图:
在这里插入图片描述

2、收端效果图
在这里插入图片描述
可以看到目前属于正常的状态

五、资源自取

链接:解决GNU Radio+USRP实现OFDM收发在接收端QPSK星座图映射无“抖动”问题
在这里插入图片描述


我的qq:2442391036,欢迎交流!


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

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

相关文章

E5063A是德科技E5063A网络分析仪

181/2461/8938产品概述&#xff1a; Keysight E5063A 是一款低成本网络分析仪&#xff0c;可为测试天线、电缆、滤波器和 PCB 等简单无源元件提供优化的性能和功能。Keysight E5063A 为您的企业提供价格和性能之间的最佳平衡&#xff0c;以满足您的业务和技术要求。它利用行业…

安装和使用 Oracle Database 23c 容器鏡像

Oracle Database 23c 是 Oracle 最新的数据库版本&#xff0c;它带来了许多新特性和性能改进。 对于开发者来说&#xff0c;Oracle 提供了一个免费的开发者版&#xff0c; 可以通过 Docker 容器轻松安装和使用。以下是详细的安装和使用指南。 安装 Docker 在开始之前&#xff0…

2024 年多链代币开发对您的业务有何好处

2024 年&#xff0c;多链代币开发将成为寻求增强数字化影响力并释放区块链领域新机遇的企业的关键战略。通过利用多个区块链&#xff0c;公司可以显着提高其代币的可扩展性、互操作性和安全性。这种方法不仅提高了交易速度并降低了费用&#xff0c;还使企业能够利用更广泛的用户…

深度学习入门简单实现一个神经网络

实现一个三层神经网络 引言测试数据 代码 引言 今天我们实现一个简单的神经网络 俩个输入神经元 隐藏层两个神经元 一个输出神经元 激活函数我们使用sigmoid 优化方法使用梯度下降 我们前期准备是需要把这些神经元的关系理清楚 x1&#xff1a;第一个输入 x2&#xff1a;第二个…

C#手术麻醉系统源码 大型医院手麻系统4大需求是什么?

C#手术麻醉系统源码 大型医院手麻系统4大需求是什么&#xff1f; 手术麻醉临床信息系统有着完善的临床业务功能&#xff0c;能够涵盖整个围术期的工作&#xff0c;能够采集、汇总、存储、处理、展 现所有的临床诊疗资料。通过该系统的实施&#xff0c;能够规范手麻科的工作流程…

Matlab-写入mhd和raw医学图像处理格式文件

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 mhd和raw是什么&#xff1f; MHD&#xff08;MetaImage&#xff09;和RAW&#xff08;Raw Image Data&#xff09;是用于医学图像…

【测试工具】JMeter接口测试的简单使用

事先声明&#xff1a;博主的JMeter是3.3版本的&#xff0c;可能和最新版本的操作有些许差别 测试前的准备工作 1、先添加一个线程组&#xff1a;右击“测试计划”&#xff0c;点击“添加”—》“Threads(Users)”—》“线程组” 2、再添加一个HTTP请求&#xff0c;右击“线程…

基于Hive大数据分析springboot为后端以及vue为前端的的民宿系

标题基于Hive大数据分析springboot为后端以及vue为前端的的民宿系 本文介绍了如何利用Hive进行大数据分析,并结合Spring Boot和Vue构建了一个民宿管理系统。该民民宿管理系统包含用户和管理员登陆注册的功能,发布下架酒店信息,模糊搜索,酒店详情信息展示,收藏以及对收藏的…

Pillow教程03:图像处理的基本步骤+分离split+合并merge+混合blend+composite遮罩

--------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁剪…

烫烫烫手的结构体大小计算来咯,很烫哦,慢慢消化。自定义类型(一)

emmm&#xff0c;在这炎热的夏天在宿舍吹着空调写着博客也是一件不错的事呢&#xff0c;今天就来来好好盘一下C语言中的自定义类型。 常常会回顾努力的自己&#xff0c;所以要给自己的努力留下足迹。 为今天努力的自己打个卡&#xff0c;留个痕迹吧 2024.03.29 小闭 目录 …

C++项目——集群聊天服务器项目(九)客户端异常退出业务

服务器端应检测到客户端是否异常退出&#xff0c;因此本节来实现客户端异常退出&#xff0c;项目流程见后文 一、客户端异常退出业务流程 &#xff08;1&#xff09;在业务模块定义处理客户端异常退出的函数 &#xff08;2&#xff09;集群聊天服务器项目(八&#xff09;提到…

为什么在Python中总是使用【字典】这种类型呢?

你好&#xff0c;我是安然无虞。 文章目录 创建字典新增字典元素update 方法 删除字典元素pop 方法popitem 方法 查找字典元素in 和 in not 操作符get 方法thisdict[key] 修改字典元素遍历字典元素for循环遍历keys方法values方法items方法 合并字典字典中的key 字典常用接口汇…

网际协议 - IP

文章目录 目录 文章目录 前言 1 . 网际协议IP 1.1 网络层和数据链路层的关系 2. IP基础知识 2.1 什么是IP地址? 2.2 路由控制 3. IP地址基础知识 3.1 IP地址定义 3.2 IP地址组成 3.3 IP地址分类 3.4 子网掩码 IP地址分类导致浪费? 子网与子网掩码 3.5 CIDR与…

自己动手用ESP32手搓一个智能机器人:ESP32-CAM AI Robot

目录 介绍 硬件需求 软件需求 步骤 总结 源码下载 介绍 ESP32-CAM是一款集成了Wi-Fi和蓝牙功能的微控制器模块&#xff0c;同时还集成了摄像头接口&#xff0c;使其成为一个非常适合构建智能机器人的选择。在本项目中&#xff0c;我将向您展示如何使用ESP32-CAM模块构建…

数据运营分析-详解

一、指标与指标体系 指标体系就是业务逻辑的框架,也是思考业务逻辑的第一步 案例: 老板,我负责的用户活跃,主要考察每天启动产品的注册用户数量,整体来看,每月活跃保持7.3%的增长,是因为渠道团队的拉新活动带来很多新增注册用户,占每月活跃用户的40%,新一年会继续沿…

消息队列的七种经典应用场景

在笔者心中&#xff0c;消息队列&#xff0c;缓存&#xff0c;分库分表是高并发解决方案三剑客。 在职业生涯中&#xff0c;笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章&#xff0c;笔者结合自己的真实经历&#xff0c;和大家分享…

Linux项目自动化构建工具-make/ makefile及其应用:多文件编写第一个linux程序:进度条(懒人学习必备博文!!!)

目录 1.前言--make/makefile的引入 2.快速上手make/makefile---自动化构建 3.关于依赖关系和依赖方法 4.自动化清理 为什么我们执行编译的时候&#xff0c;make一下就好&#xff0c;清理却要使用make clean? 5. make/makefile是如何知道当前目录下可执行文件是否为最新 6.文件…

express实现用户登录和注册接口

目录 1 创建数据库2 连接数据库3 集成ORM库4 创建业务逻辑5 创建路由7 测试接口总结 我们在编写后端接口的时候操作数据库是一种常见的功能需求&#xff0c;express本身并不提供直接操作数据库的能力&#xff0c;需要借助第三方库来操作数据库&#xff0c;本篇讲解一下软件开发…

【二叉树】Leetcode 543. 二叉树的直径【简单】

二叉树的直径 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例1&#xff1a; 输入&#xff1a;root [1,2…

基于SpringBoot + Vue实现的在线装修管理系统设计与实现+毕业论文

介绍 系统包含用户、装修队、管理员三个角色 管理员&#xff1a; 管理员管理&#xff1a;管理其他管理员的账号和权限&#xff0c;确保系统管理的层次化和安全性。 装修队管理&#xff1a;审核装修队的资质&#xff0c;管理装修队的人员信息&#xff0c;监控工程进度&#xff…