-%/******************************************************************************
-%*
-%* Copyright (c) 2019 Intel.
-%*
-%* Licensed under the Apache License, Version 2.0 (the "License");
-%* you may not use this file except in compliance with the License.
-%* You may obtain a copy of the License at
-%*
-%* http://www.apache.org/licenses/LICENSE-2.0
-%*
-%* Unless required by applicable law or agreed to in writing, software
-%* distributed under the License is distributed on an "AS IS" BASIS,
-%* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%* See the License for the specific language governing permissions and
-%* limitations under the License.
-%*
-%*******************************************************************************/
-
-%Matlab: read bin
-%fileID_c = fopen('ant_7.bin','r');
-%ant7_c= fread(fileID_c, [2, 792*14*80], 'integer*2');
-%ant7_c;
-%ant7_c=ant7_c.';
-
-close all;
-clear all;
-
-ifft_in = load('ifft_in.txt')
-ant_c = ifft_in;
-for (i=1:1:80*14-1)
- ant_c = [ant_c; ifft_in];
-end
-
-ant0=ant_c;
-ant1=ant_c*10;
-ant2=ant_c*20;
-ant3=ant_c*30;
-ant4=ant_c*40;
-ant5=ant_c*50;
-ant6=ant_c*60;
-ant7=ant_c*70;
-ant8=ant_c*80;
-ant9=ant_c*90;
-ant10=ant_c*100;
-ant11=ant_c*110;
-ant12=ant_c*120;
-ant13=ant_c*130;
-ant14=ant_c*140;
-ant15=ant_c*150;
-
-
-ant0_16=int16(ant0.');
-fileID = fopen('ant_0.bin','w');
-fwrite(fileID,ant0_16, 'int16');
-fclose(fileID);
-
-ant1_16=int16(ant1.');
-fileID = fopen('ant_1.bin','w');
-fwrite(fileID,ant1_16, 'int16');
-fclose(fileID);
-
-ant2_16=int16(ant2.');
-fileID = fopen('ant_2.bin','w');
-fwrite(fileID,ant2_16, 'int16');
-fclose(fileID);
-
-ant3_16=int16(ant3.');
-fileID = fopen('ant_3.bin','w');
-fwrite(fileID,ant3_16, 'int16');
-fclose(fileID);
-
-ant4_16=int16(ant4.');
-fileID = fopen('ant_4.bin','w');
-fwrite(fileID,ant4_16, 'int16');
-fclose(fileID);
-
-ant5_16=int16(ant5.');
-fileID = fopen('ant_5.bin','w');
-fwrite(fileID,ant5_16, 'int16');
-fclose(fileID);
-
-ant6_16=int16(ant6.');
-fileID = fopen('ant_6.bin','w');
-fwrite(fileID,ant6_16, 'int16');
-fclose(fileID);
-
-ant7_16=int16(ant7.');
-fileID = fopen('ant_7.bin','w');
-fwrite(fileID,ant7_16, 'int16');
-fclose(fileID);
-
-ant8_16=int16(ant8.');
-fileID = fopen('ant_8.bin','w');
-fwrite(fileID,ant8_16, 'int16');
-fclose(fileID);
-
-ant9_16=int16(ant9.');
-fileID = fopen('ant_9.bin','w');
-fwrite(fileID,ant9_16, 'int16');
-fclose(fileID);
-
-ant10_16=int16(ant10.');
-fileID = fopen('ant_10.bin','w');
-fwrite(fileID,ant10_16, 'int16');
-fclose(fileID);
-
-ant11_16=int16(ant11.');
-fileID = fopen('ant_11.bin','w');
-fwrite(fileID,ant11_16, 'int16');
-fclose(fileID);
-
-ant12_16=int16(ant12.');
-fileID = fopen('ant_12.bin','w');
-fwrite(fileID,ant12_16, 'int16');
-fclose(fileID);
-
-ant13_16=int16(ant13.');
-fileID = fopen('ant_13.bin','w');
-fwrite(fileID,ant13_16, 'int16');
-fclose(fileID);
-
-ant14_16=int16(ant14.');
-fileID = fopen('ant_14.bin','w');
-fwrite(fileID,ant14_16, 'int16');
-fclose(fileID);
-
-ant15_16=int16(ant15.');
-fileID = fopen('ant_15.bin','w');
-fwrite(fileID,ant15_16, 'int16');
-fclose(fileID);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\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