OFDM同步算法之Schmidl算法
Schmidl算法代码
算法原理
训练序列结构 T=[A A],其中A表示复伪随机序列PN,进行N/2点ifft变换得到的符号序列
\]
\]
\]
\]
所求得的d对应的是训练序列(不包含循环前缀)的开始位置。
★Schmidl:Schmidl算法利用一个由两端时域上完全相同的序列的前导来进行定时同步,但是这种方法得到的同步效果并不好,其同步度量函数曲线存在一个平顶,这使得定时同步估计存在偏差和不确定性。
参考文献
Schmidl T M,COX D C.Robust frequency and timing synchronization for OFDM[J].IEEE Trans.Commun.,1997,45(12):1613-1612.
%********************schmidl algorithm*******************
%Example:
% If
% X = rand(2,3,4);
% then
% d = size(X) returns d = [2 3 4]
% [m1,m2,m3,m4] = size(X) returns m1 = 2, m2 = 3, m3 = 4, m4 = 1
% [m,n] = size(X) returns m = 2, n = 12
% m2 = size(X,2) returns m2 = 3
close all;
clear all;
clc;
%参数定义
N=256; %FFT/IFFT 变换的点数或者子载波个数(Nu=N)
Ng=N/8; %循环前缀的长度 (保护间隔的长度)
Ns=Ng+N; %包括循环前缀的符号长度
%************利用查表法生成复随机序列**********************
QAMTable=[7+7i,-7+7i,-7-7i,7-7i];
buf=QAMTable(randi([0,3],N/2,1)+1); %加1是为了下标可能是0不合法
%*************在奇数子载波的位置插入零*********************zj:是偶数吧?
x=zeros(N,1);
index = 1;
for n=1:2:N
x(n)=buf(index);
index=index+1;
end;
%**************利用IFFT变换生成Schmidl训练符号***************
sch = ifft(x); %[A A]的形式
%*****************添加一个空符号以及一个后缀符号*************
src = QAMTable(randi([0,3],N,1)+1).';
sym = ifft(src);
sig =[zeros(N,1) sch sym];
%**********************添加循环前缀*************************
tx =[sig(N - Ng +1:N,:);sig];
%***********************经过信道***************************
recv = reshape(tx,1,size(tx,1)*size(tx,2)); %size的1表示行,2表示列,从%前向后数,超过了为1
%recv1 = awgn(recv,1,'measured');
%recv2 = awgn(recv,5,'measured');
%recv3 = awgn(recv,10,'measured');
%*****************计算符号定时*****************************
P=zeros(1,2*Ns);
R=zeros(1,2*Ns);
%P1=zeros(1,2*Ns);
%R1=zeros(1,2*Ns);
P2=zeros(1,2*Ns);
R2=zeros(1,2*Ns);
%P3=zeros(1,2*Ns);
%R3=zeros(1,2*Ns);
for d = Ns/2+1:1:2*Ns
for m=0:1:N/2-1
P(d-Ns/2) = P(d-Ns/2) + conj(recv(d+m))*recv(d+N/2+m);
R(d-Ns/2) = R(d-Ns/2) + power(abs(recv(d+N/2+m)),2);
%P1(d-Ns/2) = P1(d-Ns/2) + conj(recv1(d+m))*recv1(d+N/2+m);
%R1(d-Ns/2) = R1(d-Ns/2) + power(abs(recv1(d+N/2+m)),2);
%P2(d-Ns/2) = P2(d-Ns/2) + conj(recv2(d+m))*recv2(d+N/2+m);
%R2(d-Ns/2) = R2(d-Ns/2) + power(abs(recv2(d+N/2+m)),2);
% P3(d-Ns/2) = P3(d-Ns/2) + conj(recv3(d+m))*recv3(d+N/2+m);
% R3(d-Ns/2) = R3(d-Ns/2) + power(abs(recv3(d+N/2+m)),2);
end
end
M=power(abs(P),2)./power(abs(R),2);
%M1=power(abs(P1),2)./power(abs(R1),2);
%M2=power(abs(P2),2)./power(abs(R2),2);
%M3=power(abs(P3),2)./power(abs(R3),2);
%**********************绘图******************************
figure('Color','w');
d=1:1:400;
figure(1);
plot(d,M(d));
grid on;
axis([0,400,0,1.1]);
title('schmidl algorithm');
xlabel('Time (sample)');
ylabel('Timing Metric');
%legend('no noise','SNR=1dB','SNR=5dB','SNR=10dB');
hold on;
OFDM同步算法之Schmidl算法的更多相关文章
- OFDM同步算法之Park算法
park算法代码 训练序列结构 T=[\(C\) \(D\) \(C^{*}\) \(D^{*}\)],其中C表示由长度为N/4的复伪随机序列PN,ifft变换得到的符号序列 \(C(n) = D(N ...
- OFDM同步算法之Minn算法
minn算法代码 算法原理 训练序列结构 T=[B B -B -B],其中B表示由长度为N/4的复伪随机序列PN,ifft变换得到的符号序列 (原文解释):B represent samples of ...
- FPGA与MATLAB数据交互高效率验证算法——仿真阶段
之前博文是对基本设计技巧的总结和一些小设计随笔,内容有点杂,缺乏目的性.本来后续计划设计几个小项目,但导师的任务比较紧,所以为了提高效率,后续博客会涉及到很多算法方面的设计与验证的内容,主要关于OFD ...
- Zookeeper--0100--简介说明
1.1-Zookeeper简介 什么是Zookeeper? Zookeeper是一个高效的分布式协调服务,它暴露了一些公共服务,比如命名/配置/管理/同步控制/群组服务等.我们可以使用ZK来实现比如达 ...
- MIMO OFDM 常用信号检测算法
MIMO OFDM 系统检测算法 1. 前言 MIMO的空分复用技术可以使得系统在系统带宽和发射带宽不变的情况下容易地获得空间分集增益和信道的容量增益.OFDM技术采用多个正交的子载波并行传输数据,使 ...
- 非阻塞同步算法与CAS(Compare and Swap)无锁算法
锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...
- 【Java并发编程】9、非阻塞同步算法与CAS(Compare and Swap)无锁算法
转自:http://www.cnblogs.com/Mainz/p/3546347.html?utm_source=tuicool&utm_medium=referral 锁(lock)的代价 ...
- 非阻塞同步算法实战(三)-LatestResultsProvider
本人是本文的作者,首发于ifeve(非阻塞同步算法实战(三)-LatestResultsProvider) 前言 阅读本文前,需要读者对happens-before比较熟悉,了解非阻塞同步的一些基本概 ...
- 信号量和PV操作写出Bakery算法的同步程序
面包店烹制面包及蛋糕,由n个销售员卖出.当有顾客进店购买面包或蛋糕时,应先在取号机上取号,然后等待叫号,若有销售员空闲时便叫下一号,试用信号量和PV操作写出Bakery算法的同步程序. 设计要求 1) ...
随机推荐
- https://segmentfault.com/a/1190000012844836---------关于SpringBoot上传图片的几种方式
关于SpringBoot上传图片的几种方式 https://segmentfault.com/a/1190000012844836
- C#装饰模式
using System;using System.Collections.Generic;using System.Text; namespace 装饰模式{ class Person ...
- 我不喜欢的 Rust 特性 (之一) eager drop
struct Foo; impl Drop for Foo { fn drop(&mut self) { println!("drop"); } } fn main() { ...
- JAVA之中出现无法加载主类的情况解决方法
j今天打代码的时候出现了无法加载主类的情况,我就收集了一些,java无法加载主类的方法 ava无法加载主类解决办法 今天启动项目,又遇到找不到或无法加载主类的情况,清除项目后无法编译,class文件下 ...
- Angularjs中添加ckEditor插件
使用方法看注释.主要解决帮上ngModel的问题 angular.module('newApp') .directive('ckeEditor', function() { return { /* F ...
- ssh连接失败
参考:http://www.cnblogs.com/starof/p/4709805.html https://www.chenyudong.com/archives/ssh-using-privat ...
- C#之插入排序
算法描述 1.假定数组第一位为有序序列,抽出后一位元素与有序序列中元素依次比较: 2.如果有序序列元素大于抽出元素,将该元素向后移位: 3.重复前面步骤依次抽取无序序列中首位元素进行比较,直到所有数值 ...
- Solr基础教程之solrconfig.xml(三)
前面介绍过schema.xml的一些配置信息,本章介绍solrconfig.xml的配置,以及怎样安装smartcn分词器和IK分词器,并介绍主要的查询语法. 1. solr配置solrconfig. ...
- [转] CV Datasets on the web
转自:CVPapers This material is presented to ensure timely dissemination of scholarly and technical wor ...
- NYOJ_58最少步数(queue+BFS)
描写叙述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 ...