OFDM同步演算法之Schmidl演算法

2022-08-10 20:42:12 字數 3522 閱讀 6787

schmidl演算法**

演算法原理

訓練序列結構 t=[a a],其中a表示復偽隨機序列pn,進行n/2點ifft變換得到的符號串行

\[m(d)=\frac(d)}^

\]\[p(d)=\sum_^r^(d+m) r(d+m+l)

\]\[r(d)=\sum_^\left | r(d+m+l) \right |^

\]\[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;

增量更新同步 檔案增量同步之rsync演算法

之前畢設有用到檔案增量同步,於是乎就記錄一下。在a和b兩個不同端之間有相似度很高的檔案,同時這個檔案又比較大。如果通過全量傳輸來更新,http傳輸量很大,非常不友好。那麼可以通過某些手段,只上傳修改的內容,其餘內容復用舊檔案。對於a b檔案進行同步為例,首先對a檔案進行分塊,並且對每一塊進行摘要計算...

程序同步之Perterson演算法

程序同步主要用來解決臨界區問題,簡單來講就是確保同一時間只能有乙個程序訪問臨界區。現在介紹乙個比較經典的peterson演算法。peterson演算法的表述如下 對於程序pi和pj來說,設定乙個整數變數turn來確定誰可以進入臨界區,和乙個整型陣列flag 2 來確定誰想進去臨界區。do我們可以這麼...

非阻塞同步演算法

treiber 1986 棧頂為一串行 public class concurrentstackwhile top.compareandset oldhead,newhead public e pop newhead oldhead.next while top.compareandset oldh...