1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
5 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
7 %This script was tested with GNU Octave, version 3.8.2 or Matlab 9.2.0.538062 (R2017a)
\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
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
21 nNumRbsPerSymF2 = ...
\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
28 % total number of tests
\r
32 true, true, true, true, false, true,
\r
42 5, 10, 20, 100, 100, 100
\r
52 false, false, false, false, false, true
\r
57 32, 32, 32, 32, 32, 32
\r
59 path_to_usecase_all = ...
\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
69 path_to_usecase_all = cellstr(path_to_usecase_all)
\r
76 %select mu and bw to generate test files
\r
77 for test_num =(1:1:tests_total)
\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
88 nSlots=nSlots_all(test_num) % any 40 and 160
\r
96 numRBs = nNumRbsPerSymF1(nNumerology,0+1);
\r
98 numRBs = nNumRbsPerSymF1(nNumerology,1+1);
\r
100 numRBs = nNumRbsPerSymF1(nNumerology,2+1);
\r
102 numRBs = nNumRbsPerSymF1(nNumerology,3+1);
\r
104 numRBs = nNumRbsPerSymF1(nNumerology,4+1);
\r
106 numRBs = nNumRbsPerSymF1(nNumerology,5+1);
\r
108 numRBs = nNumRbsPerSymF1(nNumerology,6+1);
\r
110 numRBs = nNumRbsPerSymF1(nNumerology,7+1);
\r
112 numRBs = nNumRbsPerSymF1(nNumerology,8+1);
\r
114 numRBs = nNumRbsPerSymF1(nNumerology,9+1);
\r
116 numRBs = nNumRbsPerSymF1(nNumerology,10+1);
\r
118 numRBs = nNumRbsPerSymF1(nNumerology,11+1);
\r
120 numRBs = nNumRbsPerSymF1(nNumerology,12+1);
\r
122 disp('Unknown BW && mu')
\r
127 if (mu >=2) && (mu <= 3)
\r
131 numRBs = nNumRbsPerSymF2(nNumerology-1,0+1);
\r
133 numRBs = nNumRbsPerSymF2(nNumerology-1,1+1);
\r
135 numRBs = nNumRbsPerSymF2(nNumerology-1,2+1);
\r
137 numRBs = nNumRbsPerSymF2(nNumerology-1,3+1);
\r
139 disp('Unknown BW && mu')
\r
145 disp('Incorrect Numerology and BW combination.')
\r
154 %ifft_in = load('ifft_in.txt')
\r
157 ifft_in = [[1:1:(numRBs*12)]', [1:1:(numRBs*12)]'];
\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
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
171 fileID = fopen(file_name,'w');
\r
172 fwrite(fileID, antX_16, 'int16');
\r
177 disp('Generate BF Weights per RB')
\r
179 %seed to make it repeatable
\r
182 %random channel matrix for single sym on syngle RB
\r
183 H = (rand(trx,ant_num) + 1j*rand(trx,ant_num));
\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
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
196 for ant = 1:1:ant_num
\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
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
211 bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);
\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
217 fileID = fopen(file_name,'w');
\r
218 fwrite(fileID,antX_16, 'int16');
\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
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
234 bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);
\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
240 fileID = fopen(file_name,'w');
\r
241 fwrite(fileID,antX_16, 'int16');
\r