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