minn算法代码

算法原理

训练序列结构 T=[B B -B -B],其中B表示由长度为N/4的复伪随机序列PN,ifft变换得到的符号序列


(原文解释):B represent samples of length L=N/4 genereated by N/4 point IFFT of \(N_u/4\) length modulated data of a PN sequence.也就是说B是一个长度为N/4的序列,其通过对一个PN序列进行编码后,通过IFFT获得


\(\bigstar\)minn:为了消除Schmidl算法出现的平顶影响,minn等人改变了训练队列的结构,并重新设计了一种新的同步度量函数,虽然成功消除了schmidl算法的平顶效应,使得同步自相关峰变得尖锐,提高了定时同步估计的精度和可靠性,但是该向相关峰还不够尖锐,而且在同步度量函数曲线主峰两边出现了多个副峰,在信道环境恶劣的条件下,也即低信噪比条件下,定时同步估计将受到较大的影响。

参考文献

Minn H ,Zeng M,BHARGAVA V K.On timing offser estimation for OFDM systems[J].IEEE Commun.Lett.2000,4(7):242-244.

\[M(d)=\frac{\left | P(d) \right |}{R^{2}(d)}^{2}
\]

\[P(d)=\sum_{k=0}^{1}\sum_{m=0}^{N/4 -1}r^{*}(d+m+\frac{Nk}{2}) r(d+m+\frac{N}{4} + \frac{Nk}{2})
\]

\[R(d)=\sum_{k=0}^{1}\sum_{m=0}^{N/4-1}\left | r(d+m+\frac{N}{4} + \frac{Nk}{2}) \right |^{2}
\]

所求得的d对应的是训练序列(不包含循环前缀)的开始位置。

%********************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/2,1);
index = 1;
for n=1:2:N/2
x(n)=buf(index);
index=index+1;
end; %**************利用IFFT变换生成Schmidl训练符号***************
sch = ifft(x); %[A A]的形式
sch2=[sch;(-1).*sch]; %*****************添加一个空符号以及一个后缀符号*************
src = QAMTable(randi([0,3],N,1)+1).';
sym = ifft(src);
sig =[zeros(N,1) sch2 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 k=1:2
for m=0:1:N/4-1
P(d-Ns/2) = P(d-Ns/2) + conj(recv(d+m+(k-1)*N/2))*recv(d+N/4+(k-1)*N/2+m);
R(d-Ns/2) = R(d-Ns/2) + power(abs(recv(d+N/4+(k-1)*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
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);
[a b]=max(M)
%**********************绘图******************************
figure('Color','w');
d=1:1:400;
figure(1);
plot(d,M(d));
grid on;
axis([0,400,0,1.1]);
title('minn algorithm');
xlabel('Time (sample)');
ylabel('Timing Metric');
%legend('no noise','SNR=1dB','SNR=5dB','SNR=10dB');
hold on;

最新文章

  1. 大神的Blog挂了,从Bing快照里复制过来的备份
  2. JS之获取属性总结
  3. jvm学习
  4. php在window下的环境配置(VC9)
  5. can't run as root without the -u switch
  6. php5.3 连接 sqlserver2005
  7. linux shell 命令学习(3) split - split a file into pieces
  8. 属性通知之INotifyPropertyChanged
  9. CSS基础知识——选择器
  10. (转)WIN2003服务器禁PING的方法
  11. linux下编译安装mysql5.5以上版本
  12. C#控制台程序使用Log4net日志组件
  13. GoodReads: Machine Learning (Part 3)
  14. eslint使用
  15. CAFFE在win10+VS2017下的安装笔记
  16. spingBoot整合mybatis+generator+pageHelper
  17. Introducing Apache Spark Datasets(中英双语)
  18. Paxos算法1-算法形成理论[转载]
  19. 如何获取某个网站的favicon.ico
  20. js函数在frame中的相互调用详解

热门文章

  1. LightOJ 1348 Aladdin and the Return Journey
  2. Docker Command
  3. 母函数(Generating function)详解
  4. OC-内存管理的一些要点
  5. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式
  6. LeetCode 893. Groups of Special-Equivalent Strings (特殊等价字符串组)
  7. splay专题复习——bzoj 3224 & 1862 & 1503 题解
  8. 1732 Fibonacci数列 2
  9. 20170623_oracle备份和恢复_常见问题
  10. ios7--UIImageView