关于 GNURadio-OFDM 运行时掉帧问题的解决

2023-05-16

最近在运行 GNURadio 中的 OFDM 例程时发现了丢帧的问题。

2022.08.01更新:

1、突然又想起了这个问题,今年年初的时候与西电的一个师兄又重新讨论了这个问题,有了更深一步的理解,这里记录一下:其实这个掉帧的问题本质上还是前一步的 同步 没有做好导致的,源码里用的同步算法官网也就是同步算法不行,要想彻底解决这个问题可以换一个更鲁棒的同步算法试试。

2、下面的解释其实可以理解为:在同步效果不好的前提下掉帧的原理,以及这种情况下如何避免掉帧。这个方法虽然可以在一定程度上解决掉帧问题,但是在同步性能极差的情况下也是无能为力的。所以仅供参考哈~

使用的 gnuradio 是 3.8 版本的,Ubuntu为20.04,而且至少目前来说 gnuradio 3.9 也存在这个问题,下面是问题原因及解决方法。

当使用原始的例程(一次发送10帧960个字节的数据)进行测试时还没有丢帧现象出现,但当我们把要发送的数据换成图片数据进行发送时却无法进行正确的接收,即使是在仿真中将信道条件改为理想无噪无畸变信道时也仍然会在同一位置丢同样数量的数据帧。

在调试中发现,当定时信息的两个触发信号之间的间隔一般有 4 种情况,分别为958、959、960、961。但是只有当差为958(一个完整 OFDM 数据帧为960个 QPSK 数据)时才会出现丢帧现象,其他都没问题,而 958与正常的 960差了两个 QPSK 数据。另外,用于定时的触发信号的产生是正常的,问题应该就出在触发信号产生后使用该触发信号的模块中

在重新分析了例程中数据发送及解析的流程后,觉得可能是 Header/Payload Demux 模块源码中的问题,因此就看了下该模块的源码。

图 1

源码流程及问题所在:

总的来说,丢帧的原因就是相邻两个定时信号的间隔过短时,导致当前帧提取数据时将后一个帧数据的定时信号作为当前帧的数据一并读入,这样就丢失了下一帧数据的定时信号,因此就造成了丢帧的现象。这种现象是源码中固有的问题。具体分析如下:

图 2 中数据与触发信号是严格执行对应位置的并行传输关系,Header/Payload Demux 模块先读取 trigger 信号,当读到值为 1 时就被认为是一帧数据的开始,这时就从数据信号的相应位置开始往后提取 1919 个数据作为当前帧的数据进行输出。

图 2

根据源码的数据处理过程,源码中每次接收到定时信号后,都会提取紧跟着该定时信号后面的959个数据作为当前帧进行输出,因此这对定时信号的精确型提出了很高的要求,如果相邻两个定时信号的间隔出现了小于正常数据帧长度的偏差,比如正常间隔为 960,如果此时出现了间隔为 958 的间隔,如图 3,则在提取后续 959个数据的时候就会正好把下一帧的定时信号当作当前帧的数据一起读入,这样就丢失了下一帧数据的定时信号,因此就造成了丢帧的现象。

图 3

解决这个问题的方法就是在源码中进行修改,在保证相邻定时信号不想相互干扰的基础上再重新进行源码的编译安装。需要修改的源码部分为 gr-digital/lib/header_payload_demux_impl.cc 以及 gr-digital/lib/header_payload_demux_impl.h 。首先在 header_payload_demux_impl.h 中添加变量:

int d_next_trigger_offset;

 然后在 header_payload_demux_impl.cc 中更改 find_trigger_signal 函数如下:

......
    int trigger_nums = 0;
    if (max_rel_offset < skip_items) {
        return rel_offset;
    }
    if (in_trigger) {
        for (int i = skip_items; i < max_rel_offset; i++) {
            if (in_trigger[i]) {
                trigger_nums++;
                // record location of the first trigger
                if(trigger_nums == 1) {
                    rel_offset = i;
                }
                // If there is a second trigger signal,record offset of between the first and second trigger
                else if (trigger_nums == 2) {
                    d_next_trigger_offset = i - rel_offset;
                    break;
                }
            }
        }
    }
