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的通信系统基带设计》

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值