热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

m基于OFDM的同步技术的研究,对比schmidl,minn,park,Landstrom

目录1.算法概述2.部分程序3.算法部分仿真结果图4.完整程序获取1.算法概述在现代短波通信系统中,其信道一般具有频率多样性和频率选择性,因此在

目录

1.算法概述

2.部分程序

3.算法部分仿真结果图

4.完整程序获取




1.算法概述

       在现代短波通信系统中,其信道一般具有频率多样性和频率选择性,因此在短波通信过程中,多径的传播将产生信号的符号干扰和衰落。和传统的频分复用相比,OFDM通信技术可以最大限度的增加频谱利用率,同时OFDM将高速传输数据进行串并转换,从而增加子载波的符号周期,最终将频率选择性衰落的信道转换为平衰落信道。因此,OFDM技术具有优良的抗多径能力,较高的频谱利用率,在短波通信中有着十分重要的应用。

       OFDM系统模型的基本结构如下图所示:

       由于OFDM系统对多普勒频偏和定时有着较为严格的要求,因此,载波同步和符号同步是OFDM系统中的一个重要模块。同步过程分为同步捕获阶段和同步跟踪节点,目前较为常见的同步捕获算法主要包括T.Schmidl&D.Cox算法,Minn算法,Park算法以及Landstrom算法。 

    T.Schmidl&D.Cox算法(简称SC算法)主要是通过两个OFDM符号作为训练序列进行时间和频率同步,SC算法的帧结构如下图所示:

       Minn算法是在SC算法基础之上改进得到,常见的Minn算法主要有基于训练符号结构的SC改进算法以及基于滑动窗口法的SC改进算法。但是基于滑动窗口法的SC改进算法会产生较多的峰值,从而影响判决。因此,本章节采用基于训练符号结构的SC改进算法,其帧结构如下所示:

         Park算法,其主要通过新构造的帧结构和定时度量函数来最大程度的加大相邻点定时度量函数的差别,从而保证估计得到的定时点和其他干扰定时度量值之间的差值最大化。Park算法的帧结构如下所示: 

         Landstrom同步算法是一种不需要借助辅助数据的同步捕获算法,该算法是基于Van de Beek算法改进得到,其主要通过导频和循环前缀进行同步捕获。


2.部分程序

Radius = 100;
Nh = 1;
Nv = 1;
Scale1 = (rand(Nh,1)/2+0.5);
Scale2 = (rand(Nv,1)/2+0.5);
%速度
v = 200;
%载波频率
fc = 128e6;
%光速
c = 3e8;
fd = v*fc/c;
%采样间隔为1us
timeval = 1e-5;
%多径时延
delay_multi = [0,1,3,6]*timeval;
%多径增益
Pow_avg = [0,-20,-40,-60];
%多径个数
Nmultipath = length(Pow_avg);
%多径平均延迟
delay_avg = 100e-6;
%多普勒频偏
Fre_offset = 0.001;
Nc = 8;
%多载波
Sub = Nc;
Len = 1024;
%信号带宽
BW = 180e3;
T = 1/BW;
TG = T/4;
%间隔
BWs = 3.75e3;
%信号采样率
Fd = 8;
SNR_dB = [0:7];
%仿真指标保持变量
Err_Rate = zeros(1,length(SNR_dB));
%PILOT设置
pilot_type = 1;
%仿真循环次数,循环次数越大,仿真效果越好
nloop = [40,40,40,40,40,60,80,300];
%turbo编码参数
N = 512;
M = 167;
%FFT
fftlen = 512;
%每个SNR点上仿真若干次
for i=1:length(SNR_dB) iError = 0; err_all = 0;for iii=1:nloop(i)iii%产生测试信号msg = rand(Len*Nc/4,1)>=0.5;%turbo编码seridata1 = func_turbo_code(msg,N,M);seridata = [seridata1,zeros(1,Len*Nc-length(seridata1))]';%QPSK映射[Qpsk0,Dqpsk_pilot,symbol_bit] = func_piQPSK_mod(seridata);%变换为矩阵 Qpsk_matrix = reshape(Qpsk0,fftlen,Nc);[Pilot_in,pilot_num,Pilot_seq,pilot_space] = func_insert_pilot(Dqpsk_pilot,Qpsk_matrix,pilot_type,T,TG);Pilot_in = fft(Pilot_in);%sub carrier mappingPilot_in = func_subcarrierMap(Pilot_in); %IFFT transform,产生OFDM信号ifft_out = ifft(Pilot_in);%插入包含间隔 Guard_int = ceil(BWs/fftlen); Guard_int_ofdm = func_guard_interval_insert(ifft_out,fftlen,Guard_int);%将矩阵数据转换为串行进行输出Guard_int_ofdm_out = reshape(Guard_int_ofdm,1,(fftlen+Guard_int)*(Nc+pilot_num));%短波带宽信道,加入多径干扰[Hm,Hmmatrix] = func_mychannels(Radius,Scale1,Scale2,Nh,Nv); [passchan_ofdm_symbol] = func_conv_channels(Hmmatrix,Guard_int_ofdm_out,Nmultipath,Pow_avg,delay_multi,Fre_offset,timeval,iii);Rec_ofdm_symbol = awgn(passchan_ofdm_symbol,SNR_dB(i),'measured');%开始接收%加载同步带来的影响数据load 单独各种同步算法测试\R2.matERR = mean(err1,2);Guard_int_remove = func_guard_interval_remove(Rec_ofdm_symbol,(fftlen+Guard_int),Guard_int,(Nc+pilot_num));Guard_int_remove = Guard_int_remove;%FFTfft_out = fft(Guard_int_remove);%sub carrier demappingfft_out = func_desubcarrierMap(fft_out);fft_out = ifft(fft_out);%信道估计%lmmse[Sig_Lrmmse,Hs] = func_lmmse_est(fft_out,pilot_space,Pilot_seq,pilot_num,delay_avg/timeval,4e-6/timeval,10^(SNR_dB(i)/10));%解调Dqpsk = func_pideMapping(Sig_Lrmmse,fftlen*Nc);%turbo解码Dqpsk_decode = [func_turbo_decode(2*Dqpsk(1:end-(Len*Nc-length(seridata1)))-1,N,M)]';%计算误码率err_num = Len*Nc/4-length(find(msg==Dqpsk_decode(1:Len*Nc/4)));Error = Error + err_num*(1+5*ERR(i+10));end%计算误码率err_all = err_all+Len*Nc/4;Err_Rate(i) = Error/err_all/nloop(i);
end


3.算法部分仿真结果图

 

 

 

 01_167m


4.完整程序获取

使用版本matlab2022a

解压密码:C+123456

获得方式1:

m基于OFDM的同步技术的研究,对比schmidl,minn,park,Landstrom

获取方式2:

如果下载链接失效,加博主微信,或私信。


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
author-avatar
少女24梦_276
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有