......

然后修改 general_work() 中的 case STATE_PAYLOAD 状态中的 consume 过程如下:

。。。。。。
            // Calculate whether the current frame consumes the trigger signal of the next frame data
            // If yes, then make corrections
            int consume_compensation = 0;
            int consume_nums = 0;
            // Calculate total consumption
            consume_nums = (d_curr_payload_len + d_header_len) * (d_items_per_symbol + d_gi) + 
                            d_header_padding_total_items + 
                            d_curr_payload_offset - 
                            items_padding ;
            // make a decision
            if(d_next_trigger_offset <= consume_nums) {
                consume_compensation = consume_nums - d_next_trigger_offset + 1;
            }
            else {
                consume_compensation = 0;
            }
            // add the corrections
            const int items_to_consume =
                d_curr_payload_len * (d_items_per_symbol + d_gi) - items_padding - consume_compensation;
。。。。。。

修改后从新对源码进行编译安装,问题解决~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 GNURadio-OFDM 运行时掉帧问题的解决 的相关文章

随机推荐

  • 视频编解码行业及发展方向简述

    目录 一 视频行业1 视频是一个方兴未艾的大产业2 视频行业潜在商机大 人才缺口大3 了解华为海思的HI3518E方案 二 海思方案项目用到的硬件平台介绍1 本专栏文章使用的开发板配置2 处理器为什么选HI3518E 三 本专栏文章规划和核
  • 全面认识海思SDK及嵌入式层开发(1)

    目录 一 全面认识和检测配套开发套装1 套装配件介绍2 检测开发板3 注意 二 视频设备开发的技术流1 视频从产生到被消费的整个流程2 视频行业的商业角度分段3 几个疑问点 一 全面认识和检测配套开发套装 购买方式 xff1a 淘宝搜索 g
  • 嵌入式linux开发环境搭建(VMware16.0.0+Ubuntu16.04.3_X64)

    目录 一 安装VMware1 VMware介绍2 安装VMware16 0 0 二 安装ubuntu16 04 3 LTS1 Ubuntu介绍2 下载安装包iso3 安装 四 新安装Ubuntu的基本设置1 开机和关机等2 虚拟机基本设置3
  • 全面认识海思SDK及嵌入式层开发(2)

    目录 一 HI3518E方案系统整体架构介绍1 硬件上2 软件上 二 海思SDK的整体介绍三 海思SDK包的学习和实验1 2篇相关文档2 SDK包复制到linux原生目录中并解压3 SDK包操作的脚本程序研究4 SDK中源码包部分的配置编译
  • 计算机视觉之相机模型

    目录 一 相机模型1 相机与图像2 坐标系3 世界坐标系到摄像机坐标系4 摄像机坐标系到图像物理坐标系5 图像物理坐标系到图像像素坐标系6 摄像机坐标系到图像像素坐标系7 世界坐标系到图像像素坐标系 二 镜头畸变1 相机成像原理2 镜头畸变
  • vscode安装插件失败,完美解决

    vscode安装插件一直失败 xff0c 解决方案如下 访问vscode插件官网https marketplace visualstudio com vscode xff0c 搜索你要的插件点击插件详情 Version History 下载
  • ROS的topic通信机制

    1 通信步骤如图 xff1a 2 步骤介绍 第 xff08 0 xff09 步 xff1a talker gt master 发布者talker向mater注册 xff1a 包括节点的信息 需要发布的话题名等 xff0c 然后节点管理器RO
  • 关于快速幂和矩阵快速幂

    快速幂 xff1a 可参考该链接百科快速幂也可以参考这个博客快速幂博客 给出快速幂的题目和代码 xff1a 快速幂 取余计算 include lt iostream gt include lt string h gt using names
  • C/C++ 文件操作基础

    目录 1 文件分类 2 文件的打开与关闭 3 顺序读写文件 4 随机读写文件 5 其他与文件相关的操作 最近看 GNU Radio 源码看到了文件操作的部分 xff0c 因此记录下学习 C 43 43 C 操作文件的过程 本文的文件操作是
  • npm的装包原理

    原文 xff1a npm安装包原理 前言 xff1a 提起npm xff0c 大家第一个想到的应该就是 npm install 了 xff0c 但是 npm install 之后生成的 node modules大家有观察过吗 xff1f p
  • 02基于freertos实现串口通讯

    文章目录 一 操作步骤1 任务创建API2 步骤 二 代码 一 操作步骤 1 任务创建API 动态创建任务xTaskCreate 静态创建任务xTaskCreateStatic 任务句柄 xff1a 任务句柄就是一个指针 xff0c 指向任
  • windows中freeRTOS模拟器环境搭建

    windows中的freeRTOS使用 FreeRTOS参考手册中的模拟程序都是基于windows版本的模拟器 因此为了学习FreeRTOS xff0c 需要在Windows中搭建一下模拟器的运行环境 网络上的一般都是直接跑一下FreeRT
  • Xavier NX+4路Cameralink图像处理卡

    Xavier NX 43 4路Cameralink图像处理卡 M D CAP是天津雷航光电科技有限公司推出的一款复合加速计算平台 xff0c 由 NVidia GPU 和 Xilinx FPGA 通过PCIE 互联而成的高性能计算平台 其中
  • Xavier NX+KU040图像处理卡

    Xavier NX 43 KU040图像处理卡 CS NX21T是天津雷航光电科技有限公司推出的一款复合加速计算平台 xff0c 由 NVidia GPU 和 Xilinx FPGA 通过PCIE 互联而成的高性能计算平台 其中 FPGA
  • js使用input上传文件夹、拖拽上传文件夹并将文件夹结构展示为树形结构

    一 实现效果 左侧区域支持选择一个系统中的文件夹 xff0c 或者将文件夹拖拽到这个区域进行上传 xff0c 右侧区域可以将文件夹的结构展示为树形结构 二 代码实现 由于需要使用树形插件zTree xff0c 这个插件是依赖于jquery的
  • 傅里叶描述子、HOG特征描述子原理及matlab代码

    一 傅里叶描述子 傅里叶描述子的作用是用来描述图像的轮廓信息 xff0c 具有平移 旋转 尺度不变性特征 对于一幅图像 xff0c 通过傅里叶描述子获得其图像轮廓信息 xff0c 其本质就是空间 频域变换问题 通过将图像中的像素点进行傅里叶
  • raise ValueError(‘Expected input batch_size ({}) to match target batch_size ({}).‘

    raise ValueError Expected input batch size to match target batch size 记得在正向传播之前打印一下图片的尺寸 xff0c 这次没注意到图片其实都进来是 RGB 三通道的数据
  • RuntimeError mat1 dim 1 must match mat2 dim 0

    RuntimeError mat1 dim 1 must match mat2 dim 0 代码 self span class token punctuation span fc1 span class token operator 61
  • python 中 subprocess.Popen 总结

    python 中 subprocess Popen 总结 subprocess的目的就是启动一个新的进程并且与之通信 subprocess模块中只定义了一个类 Popen 可以使用Popen来创建进程 xff0c 并与进程进行复杂的交互 它
  • 关于 GNURadio-OFDM 运行时掉帧问题的解决

    最近在运行 GNURadio 中的 OFDM 例程时发现了丢帧的问题 2022 08 01更新 xff1a 1 突然又想起了这个问题 xff0c 今年年初的时候与西电的一个师兄又重新讨论了这个问题 xff0c 有了更深一步的理解 xff0c