OFDM同步技术

文章目录

  • 前言
  • 一、OFDM 同步技术
  • 二、MATLAB 仿真
    • 1、STO 估计技术
      • ①、核心源码
      • ②、仿真结果
    • 2、CFO 估计技术
      • ①、核心源码
      • ②、仿真结果
  • 三、资源自取


前言

本文对 OFDM 同步技术以思维导图的形式呈现,有关仿真部分进行了讲解实现。


一、OFDM 同步技术

OFDM 同步技术思维导图如下图所示,如有需求请到文章末尾端自取。
在这里插入图片描述

二、MATLAB 仿真

1、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 % 随机位生成 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,这是加在整个信号上的,因此头尾补零就行了;但是取-是因为:δ<0 是提前,δ>0是滞后v_ML = zeros(1, Ng);                 % 初始化v_Cl = zeros(1, Ng);Mag_cor = 0;                         % arg的结果Mag_dif = 0;%%添加加性高斯白噪声for iter = 1:MaxIter% 加噪声y_aw = awgn(y_CFO_STO, SNRdB, 'measured');%%%%%%%符号定时获取[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);   % 将当前坐标轴的字体大小设置为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];  % -80~79
%   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

完整源码文末自取

②、仿真结果

在这里插入图片描述
在这里插入图片描述

由上两个图所示,当 STO = -3,CFO = 0时,可以看到基于差值最小的方法估计的 STO 更为准确。
在这里插入图片描述
在这里插入图片描述
由上两个图所示,当 STO = -3,CFO = 0.5时,可以看到基于差值最小的方法和基于相关估计的 STO 都很准确。
在这里插入图片描述
在这里插入图片描述
由上两个图所示,当 STO = 2,CFO = 0 时,可以看到基于差值最小的方法和基于相关估计的 STO 都很准确。
在这里插入图片描述
在这里插入图片描述
由上两个图所示,当 STO = 2,CFO = 0.5 时,可以看到基于差值最小的方法估计的 STO 更为准确。

2、CFO 估计技术

①、核心源码

%完成时域基于CP的方法和频域的Moose/Classen方法,用于后续CFO补偿
clear, clf
CFO = 0.15;                     % CFO(载波频率偏移)大小
% CFO = 0;
Nfft=128;                       % FFT采样数  
Nbps=2;                         % QPSK或QAM
M=2^Nbps;                       % 每个符号代表几比特
Es=1;                           % 能量
A=sqrt(3/2/(M-1)*Es);           % QAM归一化
N=Nfft;                         % 发送的符号长度,为了方便,和Nfft保持一致
Ng=Nfft/4;                      % GI长度
Nofdm=Nfft+Ng;                  % 一个OFDM符号的长度
Nsym=3;                         % 一共发送了3个OFDM符号,前两个是导频,最后一个是真正发送的数据符号
% h=complex(randn,randn)/sqrt(2);
% %h=[1 zeros(1,5)]; 
% channel(h,0);  
%Transmit signal
x=[];
for m=1:Nsym                    % 前两个是导频,最后一个是真正发送的数据符号msgint=randi([0 M-1],1,N);   % 生成要发送的符号if m<=2                      % Xp = add_pilot(zeros(1,Nfft),Nfft,4);    % 生成导频Xf=Xp; % add_pilotelse  %Xf= QAM(msgint((i-1)*N+1:i*N),Nbps);  % constellation mapping. average power=1        Xf = A.*qammod(msgint,M,'UnitAveragePower',true);end                                      xt = ifft(Xf,Nfft);          % ifft  x_sym = add_CP(xt,Ng);       % 加CPx= [x x_sym];                % 将三个OFDM符号依次拼接
end    %channel 可添加所需信道
y=x; % No channel effect%Signal power calculation
sig_pow= y*y'/length(y); % Signal power calculation%%%%
SNRdBs= 0:3:30;  
% SNRdBs= 100; 设100是为调试程序  
MaxIter = 100;  
for i=1:length(SNRdBs)SNRdB = SNRdBs(i);MSE_CFO_CP = 0; MSE_CFO_Moose = 0; MSE_CFO_Classen = 0;rand('seed',1);              % 设置种子来保证每次仿真结果一致randn('seed',1);y_CFO= add_CFO(y,CFO,Nfft);  % 增加CFO,此处是在时域添加的,因此是×相位% 多次迭代取平均for iter=1:MaxIter%y_aw=add_AWGN(y_CFO,sig_pow,SNRdB,'SNR',Nbps);  % AWGN added, signal power=1y_aw = awgn(y_CFO,SNRdB,'measured');              % 增加高斯白噪声Est_CFO_CP = CFO_CP(y_aw,Nfft,Ng); % CP-based     % 根据CP测算CFOMSE_CFO_CP = MSE_CFO_CP + (Est_CFO_CP-CFO)^2;     % 平方累计Est_CFO_Moose = CFO_Moose(y_aw,Nfft);             % Moose估计MSE_CFO_Moose = MSE_CFO_Moose + (Est_CFO_Moose-CFO)^2;% 平方累计Est_CFO_Classen = CFO_Classen(y_aw,Nfft,Ng,Xp); % Classen (Pilot-based)MSE_CFO_Classen = MSE_CFO_Classen + (Est_CFO_Classen-CFO)^2;end % the end of for (iter) loopMSE_CP(i) = MSE_CFO_CP/MaxIter; MSE_Moose(i) = MSE_CFO_Moose/MaxIter;  MSE_Classen(i) = MSE_CFO_Classen/MaxIter;
end%ebn0 end    
semilogy(SNRdBs, MSE_CP,'-+');
grid on, hold on
semilogy(SNRdBs, MSE_Moose,'-x'); semilogy(SNRdBs, MSE_Classen,'-*');
xlabel('SNR[dB]'), ylabel('MSE'); title('CFO Estimation'); %axis([0 30 10e-8 10e-2])
% str=sprintf('CFO = %1.2f',CFO);
legend('CP-based technique','Moose (Preamble-based)','Classen (Pilot-based)');
% legend(str);

