文章目录

  • 初识OFDM(三):OFDM同步技术之STO
  • 一.什么是STO
  • 二. STO的影响
    • 1. case1
    • 2.case2
    • 3 case3
    • 4 case4
    • 5 matlab实现
  • 三. STO估计技术
    • 1时域CP估计
    • 2 训练符号的STO估计
    • 3 频域STO估计
  • 四.代码详解
  • 5 reference

初识OFDM(三):OFDM同步技术之STO

一.什么是STO

首先要弄明白,STO是发生在FFT中的,而不是IFFT,也就是说,他在接受时出现了问题

STO是符号定时偏差,它指的是OFDM中FFT窗未能完全与符号未能精确对齐而导致的误差,STO和CFO是OFDM同步技术的两个方向,CFO我们会在下一节介绍,不过他们可以用同一个式子来表示
yl[n]=IDFT{Yl[k]}=IDFT{Hl[k]Xl[k]+Zl[k]}=1N∑k=0N−1Hl[k]Xl[k]ej2π(k+ϵ)(n+δ)/N+zl[n]\begin{aligned} y_l[n]&=IDFT\{Y_l[k]\}=IDFT\{H_l[k]X_l[k]+Z_l[k]\} \\ &=\frac{1}{N}\sum_{k=0}^{N-1}H_l[k]X_l[k]e^{j2\pi (k+\epsilon)(n+\delta)/N}+z_l[n] \end{aligned} yl​[n]​=IDFT{Yl​[k]}=IDFT{Hl​[k]Xl​[k]+Zl​[k]}=N1​k=0∑N−1​Hl​[k]Xl​[k]ej2π(k+ϵ)(n+δ)/N+zl​[n]​
我是这样理解这个式子的,还记得上面的式子里k和n是如何来的吗,k来自于子载波的频率采样,fk=k/Tsymf_k=k/T_{sym}fk​=k/Tsym​,因此CFO就加在了k上,而n来自t=lTsym+nTst=lT_{sym}+nT_st=lTsym​+nTs​,因此它对应STO

二. STO的影响

时域上的偏差导致了频域上相位的偏差。

而STO的影响可以根据下图分为四类

1. case1

精确定时,没有干扰

2.case2

这种情况是提前了,但是没有被上一个符号的时延扩展影响,这样是不会有ISI的,注意这里的δ\deltaδ实际上是负的,此外书上应该写错了,应该是对yly_lyl​做FFT

3 case3

4 case4

落后于正常时间,这时候,由于CP的存在,FFT窗中实际上混入了下一个OFDM符号

理解一下,CP正常的位置是xl+1[n+δ−NG]x_{l+1}[n+\delta-N_G]xl+1​[n+δ−NG​],再偏移δ\deltaδ

5 matlab实现

这里的实现有两点需要指出

  1. y这里指的是一个由多个OFDM符号组成的OFD吗帧,该函数的作用仅仅是平移,而不是复制CP
  2. 关于nSTO的正负,请看我在后续代码中的注释

三. STO估计技术

1时域CP估计

CP估计思路如下图

既然现在接受的不对,那我微调开始处,找到CP

这里说明一下,本质上都是比较W1窗和W2窗的相似性,比较使用了两种方法

  • 比较差,差最小时最大,并有一些修正方法
  • 比较相关性,相关性最高时最大,并有一些修正方法

注意,这里的示意图画的是有一些问题的,窗口是从δ\deltaδ处开始的,结束于CP结尾处,而不是和CP对其的

2 训练符号的STO估计

训练符号实际上就是前导,发送已知的符号,在数据符号中间隔插入

书上说的不是很清楚,我的理解是:可以看到,训练符号中的CP并不是尾部的重复而是不一样的数据,W1和W2同时滑动时,和两个C分别重合时获得最相似,进而估计

3 频域STO估计

四.代码详解

需要指出,这里的代码仍然来自于

