Front Haul Interface Library update to third seed code contribution
[o-du/phy.git] / fhi_lib / app / gen_test.m
index 1da0d2f..1154c92 100644 (file)
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\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  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 = 6
+sub6_all = ...
+    [ 
+      true, true, true, true, false, true,   
+    ]
+
+mu_all = ...
+    [
+      0, 0, 0, 1, 3, 1
+    ]
+
+bw_all = ...
+    [
+      5, 10, 20, 100, 100, 100
+    ]
+
+ant_num_all = ...
+    [
+      4, 4, 4, 4, 4, 8
+    ]
+
+bfw_gen_all = ...
+    [
+      false, false, false, false, false, true
+    ]
+
+trx_all = ...
+    [ 
+      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/";
+    ]
+
+path_to_usecase_all = cellstr(path_to_usecase_all) 
+
+nSlots_all = ...
+    [
+       40,40,40,40,40,10 
+    ]
+
+%select mu and bw to generate test files
+for test_num =(1:1:tests_total)
+    test_num
+    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 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
+
+    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