1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 % Copyright (c) 2021 Intel.
5 % Licensed under the Apache License, Version 2.0 (the "License");
6 % you may not use this file except in compliance with the License.
7 % You may obtain a copy of the License at
9 % http://www.apache.org/licenses/LICENSE-2.0
11 % Unless required by applicable law or agreed to in writing, software
12 % distributed under the License is distributed on an "AS IS" BASIS,
13 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 % See the License for the specific language governing permissions and
15 % limitations under the License.
18 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
20 %This script was tested with GNU Octave, version 3.8.2 or Matlab 9.2.0.538062 (R2017a)
25 % 5MHz 10MHz 15MHz 20 MHz
26 nLteNumRbsPerSymF1 = ...
28 % 5MHz 10MHz 15MHz 20 MHz
29 [25, 50, 75, 100] % Numerology 0 (15KHz)
32 % 5MHz 10MHz 15MHz 20 MHz 25 MHz 30 MHz 40 MHz 50MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz
35 % 5MHz 10MHz 15MHz 20 MHz 25 MHz 30 MHz 40 MHz 50MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz
36 [25, 52, 79, 106, 133, 160, 216, 270, 0, 0, 0, 0, 0] % Numerology 0 (15KHz)
37 [11, 24, 38, 51, 65, 78, 106, 133, 162, 0, 217, 245, 273] % Numerology 1 (30KHz)
38 [0, 11, 18, 24, 31, 38, 51, 65, 79, 0, 107, 121, 135] % Numerology 2 (60KHz)
43 % 50Mhz 100MHz 200MHz 400MHz
44 [66, 132, 264, 0] % Numerology 2 (60KHz)
45 [32, 66, 132, 264] % Numerology 3 (120KHz)
48 % total number of tests
50 tech_all = ... % 0 - NR 1- LTE
52 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1
57 true, true, true, true, false, true, true, true, true, true, true, true
62 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0
67 5, 10, 20, 100, 100, 100, 20, 10, 5, 20, 10, 5
72 4, 4, 4, 4, 4, 8, 4, 4, 4, 8, 8, 8
77 false, false, false, false, false, true, false, false, false, true, true, true,
82 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
84 path_to_usecase_all = ...
86 "./usecase/cat_a/mu0_5mhz/";
87 "./usecase/cat_a/mu0_10mhz/";
88 "./usecase/cat_a/mu0_20mhz/";
89 "./usecase/cat_a/mu1_100mhz/";
90 "./usecase/cat_a/mu3_100mhz/";
91 "./usecase/cat_b/mu1_100mhz/";
92 "./usecase/lte_a/mu0_20mhz/";
93 "./usecase/lte_a/mu0_10mhz/";
94 "./usecase/lte_a/mu0_5mhz/";
95 "./usecase/lte_b/mu0_20mhz/";
96 "./usecase/lte_b/mu0_10mhz/";
97 "./usecase/lte_b/mu0_5mhz/";
100 path_to_usecase_all = cellstr(path_to_usecase_all)
104 20,20,20,20,20,20,20,20,20,10,10,10
107 %select mu and bw to generate test files
108 for test_num =(1:1:tests_total)
110 isLte=tech_all(test_num) %false
111 sub6=sub6_all(test_num) %false
112 mu=mu_all(test_num) % 0,1, or 3
113 bw=bw_all(test_num) %5,10,20,100 MHz
114 ant_num = ant_num_all(test_num)
115 bfw_gen=bfw_gen_all(test_num)
116 trx = trx_all(test_num)
117 size(path_to_usecase_all)
118 path_to_usecase = path_to_usecase_all(test_num)
120 nSlots=nSlots_all(test_num) % any 40 and 160
128 numRBs = nLteNumRbsPerSymF1(nNumerology,0+1);
130 numRBs = nLteNumRbsPerSymF1(nNumerology,1+1);
132 numRBs = nLteNumRbsPerSymF1(nNumerology,2+1);
134 numRBs = nLteNumRbsPerSymF1(nNumerology,3+1);
144 numRBs = nNumRbsPerSymF1(nNumerology,0+1);
146 numRBs = nNumRbsPerSymF1(nNumerology,1+1);
148 numRBs = nNumRbsPerSymF1(nNumerology,2+1);
150 numRBs = nNumRbsPerSymF1(nNumerology,3+1);
152 numRBs = nNumRbsPerSymF1(nNumerology,4+1);
154 numRBs = nNumRbsPerSymF1(nNumerology,5+1);
156 numRBs = nNumRbsPerSymF1(nNumerology,6+1);
158 numRBs = nNumRbsPerSymF1(nNumerology,7+1);
160 numRBs = nNumRbsPerSymF1(nNumerology,8+1);
162 numRBs = nNumRbsPerSymF1(nNumerology,9+1);
164 numRBs = nNumRbsPerSymF1(nNumerology,10+1);
166 numRBs = nNumRbsPerSymF1(nNumerology,11+1);
168 numRBs = nNumRbsPerSymF1(nNumerology,12+1);
170 disp('Unknown BW && mu')
175 if (mu >=2) && (mu <= 3)
179 numRBs = nNumRbsPerSymF2(nNumerology-1,0+1);
181 numRBs = nNumRbsPerSymF2(nNumerology-1,1+1);
183 numRBs = nNumRbsPerSymF2(nNumerology-1,2+1);
185 numRBs = nNumRbsPerSymF2(nNumerology-1,3+1);
187 disp('Unknown BW && mu')
193 disp('Incorrect Numerology and BW combination.')
202 %ifft_in = load('ifft_in.txt')
205 ifft_in = [[1:1:(numRBs*12)]', [1:1:(numRBs*12)]'];
208 for (i=1:1:nSlots*14-1)
209 ifft_in_1 = ifft_in + i;
210 ant_c = [ant_c; ifft_in_1];
213 %write files for IQ samples
214 for ant = 1:1:ant_num
216 antX_16=int16(antX.');
217 file_name = strcat(path_to_usecase,"ant_", num2str(ant-1),".bin");
219 fileID = fopen(file_name,'w');
220 fwrite(fileID, antX_16, 'int16');
225 disp('Generate BF Weights per RB')
227 %seed to make it repeatable
230 %random channel matrix for single sym on syngle RB
231 H = (rand(trx,ant_num) + 1j*rand(trx,ant_num));
234 % W_dl = H^*(H^TH^*)^-1
235 % W_ul = ((H^H*H)^-1)H^H
236 % where H^* - conjugate
238 % H^H - conjugate transpose
239 W_dl = conj(H)*(transpose(H)*conj(H))^-1; %weights for DL
240 W_ul = ((ctranspose(H)*H)^-1)*ctranspose(H); %weights for UL
244 for ant = 1:1:ant_num
248 % adjust channel per each RB
249 for iPrb = 1:1:numRBs
250 bfw_per_sym = [ bfw_per_sym, [real((W_dl(:, ant).'))*iPrb; imag((W_dl(:, ant).'))*iPrb]];
254 %reuse channel for all symbols
255 for (slot_idx=1:1:nSlots*14)
256 bfw_all_slots = [bfw_all_slots, bfw_per_sym];
259 bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);
261 %write files for IQ samples
262 antX_16=bfw_all_slots_int.';
263 file_name = strcat(path_to_usecase,"dl_bfw_ue_", num2str(ant-1),".bin");
265 fileID = fopen(file_name,'w');
266 fwrite(fileID,antX_16, 'int16');
271 % adjust channel per each RB
272 for iPrb = 1:1:numRBs
273 bfw_per_sym = [ bfw_per_sym, [real((W_ul(:, ant).'))*iPrb; imag((W_ul(:, ant).'))*iPrb]];
277 %reuse channel for all symbols
278 for (slot_idx=1:1:nSlots*14)
279 bfw_all_slots = [bfw_all_slots, bfw_per_sym];
282 bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);
284 %write files for IQ samples
285 antX_16=bfw_all_slots_int.';
286 file_name = strcat(path_to_usecase,"ul_bfw_ue_", num2str(ant-1),".bin");
288 fileID = fopen(file_name,'w');
289 fwrite(fileID,antX_16, 'int16');
295 %% generate IQ file with valid constellation, for DL modulation compression
297 %constellation = [4096, -4096];
298 %constellation = [2590, 7770, -7770, -2590];
299 %constellation = [633, 1897, 3161, 4425, -4424, -3160, -1897, -633];
300 constellation_all = [628, 1885, 3141, 4398, 5654, 6911, 8167, 9424, -9424, -8167, -6911, -5654, -4398, -3141, -1885, -628;
301 633, 1897, 3161, 4425, -4424, -3160, -1897, -633, 633, 1897, 3161, 4425, -4424, -3160, -1897, -633;
302 2590, 7770, -7770, -2590, 2590, 7770, -7770, -2590, 2590, 7770, -7770, -2590, 2590, 7770, -7770, -2590;
303 4096, -4096, 4096, -4096, 4096, -4096, 4096, -4096, 4096, -4096, 4096, -4096, 4096, -4096, 4096, -4096;
310 "./usecase/cat_a/mu1_100mhz/";
311 "./usecase/cat_b/mu1_100mhz/";
312 "./usecase/cat_b/mu1_100mhz/";
313 "./usecase/cat_b/mu1_100mhz/";
315 path_all = cellstr(path_all)
323 modtype_all = cellstr(modtype_all)
326 path = path_all(test_num);
327 constellation=constellation_all(test_num,:);
328 modtype = modtype_all(test_num);
330 ant_in = rand(2*12*numRBs*14*nSlots,1); % random constellation
331 ant_in = 1+round(15 * ant_in);
332 ant_out = constellation(ant_in);
333 file_name = strcat(path,modtype, num2str(ant-1),".bin");
335 fileID = fopen(file_name,'w');
336 fwrite(fileID, ant_out, 'int16');