完整源码文末自取

②、仿真结果

在这里插入图片描述
可以观察到,随着接收信号的 SNR 增大,CFO 估计的 MSE 减小。估计技术的性能取决于用于 CFO 估计的 CP 中的采样数、前导数和导频数。

三、资源自取

链接:OFDM同步技术

在这里插入图片描述


我的qq:2442391036,欢迎交流!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端工程化02-复习jQuery当中的插件开发

2、jQuery插件开发 在我们开发的时候、有时候jQuery提供的方法并不能满足我们的需求&#xff0c;如果我们想给jQuery扩展一些其他的方法&#xff0c;那这种情况下&#xff0c;可能会需要写一个插件 jQurey官网&#xff1a;jquery.com 例如一些、图片懒加载插件、滚动的插件、…

阿里云效中的Story Point是什么,代表的是什么意思,该怎么填

文章目录 Story Point是什么一个合理的Point应该能让团队的其他成员相对准确的评估任务难度根据自己对任务难度的分析对比团队Point标准评估一个任务是多少Point点时建议三个人评估 这是我阅读并参考的文章 中文翻译Story Point 故事 点&#xff08;观点&#xff0c;论点&#…

vue--条件渲染

1.v-if 写法&#xff1a; (1).v-if“表达式” (2).v-else-if“表达式” (3).v-else“表达式” 适用于&#xff1a;切换频率较低的场景。 特点&#xff1a;不展示的DOM元素直接被移除。 注意&#xff1a;v-if可以和:v-else-if、v-else一起使用&#xff0c;但要求结构不能被“打…

GDPU unity游戏开发 碰撞体与关节

让你设计的角色跑起来吧&#xff0c;可以是动画&#xff0c;也可以是碰撞器的运动。 运动小车 找到小车素材&#xff0c;导入到层级面板。然后可以新建一个地面让小车在上面运动&#xff0c;新建一个方块当障碍物。 摆放好后&#xff0c;要加组件。记住&#xff0c;在unity中运…

多商家AI智能名片商城系统(开源版)——构建高效数字化商业新生态

一、项目概述 1、项目背景 1&#xff09;起源 随着数字化时代的快速发展&#xff0c;传统名片和商城系统已经难以满足企业日益增长的需求。商家需要更高效、更智能的方式来展示自己的产品和服务&#xff0c;与消费者进行互动和交易。同时&#xff0c;开源技术的普及也为开发…

HTML的学习-通过创建相册WEB学习HTML-第二部分

文章目录 二、学习开始3.6、form元素示例&#xff1a;添加form元素示例&#xff1a;action属性添加到form属性中 3.7、input元素示例&#xff1a;在input属性中添加参数 3.8、button元素示例&#xff1a;在button中添加type元素示例&#xff1a;定义单选按钮radio 3.9、id属性示…

easyExcel快速入门

目录 &#x1f9c2;1.简单介绍 &#x1f32d;2.快速入门 &#x1f953;1.导入依赖 &#x1f37f;2.导出到excel &#x1f38f;3.读入数据 &#x1f389;4.下载 1.简单介绍 传统操作Excel大多都是利用Apach POl进行操作的,但是POI框架并不完善,使用过程非常繁琐且有较多…

盛水最多的容器 ---- 双指针

题目链接 题目: 分析: 最大容积 即使就是最大面积, 长为下标之差, 宽为两下标对应值的最小值解法一: 暴力枚举: 将每两个数之间的面积都求出来, 找最大值, 时间复杂度较高解法二: 假设我们的数组是[6, 2, 5, 4], 我们先假设最左边和最右边, 即6 和 4 之间是最大面积长a*宽b此…