%基于CP,采用最大相关和最小距离算法完成STO的估计clear, figure(1), clf, figure(2), clf
nSTOs = [-3 -3 2 2];                %对应STO的采样数
CFOs = [0 0.5 0 0.5];               %CFO向量
SNRdB = 30;                         %SNR
MaxIter = 10;                       %迭代次数
%CFOs = [0 0 0 0];
Nfft = 128;                         %FFT大小
Ng = Nfft/4;                        % GI长度
Nofdm = Nfft+Ng;                    % OFDM符号长度
Nbps = 2;                           % 2/4 对应 QPSK/16QAM
M = 2^Nbps;                         % 符号对应的可能性数量
Es = 1;
A = sqrt(3/2/(M-1)*Es);             % QAM归一化因子
N = Nfft;
com_delay = Nofdm/2;                % 公共时延
Nsym = 100;                         % 一共有一百个OFDM符号
rand('seed',1);                     % 设置种子
randn('seed',1);
for i=1:length(nSTOs)               % 对于每一个不同的\delta STOnSTO= nSTOs(i);  CFO= CFOs(i);x = [];                          % 初始化信号块,最后x就是发送出来的OFDM模块for m=1:Nsym % random bits generates msgint=randi([0 M-1],1,N);    % 生成传输符号,1*128个0-3的数Xf = A.*qammod(msgint,M,'UnitAveragePower',true);% 调制成复数%***********************缺少了倒置的过程***********************%xt = ifft(Xf,Nfft);           % 发送x_sym = add_CP(xt,Ng);        % 加CPx = [x x_sym];end%*********************** 信道 ************************%%%%%%在这里根据需求添加信道,先假设是没有信道y = x;  % 没有信道影响sig_pow = y*y'/length(y);        % 计算能量,sig_pow= mean(mean(y.*conj(y),2))% 频率偏移 +  符号定时偏移 y_CFO= add_CFO(y,CFO,Nfft);      % 加CFOy_CFO_STO= add_STO(y_CFO,-nSTO); % 加STO,这是加在整个信号上的,因此头尾补零就行了,但是取-是因为?在研究v_ML=zeros(1,Ng);                % 初始化v_Cl=zeros(1,Ng);Mag_cor= 0;                      % arg的结果Mag_dif= 0;%%Add additive white gaussian noisefor iter=1:MaxIter% 加噪声y_aw = awgn(y_CFO_STO,SNRdB,'measured');%%%%%%%Symbol Timing Acqusition[STO_cor,mag_cor]= STO_by_correlation(y_aw,Nfft,Ng,com_delay); %书中自带[STO_cor_temp,mag_cor_temp]= STO_by_correlation_sim1(y_aw,Nfft,Ng,com_delay); %我自己编写%%%%%经验证,以上两者函数结果一致[STO_dif,mag_dif] = STO_by_difference(y_aw,Nfft,Ng,com_delay); %书中自带[STO_dif_temp,mag_dif_temp] = STO_by_difference_sim1(y_aw,Nfft,Ng,com_delay); %我自己编写%%%%%经验证,以上两者函数结果一致% 计数% 这里取反了,返回了符合"左加右减"的直觉的STOv_ML(-STO_cor+Ng/2)= v_ML(-STO_cor+Ng/2)+1;v_Cl(-STO_dif+Ng/2)= v_Cl(-STO_dif+Ng/2)+1;Mag_cor= Mag_cor + mag_cor;Mag_dif= Mag_dif + mag_dif;end % End of for loop of iter%%%%%%% Probabilityv_ML_v_Cl = [v_ML; v_Cl]*(100/MaxIter);      % 取百分数figure(1+i-1); set(gca,'fontsize',9);
%    subplot(220+i)bar(-Ng/2+1:Ng/2,v_ML_v_Cl');hold on, grid onstr = sprintf('nSTO Estimation: nSTO=%d, CQFO=%1.2f, SNR=%3d[dB]',nSTO,CFO,SNRdB);           title(str); xlabel('Sample'), ylabel('Probability');legend('ML','Classen'); axis([-Ng/2-1 Ng/2+1 0 100])%%%%%%% Time metricMag_cor = Mag_cor/MaxIter; [Mag_cor_max,ind_max] = max(Mag_cor);nc= ind_max-1-com_delay;Mag_dif = Mag_dif/MaxIter; [Mag_dif_min,ind_min] = min(Mag_dif);nd= ind_min-1-com_delaynn= -Nofdm/2 + [0:length(Mag_cor)-1]; nt= nSTO;
%    figure(2);
%    subplot(220+i);figure(5+i-1); plot(nn,Mag_cor,nn,1.5*Mag_dif,'r:','markersize',1);hold onstem(nc,Mag_cor_max,'b','markersize',5);stem(nSTO,Mag_cor(nSTO+com_delay+1),'k.','markersize',5); % Estimated/True Maximum valuestr1 = sprintf('STO Estimation - ML(b-)/Classen(r:) for nSTO=%d, CFO=%1.2f',nSTO,CFO); %,SNRdB);title(str1); xlabel('Sample'), ylabel('Magnitude'); %stem(n1,Mag_dif_min,'r','markersize',5)stem(nd,Mag_dif(nd+com_delay+1),'r','markersize',5);stem(nSTO,Mag_dif(nSTO+com_delay+1),'k.','markersize',5); % Estimated/True Minimum valueset(gca,'fontsize',9, 'XLim',[-32 32], 'XTick',[-10 -3 0 2 10]); %, xlim([-50 50]),legend('基于相关的','基于差值最小的');
end % End of for loop of i
function [STO_est,Mag] = STO_by_difference(y,Nfft,Ng,com_delay)
%通过最小化 CP和 OFDM 符号后部的差值,实现STO的估计
%输入:
%y:包括 CP的OFDM接收信号
%Ng: CP/GI内的采样数
%com_delay:公共时延
%输出:
%STO est :STO估计
%Mag:相关函数的时变轨迹
N_ofdm = Nfft+Ng;
minimum = 100;                          % 初始化最小值
STO_est = 0;                            % 初始化估计结果
if nargin<4                             com_delay = N_ofdm/2;
end
% 这里仔细考虑一下,为什么STO是这样计算的
% 如果STO为0,即没有偏移,那(n+com_delay)=等于N_ofdm的整数倍
% 现在如果STO是一个大于零的值如3,就是说接收到的y整体滞后了,CP头本应该是N_ofdm,现在变成了N_ofdm-3
% 那最终(n+com_delay)=N_ofdm-3,最终得到的STO就是3
% 这也就是之前取反的原因
% 这其实是不符合直觉"左加右减"的,FFT窗滞后了,\delta是一个正值
for n = 1:N_ofdmnn = n+com_delay+[0:Ng-1];          % 这就是窗口了,公共时延就是窗开始的位置,这里是符号的中间tmp0 = abs(y(nn))-abs(y(nn+Nfft));  % 计算差值Mag(n) = tmp0*tmp0';                % 由式(5.11)给出的差值的平方if Mag(n)< minimum                  minimum = Mag(n);               % 找到最小值STO_est = N_ofdm-com_delay -(n-1);  % 最后的估计结果,符号长度-公共实验-当前位置end
end
function [STO_est, Mag] = STO_by_correlation(y,Nfft,Ng,com_delay)%通过最大化CP和 OFDM符号后部的相关函数,得到STO的估计%输入:
%   y:包括CP的 OFDM接收信号
%Ng: GICP内的采样数
%com_delay :公共时延
%输出;
%STO_est :STO估计
% Mag:相关函数的时变轨迹
% 该函数和difference是类似的,不多赘述
N_ofdm = Nfft+Ng; % OFDM符号长度
if nargin<4com_delay = N_ofdm/2;
end
nn =0:Ng-1;
yy = y(nn+com_delay)*y(nn+com_delay+Nfft)';
%相关函数
%这里的n1才对,difference中的是有问题的
maximum = abs(yy);
for n=1:N_ofdmn1 = n-1;yy1 = y(n1+com_delay)*y(n1+com_delay+Nfft)';yy2 = y(n1+com_delay+Ng)*y(n1+com_delay+Nfft+Ng)';yy = yy-yy1+yy2;Mag(n)=abs(yy); %式(5.13)if(Mag(n) > maximum)maximum = Mag(n);STO_est = N_ofdm-com_delay-n1;end
end

