-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-%\r
-% <COPYRIGHT_TAG>\r
-%\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-\r
-%This script was tested with GNU Octave, version 3.8.2 or Matlab 9.2.0.538062 (R2017a) \r
-\r
-close all;\r
-clear all;\r
-\r
- % 5MHz 10MHz 15MHz 20 MHz 25 MHz 30 MHz 40 MHz 50MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz\r
-nNumRbsPerSymF1 = ...\r
-[\r
- % 5MHz 10MHz 15MHz 20 MHz 25 MHz 30 MHz 40 MHz 50MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz\r
- [25, 52, 79, 106, 133, 160, 216, 270, 0, 0, 0, 0, 0] % Numerology 0 (15KHz)\r
- [11, 24, 38, 51, 65, 78, 106, 133, 162, 0, 217, 245, 273] % Numerology 1 (30KHz)\r
- [0, 11, 18, 24, 31, 38, 51, 65, 79, 0, 107, 121, 135] % Numerology 2 (60KHz)\r
-];\r
-\r
-nNumRbsPerSymF2 = ...\r
-[\r
- % 50Mhz 100MHz 200MHz 400MHz\r
- [66, 132, 264, 0] % Numerology 2 (60KHz)\r
- [32, 66, 132, 264] % Numerology 3 (120KHz)\r
-];\r
-\r
-% total number of tests\r
-tests_total = 6\r
-sub6_all = ...\r
- [ \r
- true, true, true, true, false, true, \r
- ]\r
-\r
-mu_all = ...\r
- [\r
- 0, 0, 0, 1, 3, 1\r
- ]\r
-\r
-bw_all = ...\r
- [\r
- 5, 10, 20, 100, 100, 100\r
- ]\r
-\r
-ant_num_all = ...\r
- [\r
- 4, 4, 4, 4, 4, 8\r
- ]\r
-\r
-bfw_gen_all = ...\r
- [\r
- false, false, false, false, false, true\r
- ]\r
-\r
-trx_all = ...\r
- [ \r
- 32, 32, 32, 32, 32, 32\r
- ]\r
-path_to_usecase_all = ... \r
- [\r
- "./usecase/mu0_5mhz/"; \r
- "./usecase/mu0_10mhz/"; \r
- "./usecase/mu0_20mhz/"; \r
- "./usecase/mu1_100mhz/"; \r
- "./usecase/mu3_100mhz/"; \r
- "./usecase/cat_b/mu1_100mhz/";\r
- ]\r
-\r
-path_to_usecase_all = cellstr(path_to_usecase_all) \r
-\r
-nSlots_all = ...\r
- [\r
- 40,40,40,40,40,10 \r
- ]\r
-\r
-%select mu and bw to generate test files\r
-for test_num =(1:1:tests_total)\r
- test_num\r
- sub6=sub6_all(test_num) %false\r
- mu=mu_all(test_num) % 0,1, or 3\r
- bw=bw_all(test_num) %5,10,20,100 MHz\r
- ant_num = ant_num_all(test_num)\r
- bfw_gen=bfw_gen_all(test_num)\r
- trx = trx_all(test_num)\r
- size(path_to_usecase_all)\r
- path_to_usecase = path_to_usecase_all(test_num)\r
-\r
- nSlots=nSlots_all(test_num) % any 40 and 160\r
-\r
- if sub6\r
- disp('Sub6')\r
- if mu < 3\r
- nNumerology = mu+1;\r
- switch (bw)\r
- case {5}\r
- numRBs = nNumRbsPerSymF1(nNumerology,0+1);\r
- case {10}\r
- numRBs = nNumRbsPerSymF1(nNumerology,1+1);\r
- case {15}\r
- numRBs = nNumRbsPerSymF1(nNumerology,2+1);\r
- case {20}\r
- numRBs = nNumRbsPerSymF1(nNumerology,3+1);\r
- case {25}\r
- numRBs = nNumRbsPerSymF1(nNumerology,4+1);\r
- case {30}\r
- numRBs = nNumRbsPerSymF1(nNumerology,5+1);\r
- case {40}\r
- numRBs = nNumRbsPerSymF1(nNumerology,6+1);\r
- case {50}\r
- numRBs = nNumRbsPerSymF1(nNumerology,7+1);\r
- case {60}\r
- numRBs = nNumRbsPerSymF1(nNumerology,8+1);\r
- case {70}\r
- numRBs = nNumRbsPerSymF1(nNumerology,9+1);\r
- case {80}\r
- numRBs = nNumRbsPerSymF1(nNumerology,10+1);\r
- case {90}\r
- numRBs = nNumRbsPerSymF1(nNumerology,11+1);\r
- case {100}\r
- numRBs = nNumRbsPerSymF1(nNumerology,12+1);\r
- otherwise\r
- disp('Unknown BW && mu')\r
- end\r
- end\r
- else\r
- disp('mmWave')\r
- if (mu >=2) && (mu <= 3)\r
- nNumerology = mu;\r
- switch (bw)\r
- case {50}\r
- numRBs = nNumRbsPerSymF2(nNumerology-1,0+1);\r
- case {100}\r
- numRBs = nNumRbsPerSymF2(nNumerology-1,1+1);\r
- case {200}\r
- numRBs = nNumRbsPerSymF2(nNumerology-1,2+1);\r
- case {400}\r
- numRBs = nNumRbsPerSymF2(nNumerology-1,3+1);\r
- otherwise\r
- disp('Unknown BW && mu')\r
- end\r
- end\r
- end\r
-\r
- if numRBs ==0\r
- disp('Incorrect Numerology and BW combination.')\r
- return\r
- end\r
-\r
- bw\r
- numRBs\r
- nSlots\r
-\r
- %use file as input\r
- %ifft_in = load('ifft_in.txt')\r
-\r
- %gen IQs\r
- ifft_in = [[1:1:(numRBs*12)]', [1:1:(numRBs*12)]'];\r
-\r
- ant_c = ifft_in;\r
- for (i=1:1:nSlots*14-1)\r
- ifft_in_1 = ifft_in + i;\r
- ant_c = [ant_c; ifft_in_1];\r
- end\r
-\r
- %write files for IQ samples \r
- for ant = 1:1:ant_num\r
- antX=ant_c*(ant*10);\r
- antX_16=int16(antX.');\r
- file_name = strcat(path_to_usecase,"ant_", num2str(ant-1),".bin");\r
- disp(file_name)\r
- fileID = fopen(file_name,'w');\r
- fwrite(fileID, antX_16, 'int16');\r
- fclose(fileID); \r
- end\r
-\r
- if bfw_gen\r
- disp('Generate BF Weights per RB')\r
-\r
- %seed to make it repeatable \r
- rand('seed',47)\r
-\r
- %random channel matrix for single sym on syngle RB \r
- H = (rand(trx,ant_num) + 1j*rand(trx,ant_num));\r
-\r
- %calculate weights \r
- % W_dl = H^*(H^TH^*)^-1\r
- % W_ul = ((H^H*H)^-1)H^H\r
- % where H^* - conjugate \r
- % H^T - transpose\r
- % H^H - conjugate transpose \r
- W_dl = conj(H)*(transpose(H)*conj(H))^-1; %weights for DL\r
- W_ul = ((ctranspose(H)*H)^-1)*ctranspose(H); %weights for UL\r
-\r
- W_ul = W_ul.';\r
-\r
- for ant = 1:1:ant_num\r
- %DL \r
-\r
- bfw_per_sym = [];\r
- % adjust channel per each RB \r
- for iPrb = 1:1:numRBs\r
- bfw_per_sym = [ bfw_per_sym, [real((W_dl(:, ant).'))*iPrb; imag((W_dl(:, ant).'))*iPrb]];\r
- end\r
-\r
- bfw_all_slots = [];\r
- %reuse channel for all symbols \r
- for (slot_idx=1:1:nSlots*14)\r
- bfw_all_slots = [bfw_all_slots, bfw_per_sym];\r
- end\r
-\r
- bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);\r
-\r
- %write files for IQ samples \r
- antX_16=bfw_all_slots_int.';\r
- file_name = strcat(path_to_usecase,"dl_bfw_ue_", num2str(ant-1),".bin");\r
- disp(file_name)\r
- fileID = fopen(file_name,'w');\r
- fwrite(fileID,antX_16, 'int16');\r
- fclose(fileID); \r
-\r
- %UL \r
- bfw_per_sym = [];\r
- % adjust channel per each RB \r
- for iPrb = 1:1:numRBs\r
- bfw_per_sym = [ bfw_per_sym, [real((W_ul(:, ant).'))*iPrb; imag((W_ul(:, ant).'))*iPrb]];\r
- end\r
-\r
- bfw_all_slots = [];\r
- %reuse channel for all symbols \r
- for (slot_idx=1:1:nSlots*14)\r
- bfw_all_slots = [bfw_all_slots, bfw_per_sym];\r
- end\r
-\r
- bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);\r
-\r
- %write files for IQ samples \r
- antX_16=bfw_all_slots_int.';\r
- file_name = strcat(path_to_usecase,"ul_bfw_ue_", num2str(ant-1),".bin");\r
- disp(file_name)\r
- fileID = fopen(file_name,'w');\r
- fwrite(fileID,antX_16, 'int16');\r
- fclose(fileID); \r
- end \r
- end\r
-end\r
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% <COPYRIGHT_TAG>
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%This script was tested with GNU Octave, version 3.8.2 or Matlab 9.2.0.538062 (R2017a)
+
+close all;
+clear all;
+
+ % 5MHz 10MHz 15MHz 20 MHz
+nLteNumRbsPerSymF1 = ...
+[
+ % 5MHz 10MHz 15MHz 20 MHz
+ [25, 50, 75, 100] % Numerology 0 (15KHz)
+];
+
+ % 5MHz 10MHz 15MHz 20 MHz 25 MHz 30 MHz 40 MHz 50MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz
+nNumRbsPerSymF1 = ...
+[
+ % 5MHz 10MHz 15MHz 20 MHz 25 MHz 30 MHz 40 MHz 50MHz 60 MHz 70 MHz 80 MHz 90 MHz 100 MHz
+ [25, 52, 79, 106, 133, 160, 216, 270, 0, 0, 0, 0, 0] % Numerology 0 (15KHz)
+ [11, 24, 38, 51, 65, 78, 106, 133, 162, 0, 217, 245, 273] % Numerology 1 (30KHz)
+ [0, 11, 18, 24, 31, 38, 51, 65, 79, 0, 107, 121, 135] % Numerology 2 (60KHz)
+];
+
+nNumRbsPerSymF2 = ...
+[
+ % 50Mhz 100MHz 200MHz 400MHz
+ [66, 132, 264, 0] % Numerology 2 (60KHz)
+ [32, 66, 132, 264] % Numerology 3 (120KHz)
+];
+
+% total number of tests
+tests_total = 12
+tech_all = ... % 0 - NR 1- LTE
+ [
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1
+ ]
+
+sub6_all = ...
+ [
+ true, true, true, true, false, true, true, true, true, true, true, true
+ ]
+
+mu_all = ...
+ [
+ 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0
+ ]
+
+bw_all = ...
+ [
+ 5, 10, 20, 100, 100, 100, 20, 10, 5, 20, 10, 5
+ ]
+
+ant_num_all = ...
+ [
+ 4, 4, 4, 4, 4, 8, 4, 4, 4, 8, 8, 8
+ ]
+
+bfw_gen_all = ...
+ [
+ false, false, false, false, false, true, false, false, false, true, true, true,
+ ]
+
+trx_all = ...
+ [
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
+ ]
+path_to_usecase_all = ...
+ [
+ "./usecase/mu0_5mhz/";
+ "./usecase/mu0_10mhz/";
+ "./usecase/mu0_20mhz/";
+ "./usecase/mu1_100mhz/";
+ "./usecase/mu3_100mhz/";
+ "./usecase/cat_b/mu1_100mhz/";
+ "./usecase/lte_a/mu0_20mhz/";
+ "./usecase/lte_a/mu0_10mhz/";
+ "./usecase/lte_a/mu0_5mhz/";
+ "./usecase/lte_b/mu0_20mhz/";
+ "./usecase/lte_b/mu0_10mhz/";
+ "./usecase/lte_b/mu0_5mhz/";
+ ]
+
+path_to_usecase_all = cellstr(path_to_usecase_all)
+
+nSlots_all = ...
+ [
+ 40,40,40,40,40,10,40,40,40,10,10,10
+ ]
+
+%select mu and bw to generate test files
+for test_num =(1:1:tests_total)
+ test_num
+ isLte=tech_all(test_num) %false
+ sub6=sub6_all(test_num) %false
+ mu=mu_all(test_num) % 0,1, or 3
+ bw=bw_all(test_num) %5,10,20,100 MHz
+ ant_num = ant_num_all(test_num)
+ bfw_gen=bfw_gen_all(test_num)
+ trx = trx_all(test_num)
+ size(path_to_usecase_all)
+ path_to_usecase = path_to_usecase_all(test_num)
+
+ nSlots=nSlots_all(test_num) % any 40 and 160
+
+ if isLte
+ disp('LTE')
+ if mu < 3
+ nNumerology = mu+1;
+ switch (bw)
+ case {5}
+ numRBs = nLteNumRbsPerSymF1(nNumerology,0+1);
+ case {10}
+ numRBs = nLteNumRbsPerSymF1(nNumerology,1+1);
+ case {15}
+ numRBs = nLteNumRbsPerSymF1(nNumerology,2+1);
+ case {20}
+ numRBs = nLteNumRbsPerSymF1(nNumerology,3+1);
+ end
+ end
+ else
+ if sub6
+ disp('Sub6')
+ if mu < 3
+ nNumerology = mu+1;
+ switch (bw)
+ case {5}
+ numRBs = nNumRbsPerSymF1(nNumerology,0+1);
+ case {10}
+ numRBs = nNumRbsPerSymF1(nNumerology,1+1);
+ case {15}
+ numRBs = nNumRbsPerSymF1(nNumerology,2+1);
+ case {20}
+ numRBs = nNumRbsPerSymF1(nNumerology,3+1);
+ case {25}
+ numRBs = nNumRbsPerSymF1(nNumerology,4+1);
+ case {30}
+ numRBs = nNumRbsPerSymF1(nNumerology,5+1);
+ case {40}
+ numRBs = nNumRbsPerSymF1(nNumerology,6+1);
+ case {50}
+ numRBs = nNumRbsPerSymF1(nNumerology,7+1);
+ case {60}
+ numRBs = nNumRbsPerSymF1(nNumerology,8+1);
+ case {70}
+ numRBs = nNumRbsPerSymF1(nNumerology,9+1);
+ case {80}
+ numRBs = nNumRbsPerSymF1(nNumerology,10+1);
+ case {90}
+ numRBs = nNumRbsPerSymF1(nNumerology,11+1);
+ case {100}
+ numRBs = nNumRbsPerSymF1(nNumerology,12+1);
+ otherwise
+ disp('Unknown BW && mu')
+ end
+ end
+ else
+ disp('mmWave')
+ if (mu >=2) && (mu <= 3)
+ nNumerology = mu;
+ switch (bw)
+ case {50}
+ numRBs = nNumRbsPerSymF2(nNumerology-1,0+1);
+ case {100}
+ numRBs = nNumRbsPerSymF2(nNumerology-1,1+1);
+ case {200}
+ numRBs = nNumRbsPerSymF2(nNumerology-1,2+1);
+ case {400}
+ numRBs = nNumRbsPerSymF2(nNumerology-1,3+1);
+ otherwise
+ disp('Unknown BW && mu')
+ end
+ end
+ end
+ end
+ if numRBs ==0
+ disp('Incorrect Numerology and BW combination.')
+ return
+ end
+
+ bw
+ numRBs
+ nSlots
+
+ %use file as input
+ %ifft_in = load('ifft_in.txt')
+
+ %gen IQs
+ ifft_in = [[1:1:(numRBs*12)]', [1:1:(numRBs*12)]'];
+
+ ant_c = ifft_in;
+ for (i=1:1:nSlots*14-1)
+ ifft_in_1 = ifft_in + i;
+ ant_c = [ant_c; ifft_in_1];
+ end
+
+ %write files for IQ samples
+ for ant = 1:1:ant_num
+ antX=ant_c*(ant*10);
+ antX_16=int16(antX.');
+ file_name = strcat(path_to_usecase,"ant_", num2str(ant-1),".bin");
+ disp(file_name)
+ fileID = fopen(file_name,'w');
+ fwrite(fileID, antX_16, 'int16');
+ fclose(fileID);
+ end
+
+ if bfw_gen
+ disp('Generate BF Weights per RB')
+
+ %seed to make it repeatable
+ rand('seed',47)
+
+ %random channel matrix for single sym on syngle RB
+ H = (rand(trx,ant_num) + 1j*rand(trx,ant_num));
+
+ %calculate weights
+ % W_dl = H^*(H^TH^*)^-1
+ % W_ul = ((H^H*H)^-1)H^H
+ % where H^* - conjugate
+ % H^T - transpose
+ % H^H - conjugate transpose
+ W_dl = conj(H)*(transpose(H)*conj(H))^-1; %weights for DL
+ W_ul = ((ctranspose(H)*H)^-1)*ctranspose(H); %weights for UL
+
+ W_ul = W_ul.';
+
+ for ant = 1:1:ant_num
+ %DL
+
+ bfw_per_sym = [];
+ % adjust channel per each RB
+ for iPrb = 1:1:numRBs
+ bfw_per_sym = [ bfw_per_sym, [real((W_dl(:, ant).'))*iPrb; imag((W_dl(:, ant).'))*iPrb]];
+ end
+
+ bfw_all_slots = [];
+ %reuse channel for all symbols
+ for (slot_idx=1:1:nSlots*14)
+ bfw_all_slots = [bfw_all_slots, bfw_per_sym];
+ end
+
+ bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);
+
+ %write files for IQ samples
+ antX_16=bfw_all_slots_int.';
+ file_name = strcat(path_to_usecase,"dl_bfw_ue_", num2str(ant-1),".bin");
+ disp(file_name)
+ fileID = fopen(file_name,'w');
+ fwrite(fileID,antX_16, 'int16');
+ fclose(fileID);
+
+ %UL
+ bfw_per_sym = [];
+ % adjust channel per each RB
+ for iPrb = 1:1:numRBs
+ bfw_per_sym = [ bfw_per_sym, [real((W_ul(:, ant).'))*iPrb; imag((W_ul(:, ant).'))*iPrb]];
+ end
+
+ bfw_all_slots = [];
+ %reuse channel for all symbols
+ for (slot_idx=1:1:nSlots*14)
+ bfw_all_slots = [bfw_all_slots, bfw_per_sym];
+ end
+
+ bfw_all_slots_int = int16(bfw_all_slots./max(max(abs((bfw_all_slots.')))).*2^15);
+
+ %write files for IQ samples
+ antX_16=bfw_all_slots_int.';
+ file_name = strcat(path_to_usecase,"ul_bfw_ue_", num2str(ant-1),".bin");
+ disp(file_name)
+ fileID = fopen(file_name,'w');
+ fwrite(fileID,antX_16, 'int16');
+ fclose(fileID);
+ end
+ end
+end