OFDM接收机同步——分组检测
标签: OFDM
上一篇讲了OFDM发射机中的长短训练序列生成原理,基于此可以得到长短训练序列的准确数值,为接收机中的符号同步中的相关运算提供基础。
进入符号同步前,首先来看OFDM接收机中的第一步——分组检测。分组检测就是检测突发传输方式的信道上是否有新的数据到达,算法的好坏直接影响着接收机的后续工作性能。
一、本文意义
基于《基于xilinx fpga 的ofdm的通信系统基带设计》这本教材中分组检测算法原理,通过matlab编程仿真验证“延时相关+保持长度”分组检测算法的有效性。同时,通过仿真证明教材上的判决公式的问题,修正判决公式。
二、“延时相关+保持长度”分组检测算法
根据教材上的说明,在IEEE 802.11a中有效的分组检测是采用前导结构进行的。翻译白话文讲出来就是,接收机要充分利用有用的信息找到一帧数据的开始,哪些信息呢?就是利用前导中短训练符号的周期性。
在IEEE 802.11a中系统中,前导结构的价值就是——帮助同步。具体算法教材104~105页有详细的推导,本着务实不啰嗦态度,本文就不再抄录。
三、“延时相关+保持长度”算法仿真
3.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; % 绘图
- 仿真结果如下图所示:

观察可知,仿真结果,在帧数据开始前(注意数据前100个点为补的零),互相关和功率比值已经出现了大的峰值。且通过多次仿真(筒子们朋友们,多运行几次程序)可以看到,有效帧数据前这段波动,有时大(如上图所示),有时却相对较小(如下图所示)。


- 仿真结果分析
按照上面的仿真结果,显然无法准确找到帧头位置。对比图1和图3,按照延时相关出现较大值(>0.5)后,应用保持长度(>32个点)约束,两种情况下帧头位置相差很多。
分析造成以上现象的原因可知,关键的是在计算能量时,按照书上的公式,用到的延迟的数据样本(即Rx(n-16))。当有效信号刚出现时,有效信号与噪声的互相关C已经开始增大,而此次计算接收信号能量P用到的依然是噪声为主,即P依然比较小。如此C/P就会随C的变化而变化。无法保证有效检测帧头。
3.2 修改公式进行仿真
- 按照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; % 绘图
- 仿真结果如下:

bingo!这个图看着就舒服多了,而且寻得的帧头开始在第100个采样点附近。
虽然后面冒出了尖峰,但是不会对帧头检测产生影响(那会已经找到帧头,且通过保持长度窗可以干掉)。多次仿真,以上波形效果基本保持不变。
四、总结
通过仿真,发现《基于xilinx fpga 的ofdm的通信系统基带设计》教材中“延时相关+保持长度”分组检测算法中的bug——不该利用延迟信号Rx(n-16)计算信号功率P,而应该用当前信号Rx(n)计算信号功率P。
至此,完成下图中标出的两个模块的仿真功能。
参考文献:
《基于xilinx fpga 的ofdm的通信系统基带设计》
智能推荐
通信类最新成果(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...
猜你喜欢
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控件的...