5 reference

[1] 通信原理 第2版 [李晓峰 编著] 2014年版

[2] MIMO-OFDM 无线通信技术及MATLAB 实现

[3] https://zhuanlan.zhihu.com/p/389034302

初识OFDM(三):OFDM同步技术之STO相关推荐

  1. OFDM系统同步技术的matlab仿真,包括符号定时同步,采样钟同步,频偏估计

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 在单载波系统中,载波频率的偏移只会对接收信号造成一定的幅度衰减和相位旋转,这可以通过均衡等方法来加以 ...

  2. 【OFDM频域同步】基于OFDM数字电视地面广播系统中频域同步技术matlab仿真

    1.软件版本 matlab2021a 2.本算法理论知识 数字电视地面广播传输一直是各界研究的热点,采用OFDM多载波调制可以有效对抗地面传输中多径效应.本课题主要要求学生掌握数字电视地面广播传输系统 ...

  3. OFDM同步技术基于MATLAB仿真,基于Matlab的OFDM系统仿真

    中文摘要 交频分复用(OFDM, Orthogonal Frequency Division Multiplexing) 是一种特殊的多载波方案,它可以被看作一种调制技术,也可以被当作是一种复用技术。 ...

  4. AUTOSAR从入门到精通100讲(三十八)-通信网络中的⽐特和帧同步技术

    使⽤位和帧同步技术是为了确保从通信的⼀个发送器传输的信号可以被接收器正确解码.为了实现这⼀⽬标,必须将某些定时信息传递给接收器,例如通信数据的开始和结束位置.本⽂介绍了各种位和帧同步技术以及相应的底层 ...

  5. 初识MIMO(三):天线分集技术及其仿真

    初识MIMO(三):天线分集技术及其仿真 零 代码地址 https://github.com/liu-zongxi/MIMO_simulation 请大家看完觉得有用别忘了点赞收藏,github项目给 ...

  6. LTE同步技术(一)

    作为系统同步的重要研究内容,LTE通信系统的小区搜索技术是指用户设备(UE)检测到一个理想小区,选择接入并与之取得时间和频率同步以及检测到小区标识号(ID)的过程.小区ID包括扇区ID(Sector ...

  7. 剑三服务器文件在哪里,剑三服务器同步设置在哪

    剑三服务器同步设置在哪 内容精选 换一换 kubernetes除了必要的支撑组件以外,其他的组件都是以插件的形式运行,如Kubernetes DNS,Kubernetes Dashboard等等.插件 ...

  8. 腾讯邓君:《王者荣耀》翻过的同步技术相关的三座大山

    在Unity举办的Unite 2017上海开发者大会中,案例分享专场受到了业内的高度关注,众多行业领军人物针对过往的成功案例慷慨的分享了开发过程中的经验教训,而<王者荣耀>项目组技术总监邓 ...

  9. 再谈网游同步技术:实时动作游戏同步方式和传输协议选择

    如今十年过去,网上越来越多的人开始讨论游戏同步技术了,然而很多文章往往只针对某种特定的游戏情况,而观点又经常以偏概全.很多人并没有真正开发过实时动作游戏,更别说了解同步技术的前世今生了.转载别人的观点 ...

最新文章

  1. CentOS用yum安装X Window
  2. USB开发基础:USB设备的开发流程
  3. html语言技术基础,第2章Web编程基础HTML语言技术方案.ppt
  4. leetcode 7整数反转和leetcode 9回文数
  5. 中国IT运维O2O市场产值规模预测及发展策略建议报告2022年
  6. python里面返回上一步_Python中的这3个骚操作你会吗?
  7. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc
  8. 属性,类方法,静态方法,反射
  9. HDU4307(最小割)
  10. java 多线程缓存_[Java教程]【JAVA并发编程实战】12、使用condition实现多线程下的有界缓存先进先出队列...
  11. 牛人主页(主页有很多论文代码)【真的好强大】
  12. html5日程管理系统,有条不紊:四款桌面日程管理软件横测
  13. 使用TensorFlow.js进行AI在网络摄像头中翻译手势和手语
  14. Java关键字fymd,JAVA程式碼一直被foritfy檢出有path manipulation
  15. Unity MRTK(一)
  16. long 雪花算法_深入分析mysql为什么不推荐使用uuid或者雪花id作为主键
  17. pycharm安装PyQT5教程
  18. Profile多环境支持
  19. 我的人生历程之第一篇:游戏篇(b)
  20. ​K歌中的歌唱评价与嗓音分析

热门文章

  1. NodeJS 服务器实现 gzip 压缩
  2. 2008奢华品牌网上表现TOP100 2008奢华品牌网上表现分类排行榜—蓝调 2008奢华品牌网上表现分类排行榜—红调
  3. 刘一男词汇课(从aboard到establish):“宝剑锋从磨砺出,梅花香自苦寒来。“
  4. java.lang.IllegalArgumentException: Invalid token /storage/emulated/0/Download/s-kz-02.jpg
  5. 2021年安全员-A证考试报名及安全员-A证实操考试视频
  6. 有机蔬菜的市场前景:2022年有机蔬菜市场前景良好
  7. 在南方旅游 VS 在北方旅游
  8. 信贷违约风险预测(四)训练模型
  9. 希尔伯特变换、解析信号与复包络
  10. DIV+CSS解决IE6,IE7,IE8,FF兼容问题