OFDM接收机同步——分组检测

标签: OFDM

上一篇讲了OFDM发射机中的长短训练序列生成原理,基于此可以得到长短训练序列的准确数值,为接收机中的符号同步中的相关运算提供基础。
进入符号同步前,首先来看OFDM接收机中的第一步——分组检测。分组检测就是检测突发传输方式的信道上是否有新的数据到达,算法的好坏直接影响着接收机的后续工作性能。

一、本文意义

基于《基于xilinx fpga 的ofdm的通信系统基带设计》这本教材中分组检测算法原理,通过matlab编程仿真验证“延时相关+保持长度”分组检测算法的有效性。同时,通过仿真证明教材上的判决公式的问题,修正判决公式。

二、“延时相关+保持长度”分组检测算法

根据教材上的说明,在IEEE 802.11a中有效的分组检测是采用前导结构进行的。翻译白话文讲出来就是,接收机要充分利用有用的信息找到一帧数据的开始,哪些信息呢?就是利用前导中短训练符号的周期性。

在IEEE 802.11a中系统中,前导结构的价值就是——帮助同步。具体算法教材104~105页有详细的推导,本着务实不啰嗦态度,本文就不再抄录。

三、“延时相关+保持长度”算法仿真

3.1 按照教材上的公式进行仿真

  1. 废话少说,根据书上公式,写出如下实现代码:
close all;
clear all;

% load前导(包含短训练序列、长训练序列),实现见上一篇文章
load LeaderSequence;
% 设定接收信号信噪比,后面计算噪声信号时会用到
SNR = 15;
% 计算前导信号功率,及其dB值。
Pw_signal = (LeaderSequence*LeaderSequence')/length(LeaderSequence);
dB_signal = 10*log10(Pw_signal);
% 为便于仿真观察,为前导序列补零,生成仿真信号PL
PL = [zeros(1,100),LeaderSequence,zeros(1,100)];

% 噪声信号功率dB值
dB_noise = dB_signal - SNR;
% 按照高斯白噪声生成
NL = wgn(1,length(PL), dB_noise, 'complex');

% 接收信号为理论信号和噪声的叠加
Rx = PL + NL;

% 初始化变量空间
C = zeros(1,length(Rx)-32);    % C用来存储互相关值
P = zeros(1,length(Rx)-32);    % P用来存储信号能量

for i=1:(length(Rx)-32);
    current = Rx(16+i+(1:16));      % 当前值Rx(n)
    previos = Rx(i+(1:16));         % 延迟Rx(n-16)
    C(i) = current*previos';        % 计算互相关数值sum{Rx(n)*Rx(n-16)}
    P(i) = previos*previos';        % 计算信号能量sum{Rx(n-16)*Rx(n-16)}
end;

plot(abs(C)./abs(P)); grid on;      % 绘图

  1. 仿真结果如下图所示:
    在这里插入图片描述
    观察可知,仿真结果,在帧数据开始前(注意数据前100个点为补的零),互相关和功率比值已经出现了大的峰值。且通过多次仿真(筒子们朋友们,多运行几次程序)可以看到,有效帧数据前这段波动,有时大(如上图所示),有时却相对较小(如下图所示)。
    在这里插入图片描述
    在这里插入图片描述
  2. 仿真结果分析
    按照上面的仿真结果,显然无法准确找到帧头位置。对比图1和图3,按照延时相关出现较大值(>0.5)后,应用保持长度(>32个点)约束,两种情况下帧头位置相差很多。
    分析造成以上现象的原因可知,关键的是在计算能量时,按照书上的公式,用到的延迟的数据样本(即Rx(n-16))。当有效信号刚出现时,有效信号与噪声的互相关C已经开始增大,而此次计算接收信号能量P用到的依然是噪声为主,即P依然比较小。如此C/P就会随C的变化而变化。无法保证有效检测帧头。

3.2 修改公式进行仿真

  1. 按照3.1中的仿真结果和分析,修改计算信号能量P的公式,改用当前接收信号样本(即Rx(n),而不是(Rx(n-16)),仿真程序代码如下:
close all;
clear all;

% load前导(包含短训练序列、长训练序列),实现见上一篇文章
load LeaderSequence;
% 设定接收信号信噪比,后面计算噪声信号时会用到
SNR = 15;
% 计算前导信号功率,及其dB值。
Pw_signal = (LeaderSequence*LeaderSequence')/length(LeaderSequence);
dB_signal = 10*log10(Pw_signal);
% 为便于仿真观察,为前导序列补零,生成仿真信号PL
PL = [zeros(1,100),LeaderSequence,zeros(1,100)];

% 噪声信号功率dB值
dB_noise = dB_signal - SNR;
% 按照高斯白噪声生成
NL = wgn(1,length(PL), dB_noise, 'complex');

% 接收信号为理论信号和噪声的叠加
Rx = PL + NL;

% 初始化变量空间
C = zeros(1,length(Rx)-32);    % C用来存储互相关值
P = zeros(1,length(Rx)-32);    % P用来存储信号能量

for i=1:(length(Rx)-32);
    current = Rx(16+i+(1:16));      % 当前值Rx(n)
    previos = Rx(i+(1:16));         % 延迟Rx(n-16)
    C(i) = current*previos';        % 计算互相关数值sum{Rx(n)*Rx(n-16)} 
    P(i) = current*current';        % 计算信号能量sum{Rx(n)*Rx(n)}!!!!!!!!!!!!!!
end;

plot(abs(C)./abs(P)); grid on;      % 绘图
  1. 仿真结果如下:
    在这里插入图片描述
    bingo!这个图看着就舒服多了,而且寻得的帧头开始在第100个采样点附近。
    虽然后面冒出了尖峰,但是不会对帧头检测产生影响(那会已经找到帧头,且通过保持长度窗可以干掉)。多次仿真,以上波形效果基本保持不变。

四、总结

通过仿真,发现《基于xilinx fpga 的ofdm的通信系统基带设计》教材中“延时相关+保持长度”分组检测算法中的bug——不该利用延迟信号Rx(n-16)计算信号功率P,而应该用当前信号Rx(n)计算信号功率P。

至此,完成下图中标出的两个模块的仿真功能。
在这里插入图片描述

参考文献:
《基于xilinx fpga 的ofdm的通信系统基带设计》

版权声明:本文为boayel原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/boayel/article/details/111501299

智能推荐

通信类最新成果(17-19)

- 2019世界移动通信大会(MWC) 1、5G视频+8k画质直播,延迟低至1s,除去解码时间只需40ms。 2、华为带来了一项自动驾驶技术的安全解决方案——车路协同系统。 目前的汽车自动驾驶技术,主要依赖车辆本身的雷达和摄像头。这样感应视野就有一定的局限性。而且感应装置往往无法识别红绿灯等等指示标志。 华为的车路协同系统,相当于为汽车和驾驶员提供了一个“上帝视...

Mysql索引

一.索引相关概念 Mysql索引是什么: 1)定义:索引(Index)是帮助MySQL高效获取数据的数据结构 2)本质:索引是数据结构(排好序的快速查找数据结构) 3)位置:索引本身很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上 优点: 1)提高检索效率,降低I/O成本 2)通过索引对数据进行排序,降低数据排序成本,降低CPU消耗 缺点: 1)虽然提高了查询效率,但降低了更...