nginx配置ip_hash负载均衡策略

一、nginx配置ip_hash负载均衡策略 nginx默认的负载均衡策略为轮询&#xff0c;某些场景需要使用ip_hash负载策略&#xff0c;即&#xff1a;同一个ip地址&#xff0c;永远访问nginx后面同一台tomcat。配置示例如下&#xff0c;主要是设置ip_hash&#xff1a; upstream www.ab…

前端JS算法--插入排序

插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的工作原理是将一个记录插入到已经排好序的有序表中&#xff0c;从而得到一个新的、记录数增加1的有序表。以下是插入排序算法的基本步骤&#xff1a; 从第一个元素开始&#xff0c;该元…

Pandas数据分析小技巧

Pandas数据分析小技巧&#xff1a;提升数据处理效率与准确性的秘诀 Pandas是一个强大的Python数据分析库&#xff0c;它提供了快速、灵活且富有表现力的数据结构&#xff0c;使得数据清洗、转换、分析等操作变得简单而高效。本文将介绍一些Pandas数据分析的小技巧&#xff0c;…

Go语言切片

基本介绍 Go 语言切片是对数组的抽象&#xff0c;是一种长度可变的动态数组。 基本用法 切片声明 声明一个未指定大小的数组来定义切片 var s []int或者使用 make 函数来创建切片 var slice1 []type make([]type, len)// 使用简短声明slice1 : make([]type, len)切片初始化…

Kamailio 的 uuid_kill

Kamailio 是否有类似 FreeSWITCH 的 uuid_kill 命令 试了试&#xff0c;发现还真的有 如果正在振铃&#xff0c;那么 tm.cancel 可以结束呼叫&#xff0c;参考链接&#xff1a; https://kamailio.org/docs/modules/5.5.x/modules/tm.html#tm.rpc.cancel 如果已经应答&#…

三招教你成为朋友圈运营高手,赶紧get起来!

朋友圈作为一个重要的营销推广渠道&#xff0c;是能够为我们带来很多收益的。今天就给大家分享朋友圈运营的三个技巧&#xff0c;快快Get起来吧&#xff01; 第一招&#xff1a;明确人设定位 要在朋友圈里脱颖而出&#xff0c;首先我们需要明确自己的人设定位。选择一个与自己…

P1141 01迷宫(BFS+简单连通块优化解析)

01迷宫 题目描述 有一个仅由数字 0 0 0 与 1 1 1 组成的 n n n \times n nn 格迷宫。若你位于一格 0 0 0 上&#xff0c;那么你可以移动到相邻 4 4 4 格中的某一格 1 1 1 上&#xff0c;同样若你位于一格 1 1 1 上&#xff0c;那么你可以移动到相邻 4 4 4 格中的某一…

python 背包问题 动态规划

问题分析子问题界定&#xff1a;由参数 k 和 y 界定k&#xff1a;考虑对物品1, 2, … , k 的选择 y&#xff1a;背包总重量不超过 y 原始输入&#xff1a;k n, y b 子问题计算顺序&#xff1a; k 1, 2, … , n 对于给定的 k&#xff0c;y 1, 2, … , b 定义问题 假设有 n 个…

任务修复实例(4)

Quest Name War Dance | 战争之舞 Quest ID 24540 -- Add Creature INSERT INTO world.creature (guid, id, map, zoneId, areaId, spawnDifficulties, phaseUseFlags, PhaseId, PhaseGroup, terrainSwapMap, modelid, equipment_id, position_x, position_y, position_z, o…

【Spring】IOC/DI中常用的注解@Order与@DependsOn

目录 1、Order 注解改变Bean自动注入的顺序 1.1、了解SpringBootTest注解 1.2、Order 注解改变Bean自动注入的顺序 2、DependsOn 改变Bean的创建顺序 1、Order 注解改变Bean自动注入的顺序 在sping中&#xff0c;通过IOC&#xff08;控制反转&#xff09;和DI&#xff08;依…

文本向量化模型新突破——acge_text_embedding勇夺C-MTEB榜首

在人工智能的浪潮中&#xff0c;以GPT4、Claude3、Llama 3等大型语言模型&#xff08;LLM&#xff09;无疑是最引人注目的潮头。这些模型通过在海量数据上的预训练&#xff0c;学习到了丰富的语言知识和模式&#xff0c;展现了出惊人的能力。在支撑这些大型语言模型应用落地方面…

hbase建表时设置预分区

一.hbase rowkey设计的原则 遵循唯一性,散列,不应过长等原则 二.rowkey常用的设计 1.reverse反转 2.salt加盐 3.hash散列 三.hbase建表预分区,指定3个rowkey,分成4个region 在Hbase中,预分区是一种优化手段,用于在创建表时提前规划好Region的分布,以提高数据写入的效率和查询…