1. 程式人生 > >OFDM同步算法之Schmidl算法

OFDM同步算法之Schmidl算法

文獻 計算 完全 ble 同步 tro algo 位置 src

Schmidl算法代碼

算法原理

訓練序列結構 T=[A A],其中A表示復偽隨機序列PN,進行N/2點ifft變換得到的符號序列

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

\[P(d)=\sum_{m=0}^{L-1}r^{*}(d+m) r(d+m+L)\]

\[R(d)=\sum_{m=0}^{L-1}\left | r(d+m+L) \right |^{2}\]

\[L=N/2\]

所求得的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算法