MongoDB&C++开发 (七)【转】 MongoDB性能分析

有分析MongoDB性能的需求(主要是插入和查询),查阅资料总结如下。 摘自: MongoDB与MySQL的插入查询性能测试 CSDN博客 1.MongoDB与MySQL的插入查询性能测试 1.1 机器配置&数据规模 数据规模设定在1亿条。 机器配置: CPU:Intel(R) Xeon(R) CPU E5-2620 @ 2.00GHz 内存:65954040 KB (12核CPU,64G...

C++ greater/less 和建堆

文章目录 STL中的greater<>()和less<>() Heap 定义 堆排序 构建堆 堆排序 C++的STL中堆的实现 STL中的greater<>()和less<>() 两个函数的头文件为 排序的时候,默认是从小到大;从大到小排序要使第三个参数为greater()。 建堆的时候,默认是最大堆;最小堆要使第三个参数为greater()。 ma...

dataframe,array,matrix之间的转换和存储

test是一个5行3列的dataFframe...

猜你喜欢

vue-router与keep-alive

vue-router与keep-alive keep-alive是vue内置的一个组件,可以使被包含地组件保留状态,或避免重新渲染。 router-vue是vue-router里注册地组件,我们之前学了它是一个占位符,如果 被包裹在keep-alive里边,所有路径匹配到地视图组件都会被缓存 我们知道vue生命周期,里边有很多的回调函数,当到不同的阶段会执行对应的回调函数。 那一个vue实例何时开...

1.基于vue+element_ui 构建新项目——前期准备工作

一、安装Note.js省略 二、设置nodejs prefix(全局)和cache(缓存)路径 1、在nodejs安装路径下,新建node_global和node_cache两个文件夹 2、设置缓存文件夹  设置全局模块存放路径 设置成功后,之后用命令npm install XXX -g安装以后模块就在E:\develop_software\Nodejs10.15.3\node_global里 三...

EasyTouch5学习笔记

基本: Quick Gesture: 这个组件封装的是快速拖动功能 Quick name为了在脚本中方便调用而设置 Allow on the axes选择在哪个轴上拖动 Allow pick over UI element是否允许忽略掉UI响应 Stop drag on collision enter遇到碰撞体是否停下 Reset physic on drag 拖拽时是否忽略掉刚体 下面是几个事件...

关于STM32的bootloader无法跳转到RT-Thread的一些总结

最近由于工作需要,在调试STM32的bootloader,中间遇到了很多问题。 之前没有接触过BootLoader,跟着原子哥的IAP来学习的Bootlader原理。写了裸机程序来进行调试,过程还算比较顺利。最后在更新APP(基于RT-Thread的程序)时出现了问题,一直调试了好几天。 裸机bootloader跳转裸机的APP程序没有问题,跳转自身也没有问题。通过JLINK直接读取整个芯片,把A...

QCustomplot使用分享(九) 绘制图表-多功能游标

文章目录 一、概述 二、效果图 三、源码讲解 1、源码结构 2、头文件 3、添加游标 4、监测移动 5、移动游标 6、其他函数 四、测试方式 1、测试工程 2、测试文件 3、测试代码 五、相关文章 六、总结 七、关于美化 原文链接:QCustomplot使用分享(九) 绘制图表-多功能游标 一、概述 上一篇文章QCustomplot使用分享(八) 层(完结)讲述了第一篇QCustomPlot控件的...