Update to odulow per maintenance bronze
[o-du/phy.git] / fhi_lib / app / gen_test.m
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 %
3 % <COPYRIGHT_TAG>
4 %
5 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6
7 %This script was tested with GNU Octave, version 3.8.2 or Matlab 9.2.0.538062 (R2017a) 
8
9 close all;
10 clear all;
11
12      %  5MHz    10MHz   15MHz   20 MHz  
13 nLteNumRbsPerSymF1 = ...
14 [
15      %  5MHz    10MHz   15MHz   20 MHz  
16         [25,    50,     75,     100]         % Numerology 0 (15KHz)
17 ];
18
19      %  5MHz    10MHz   15MHz   20 MHz  25 MHz  30 MHz  40 MHz  50MHz   60 MHz  70 MHz  80 MHz   90 MHz  100 MHz
20 nNumRbsPerSymF1 = ...
21 [
22      %  5MHz    10MHz   15MHz   20 MHz  25 MHz  30 MHz  40 MHz  50MHz   60 MHz  70 MHz  80 MHz   90 MHz  100 MHz
23         [25,    52,     79,     106,    133,    160,    216,    270,    0,         0,      0,      0,      0]         % Numerology 0 (15KHz)
24         [11,    24,     38,     51,     65,     78,     106,    133,    162,       0,    217,    245,    273]         % Numerology 1 (30KHz)
25         [0,     11,     18,     24,     31,     38,     51,     65,     79,        0,    107,    121,    135]         % Numerology 2 (60KHz)
26 ];
27
28 nNumRbsPerSymF2 = ...
29 [
30     %  50Mhz  100MHz  200MHz   400MHz
31         [66,    132,    264,     0]        % Numerology 2 (60KHz)
32         [32,    66,     132,     264]      % Numerology 3 (120KHz)
33 ];
34
35 % total number of tests
36 tests_total = 12
37 tech_all = ... % 0 - NR 1- LTE
38     [ 
39       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1  
40     ]
41
42 sub6_all = ...
43     [ 
44       true, true, true, true, false, true, true, true, true, true, true, true
45     ]
46
47 mu_all = ...
48     [
49       0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0
50     ]
51
52 bw_all = ...
53     [
54       5, 10, 20, 100, 100, 100, 20, 10, 5, 20, 10, 5
55     ]
56
57 ant_num_all = ...
58     [
59       4, 4, 4, 4, 4, 8, 4, 4, 4, 8, 8, 8
60     ]
61
62 bfw_gen_all = ...
63     [
64       false, false, false, false, false, true, false, false, false, true, true, true,
65     ]
66
67 trx_all = ...
68     [ 
69       32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
70     ]
71 path_to_usecase_all = ... 
72     [
73       "./usecase/mu0_5mhz/"; 
74       "./usecase/mu0_10mhz/"; 
75       "./usecase/mu0_20mhz/"; 
76       "./usecase/mu1_100mhz/"; 
77       "./usecase/mu3_100mhz/"; 
78       "./usecase/cat_b/mu1_100mhz/";
79       "./usecase/lte_a/mu0_20mhz/";
80       "./usecase/lte_a/mu0_10mhz/";
81       "./usecase/lte_a/mu0_5mhz/";
82       "./usecase/lte_b/mu0_20mhz/";
83       "./usecase/lte_b/mu0_10mhz/";
84       "./usecase/lte_b/mu0_5mhz/";      
85     ]
86
87 path_to_usecase_all = cellstr(path_to_usecase_all) 
88
89 nSlots_all = ...
90     [
91        40,40,40,40,40,10,40,40,40,10,10,10 
92     ]
93
94 %select mu and bw to generate test files
95 for test_num =(1:1:tests_total)
96     test_num
97     isLte=tech_all(test_num)  %false 
98     sub6=sub6_all(test_num)  %false
99     mu=mu_all(test_num) % 0,1, or 3
100     bw=bw_all(test_num) %5,10,20,100 MHz
101     ant_num = ant_num_all(test_num)
102     bfw_gen=bfw_gen_all(test_num)
103     trx = trx_all(test_num)
104     size(path_to_usecase_all)
105     path_to_usecase = path_to_usecase_all(test_num)
106
107     nSlots=nSlots_all(test_num) % any 40 and 160
108
109     if isLte
110         disp('LTE')
111         if mu < 3
112             nNumerology = mu+1;
113             switch (bw)
114                 case {5}
115                     numRBs = nLteNumRbsPerSymF1(nNumerology,0+1);
116                 case {10}
117                     numRBs = nLteNumRbsPerSymF1(nNumerology,1+1);
118                 case {15}
119                     numRBs = nLteNumRbsPerSymF1(nNumerology,2+1);
120                 case {20}
121                     numRBs = nLteNumRbsPerSymF1(nNumerology,3+1);
122             end
123         end
124     else
125         if sub6
126             disp('Sub6')
127             if mu < 3
128                 nNumerology = mu+1;
129                 switch (bw)
130                     case {5}
131                         numRBs = nNumRbsPerSymF1(nNumerology,0+1);
132                     case {10}
133                         numRBs = nNumRbsPerSymF1(nNumerology,1+1);
134                     case {15}
135                         numRBs = nNumRbsPerSymF1(nNumerology,2+1);
136                     case {20}
137                         numRBs = nNumRbsPerSymF1(nNumerology,3+1);
138                     case {25}
139                         numRBs = nNumRbsPerSymF1(nNumerology,4+1);
140                     case {30}
141                         numRBs = nNumRbsPerSymF1(nNumerology,5+1);
142                     case {40}
143                         numRBs = nNumRbsPerSymF1(nNumerology,6+1);
144                     case {50}
145                         numRBs = nNumRbsPerSymF1(nNumerology,7+1);
146                     case {60}
147                         numRBs = nNumRbsPerSymF1(nNumerology,8+1);
148                     case {70}
149                         numRBs = nNumRbsPerSymF1(nNumerology,9+1);
150                     case {80}
151                         numRBs = nNumRbsPerSymF1(nNumerology,10+1);
152                     case {90}
153                         numRBs = nNumRbsPerSymF1(nNumerology,11+1);
154                     case {100}
155                         numRBs = nNumRbsPerSymF1(nNumerology,12+1);
156                     otherwise
157                         disp('Unknown BW && mu')
158                 end
159             end
160         else
161             disp('mmWave')
162             if  (mu >=2) && (mu <= 3)
163                 nNumerology = mu;
164                 switch (bw)
165                     case {50}
166                         numRBs = nNumRbsPerSymF2(nNumerology-1,0+1);
167                     case {100}
168                         numRBs = nNumRbsPerSymF2(nNumerology-1,1+1);
169                     case {200}
170                         numRBs = nNumRbsPerSymF2(nNumerology-1,2+1);
171                     case {400}
172                         numRBs = nNumRbsPerSymF2(nNumerology-1,3+1);
173                     otherwise
174                         disp('Unknown BW && mu')
175                 end
176             end
177         end
178     end
179     if numRBs ==0
180         disp('Incorrect Numerology and BW combination.')
181         return
182     end
183
184     bw
185     numRBs
186     nSlots
187
188     %use file as input
189     %ifft_in = load('ifft_in.txt')
190
191     %gen IQs
192     ifft_in = [[1:1:(numRBs*12)]', [1:1:(numRBs*12)]'];
193
194     ant_c = ifft_in;
195     for (i=1:1:nSlots*14-1)
196         ifft_in_1 = ifft_in + i;
197         ant_c = [ant_c; ifft_in_1];
198     end
199
200     %write files for IQ samples 
201     for ant = 1:1:ant_num
202         antX=ant_c*(ant*10);
203         antX_16=int16(antX.');
204         file_name = strcat(path_to_usecase,"ant_", num2str(ant-1),".bin");
205         disp(file_name)
206         fileID = fopen(file_name,'w');
207         fwrite(fileID, antX_16, 'int16');
208         fclose(fileID);    
209     end
210
211     if bfw_gen
212         disp('Generate BF Weights per RB')
213
214         %seed to make it repeatable 
215         rand('seed',47)
216
217         %random channel matrix for single sym on syngle RB 
218         H = (rand(trx,ant_num) + 1j*rand(trx,ant_num));
219
220         %calculate weights 
221         % W_dl = H^*(H^TH^*)^-1
222         % W_ul =  ((H^H*H)^-1)H^H
223         % where H^* - conjugate 
224         %       H^T - transpose
225         %       H^H - conjugate transpose 
226         W_dl = conj(H)*(transpose(H)*conj(H))^-1; %weights for DL
227         W_ul = ((ctranspose(H)*H)^-1)*ctranspose(H); %weights for UL
228
229         W_ul = W_ul.';
230
231         for ant = 1:1:ant_num
232             %DL 
233
234             bfw_per_sym = [];
235             % adjust channel per each RB 
236             for iPrb = 1:1:numRBs
237                bfw_per_sym = [ bfw_per_sym, [real((W_dl(:, ant).'))*iPrb; imag((W_dl(:, ant).'))*iPrb]];
238             end
239
240             bfw_all_slots = [];
241             %reuse channel for all symbols  
242             for (slot_idx=1:1:nSlots*14)
243                 bfw_all_slots = [bfw_all_slots, bfw_per_sym];
244             end
245
246             bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);
247
248             %write files for IQ samples 
249             antX_16=bfw_all_slots_int.';
250             file_name = strcat(path_to_usecase,"dl_bfw_ue_", num2str(ant-1),".bin");
251             disp(file_name)
252             fileID = fopen(file_name,'w');
253             fwrite(fileID,antX_16, 'int16');
254             fclose(fileID);    
255
256             %UL 
257             bfw_per_sym = [];
258             % adjust channel per each RB 
259             for iPrb = 1:1:numRBs
260                bfw_per_sym = [ bfw_per_sym, [real((W_ul(:, ant).'))*iPrb; imag((W_ul(:, ant).'))*iPrb]];
261             end
262
263             bfw_all_slots = [];
264             %reuse channel for all symbols  
265             for (slot_idx=1:1:nSlots*14)
266                 bfw_all_slots = [bfw_all_slots, bfw_per_sym];
267             end
268
269             bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);
270
271             %write files for IQ samples 
272             antX_16=bfw_all_slots_int.';
273             file_name = strcat(path_to_usecase,"ul_bfw_ue_", num2str(ant-1),".bin");
274             disp(file_name)
275             fileID = fopen(file_name,'w');
276             fwrite(fileID,antX_16, 'int16');
277             fclose(fileID);    
278         end  
279     end
280 end