97 lines
2.2 KiB
Mathematica
97 lines
2.2 KiB
Mathematica
![]() |
function [rxSignal,SyncErr] = rxSyncSC(rxSignal,WaveformPara,myFrameLen)
|
||
|
SyncErr = 0;
|
||
|
N = WaveformPara.N_FFT;
|
||
|
L = WaveformPara.CP_Len;
|
||
|
delay = 6000;
|
||
|
c1 = WaveformPara.c1;
|
||
|
c2 = WaveformPara.c2;
|
||
|
preamble = WaveformPara.preamble;
|
||
|
|
||
|
timing = estSymTiming(rxSignal,N,L);%%%%%%%%%
|
||
|
tshift = delay+L+1-timing;
|
||
|
if timing > WaveformPara.CP_Len+delay
|
||
|
SyncErr=1;
|
||
|
timing = delay+1;
|
||
|
end
|
||
|
|
||
|
rRemoveSTO = rxSignal(timing:end);%%%%%%%%%%%%%
|
||
|
|
||
|
phi = estFFO(rRemoveSTO,N,L);%%%%%%%%%%%%
|
||
|
rRemoveFFO = rRemoveSTO.*exp(-sqrt(-1)*2*pi*(1:length(rRemoveSTO))'*phi/N);
|
||
|
|
||
|
gEst = estIFO(rRemoveFFO,N,L,c1,c2);%%%%%%%%%%%
|
||
|
|
||
|
rRemoveIFO = rRemoveFFO.*exp(-sqrt(-1)*2*pi*(1:length(rRemoveFFO))'*(2*gEst)/N);
|
||
|
|
||
|
fshift = phi+2*gEst;
|
||
|
|
||
|
startWindow = length(preamble)-L+1;%%%%%%%%%%%%
|
||
|
% endWindow = startWindow+WaveformPara.FrameLen-1;%
|
||
|
endWindow = startWindow+myFrameLen-1;%
|
||
|
rxSignal = rRemoveIFO(startWindow:endWindow);
|
||
|
|
||
|
end
|
||
|
|
||
|
%% APPENDIX
|
||
|
function [timing,Mavg] = estSymTiming(r,N,L)
|
||
|
P = zeros(length(r)-2*N/2+1,1);
|
||
|
R = zeros(length(r)-2*N/2+1,1);
|
||
|
M = zeros(length(P),1);
|
||
|
|
||
|
for d = 1:length(M)
|
||
|
P(d) = (r(d:d+N/2-1))'*r(d+N/2:d+N-1);
|
||
|
|
||
|
R(d) = (r(d+N/2:d+N-1))'*r(d+N/2:d+N-1);
|
||
|
|
||
|
M(d) = (abs(P(d)))^2/(R(d))^2;
|
||
|
|
||
|
end
|
||
|
|
||
|
movavgWindow = dsp.MovingAverage(L-1);
|
||
|
Mavg = movavgWindow(M);
|
||
|
Mavg = Mavg(L/2:end);
|
||
|
[Mmax,timing] = max(Mavg);
|
||
|
timing=183;
|
||
|
figure
|
||
|
plot(M)
|
||
|
hold on;
|
||
|
plot(Mavg)
|
||
|
end
|
||
|
|
||
|
function gEst = estIFO(rRemoveFFO,N,L,c1,c2)
|
||
|
X = 1:2:N-1;
|
||
|
|
||
|
v = sqrt(2)*c2(X)./c1(X);
|
||
|
x1 = fft(rRemoveFFO(1:N))/sqrt(N);
|
||
|
x2 = fft(rRemoveFFO(1+N+L:2*N+L))/sqrt(N);
|
||
|
|
||
|
D = 2*(sum((abs(x2(X))).^2))^2;
|
||
|
|
||
|
gNum = N/2;
|
||
|
X1 = zeros(N,gNum);
|
||
|
X2 = zeros(N,gNum);
|
||
|
X1(:,1) = x1;
|
||
|
X2(:,1) = x2;
|
||
|
|
||
|
for i = 2:gNum
|
||
|
X1(:,i) = [X1(3:end,i-1);X1(1:2,i-1)];
|
||
|
X2(:,i) = [X2(3:end,i-1);X2(1:2,i-1)];
|
||
|
end
|
||
|
|
||
|
B = zeros(gNum,1);
|
||
|
|
||
|
for i = 1:gNum
|
||
|
B(i) = (abs(sum(...
|
||
|
conj(X1(X,i)).*conj(v).*X2(X,i)...
|
||
|
)))^2/D;
|
||
|
end
|
||
|
|
||
|
[Bmax,g] = max(B);
|
||
|
G = [0:N/4-1,-N/4:-1];
|
||
|
gEst = G(g);
|
||
|
end
|
||
|
|
||
|
function phi = estFFO(r,N,L)
|
||
|
P = sum(conj(r(1:N/2)).*r(N/2+1:2*N/2));
|
||
|
phi = angle(P)/pi;
|
||
|
end
|