1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7 %This script was tested with GNU Octave, version 3.8.2 or Matlab 9.2.0.538062 (R2017a)
12 % 5MHz 10MHz 15MHz 20 MHz
13 nLteNumRbsPerSymF1 = ...
15 % 5MHz 10MHz 15MHz 20 MHz
16 [25, 50, 75, 100] % Numerology 0 (15KHz)
19 % 5MHz 10MHz 15MHz 20 MHz 25 MHz 30 MHz 40 MHz 50MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz
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)
30 % 50Mhz 100MHz 200MHz 400MHz
31 [66, 132, 264, 0] % Numerology 2 (60KHz)
32 [32, 66, 132, 264] % Numerology 3 (120KHz)
35 % total number of tests
37 tech_all = ... % 0 - NR 1- LTE
39 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1
44 true, true, true, true, false, true, true, true, true, true, true, true
49 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0
54 5, 10, 20, 100, 100, 100, 20, 10, 5, 20, 10, 5
59 4, 4, 4, 4, 4, 8, 4, 4, 4, 8, 8, 8
64 false, false, false, false, false, true, false, false, false, true, true, true,
69 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
71 path_to_usecase_all = ...
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/";
87 path_to_usecase_all = cellstr(path_to_usecase_all)
91 40,40,40,40,40,10,40,40,40,10,10,10
94 %select mu and bw to generate test files
95 for test_num =(1:1:tests_total)
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)
107 nSlots=nSlots_all(test_num) % any 40 and 160
115 numRBs = nLteNumRbsPerSymF1(nNumerology,0+1);
117 numRBs = nLteNumRbsPerSymF1(nNumerology,1+1);
119 numRBs = nLteNumRbsPerSymF1(nNumerology,2+1);
121 numRBs = nLteNumRbsPerSymF1(nNumerology,3+1);
131 numRBs = nNumRbsPerSymF1(nNumerology,0+1);
133 numRBs = nNumRbsPerSymF1(nNumerology,1+1);
135 numRBs = nNumRbsPerSymF1(nNumerology,2+1);
137 numRBs = nNumRbsPerSymF1(nNumerology,3+1);
139 numRBs = nNumRbsPerSymF1(nNumerology,4+1);
141 numRBs = nNumRbsPerSymF1(nNumerology,5+1);
143 numRBs = nNumRbsPerSymF1(nNumerology,6+1);
145 numRBs = nNumRbsPerSymF1(nNumerology,7+1);
147 numRBs = nNumRbsPerSymF1(nNumerology,8+1);
149 numRBs = nNumRbsPerSymF1(nNumerology,9+1);
151 numRBs = nNumRbsPerSymF1(nNumerology,10+1);
153 numRBs = nNumRbsPerSymF1(nNumerology,11+1);
155 numRBs = nNumRbsPerSymF1(nNumerology,12+1);
157 disp('Unknown BW && mu')
162 if (mu >=2) && (mu <= 3)
166 numRBs = nNumRbsPerSymF2(nNumerology-1,0+1);
168 numRBs = nNumRbsPerSymF2(nNumerology-1,1+1);
170 numRBs = nNumRbsPerSymF2(nNumerology-1,2+1);
172 numRBs = nNumRbsPerSymF2(nNumerology-1,3+1);
174 disp('Unknown BW && mu')
180 disp('Incorrect Numerology and BW combination.')
189 %ifft_in = load('ifft_in.txt')
192 ifft_in = [[1:1:(numRBs*12)]', [1:1:(numRBs*12)]'];
195 for (i=1:1:nSlots*14-1)
196 ifft_in_1 = ifft_in + i;
197 ant_c = [ant_c; ifft_in_1];
200 %write files for IQ samples
201 for ant = 1:1:ant_num
203 antX_16=int16(antX.');
204 file_name = strcat(path_to_usecase,"ant_", num2str(ant-1),".bin");
206 fileID = fopen(file_name,'w');
207 fwrite(fileID, antX_16, 'int16');
212 disp('Generate BF Weights per RB')
214 %seed to make it repeatable
217 %random channel matrix for single sym on syngle RB
218 H = (rand(trx,ant_num) + 1j*rand(trx,ant_num));
221 % W_dl = H^*(H^TH^*)^-1
222 % W_ul = ((H^H*H)^-1)H^H
223 % where H^* - conjugate
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
231 for ant = 1:1:ant_num
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]];
241 %reuse channel for all symbols
242 for (slot_idx=1:1:nSlots*14)
243 bfw_all_slots = [bfw_all_slots, bfw_per_sym];
246 bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);
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");
252 fileID = fopen(file_name,'w');
253 fwrite(fileID,antX_16, 'int16');
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]];
264 %reuse channel for all symbols
265 for (slot_idx=1:1:nSlots*14)
266 bfw_all_slots = [bfw_all_slots, bfw_per_sym];
269 bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);
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");
275 fileID = fopen(file_name,'w');
276 fwrite(fileID,antX_16, 'int16');