source: ResearchApps/PHY/WARPLAB/ResearchExamples/LTE_Setup/LTE_MATLAB_Reference_Files/1user_mimo/warplab_findLongTrainingStart.m

Last change on this file was 1590, checked in by mduarte, 14 years ago
File size: 3.4 KB
Line 
1function [LongTrainingStart,ValidStart, Corr] = warplab_findLongTrainingStart(RxData,LongTrainingSymbols_up2,AGC_Set_Address)
2
3% The long training symbols are used for timing synchronization
4
5% The long training symbols (LongTrainingSymbols_up2) consist of two long
6% symbols with a 64 sample cyclic prefix.
7
8%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9% Step 0: Correlate with reference signal
10%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11% The long training symbols arrive within the 672 samples after the AGC
12% sets the gains. Hence, to find the long training symbols we will only
13% consider the 672 samples after the AGC sets the gains.
14RxData_Window = RxData(AGC_Set_Address+1:AGC_Set_Address+672);
15
16% Correlate the received signal (RxData_Window) with the long training
17% symbols (LongTrainingSymbols_up2). Beacause of the symmetry of the
18% LongTrainingSymbols_up2 signal we can use the conv() function to perform
19% the correlation.
20
21Conv = conv(RxData_Window,LongTrainingSymbols_up2);
22Corr = abs(Conv);
23
24%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
25% Step 1: Find the two peaks in the Corr vector. These peaks indicate the
26% end of a long symbol. The long training sysmbols consist of two long
27% symbols
28%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
29[CorrSorted, CorrSortedIndices] = sort(Corr);
30CorrSortedIndices=CorrSortedIndices(end:-1:1);
31peak_1_index = CorrSortedIndices(1);
32peak_2_index = CorrSortedIndices(2);
33% The two peaks must be 64x2=128 samples away. One peak's correlation (for
34% example peak A) may be much higher or wider than the other one, resulting
35% in two or more values around peak A being larger than peak B. In that
36% case variables peak_1_index and peak_2_index are only a few samples away,
37% instead of 128 samples away. The following if statement checks that the two peak
38% indexes peak_1_index and peak_2_index are not corresponding to the same
39% peak. IF so it tries to correct and checks again, it corrects again and
40% if the third check fails then it gives up.
41if(128 ~= abs(peak_2_index-peak_1_index))
42    peak_2_index = CorrSortedIndices(3);
43end
44if(128 ~= abs(peak_2_index-peak_1_index))
45    peak_2_index = CorrSortedIndices(4);
46end
47if(128 ~= abs(peak_2_index-peak_1_index))
48    peak_2_index = CorrSortedIndices(5);
49end
50ValidStart = 1;
51if(128 ~= abs(peak_2_index-peak_1_index))
52    disp('Invalid correlation values for timing synchronization !');
53    peak1 = peak_1_index;
54    peak2 = peak_2_index;
55    peakdiff = peak_2_index-peak_1_index;
56    ValidStart = 0;
57end
58
59if(peak_1_index > peak_2_index)
60    var = peak_1_index;
61    peak_1_index = peak_2_index;
62    peak_2_index = var;
63end
64
65% Store Address where the first long symbol in the long training symbols
66% starts
67FirstLongSymbol_Start = peak_1_index - 128;
68% Long training symbols have a 64 sample cyclic prefix hence long training
69% symbols start 64 samples before the first long symbol starts
70LongTrainingStart = FirstLongSymbol_Start - 64;
71% Take in count the AGC_Set_Address offset
72LongTrainingStart = LongTrainingStart + AGC_Set_Address;
73
74
75%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76% Plotting for debugging purposes
77%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
78% figure
79% subplot(2,2,1)
80% plot(real(Conv))
81% subplot(2,2,2)
82% plot(imag(Conv))
83% subplot(2,2,3)
84% plot(Corr)
85% subplot(2,2,4)
86% plot(angle(Conv))
87
Note: See TracBrowser for help on using the repository browser.