解决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.hqwc.cn/news/579237.html

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

相关文章

定义类强化——定义Goods类表示商品

现需要编写一个计算商品总价值的程序&#xff0c;现要求&#xff1a; 1、定义一个表示商品的类&#xff1a;Goods&#xff0c;Goods类要包含&#xff1a; 一个私有成员变量String name表示商品的名称&#xff1b;一个私有成员变量float price表示商品的价格&#xff0c;并定义…

微服务(基础篇-007-RabbitMQ部署指南)

目录 05-RabbitMQ快速入门--介绍和安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p65&vd_source60a35a11f813c6dff0b76089e5e138cc 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.集群部署 2.1.集群分类 2.2.设置网络 视频地址&#xff1a; 05-Rab…

解析商业电子邮件泄露:深度剖析攻击的含义

本文的第1部分清楚地介绍了什么是商业电子邮件泄露&#xff08;BEC&#xff09;&#xff0c;检测它的方法&#xff0c;以及如何防御。商业电子邮件泄露第2部分&#xff1a;攻击的含义将讨论BEC事件是如何发生的&#xff1f;如果你不够小心&#xff0c;BEC会在很多方面对你的业务…

【力扣hot100】两数之和、字母异位词分组

【1】两数之和 public class TwoNumAddiction {public static void main(String[] args) {int[] nums {3,3};int target 6;int[] indexArr new SolutionNumAddiction().twoSum(nums, target);for (int index : indexArr) {System.out.println(index);}} }class SolutionNumA…

最优算法100例之13-输出第n个丑数

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当…

国内好用的chatGPT和AI绘图工具

分享一个比较好用的AI 分享一个比较好用的AI&#xff0c;只是需要开通会员&#xff0c;目前官网的价格是&#xff1a;298&#xff0c;开通之后可以使用chatgpt4、AI绘画、图片融合等等&#xff01;不开通的话是可以免费使用15次的&#xff0c;下面是一些介绍图片&#xff01;链…

2013年认证杯SPSSPRO杯数学建模B题(第一阶段)流行音乐发展简史全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 B题 流行音乐发展简史 原题再现&#xff1a; 随着互联网的发展&#xff0c;流行音乐的主要传播媒介从传统的电台和唱片逐渐过渡到网络下载和网络电台等。网络电台需要根据收听者的已知喜好&#xff0c;自动推荐并播放其它音乐。由于每个人喜好…

MySQl on和where条件的区别?

MySQ L on和where条件的区别&#xff1f; on会生成临时表&#xff0c;不满足条件会置空 where 过滤数据&#xff0c;不满足的数据不会显示

HTTP 与 HTTPS 的区别

基本概念 HTTP&#xff08;HyperText Transfer Protocol&#xff1a;超文本传输协议&#xff09;是一种应用层协议&#xff0c;主要用于在网络上进行信息的传递&#xff0c;特别是用于Web浏览器和服务器之间的通信。 它使用明文方式发送数据&#xff0c;这意味着传输的内容可…

好用还平价的挂耳式耳机有哪些?五款超平价品牌测评推荐

在数字化时代&#xff0c;耳机已经成为我们日常生活中不可或缺的一部分。而开放式耳机作为一种新兴趋势&#xff0c;以其独有的开放性设计和卓越的音质表现&#xff0c;正在悄然改变着人们的听音习惯。不同于传统的耳机产品&#xff0c;开放式耳机让音乐与外界环境相得益彰&…

mysql进阶知识总结

1.存储引擎 1.1MySQL体系结构 1).连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xff0c;为通过认证…

Python爬虫:requests模块的基本使用

学习目标&#xff1a; 了解 requests模块的介绍掌握 requests的基本使用掌握 response常见的属性掌握 requests.text和content的区别掌握 解决网页的解码问题掌握 requests模块发送带headers的请求掌握 requests模块发送带参数的get请求 1 为什么要重点学习requests模块&…