From a676ccbb80609f7464312db5ca11a0925737271a Mon Sep 17 00:00:00 2001
From: Thomas Schlichter <thomas.schlichter@iis.fraunhofer.de>
Date: Mon, 8 Feb 2021 13:51:17 +0100
Subject: [PATCH] gNB: fix PRACH reception for some configurations and some
 cleanup

---
 openair1/PHY/NR_TRANSPORT/nr_prach.c | 71 ++++++++++++++--------------
 1 file changed, 36 insertions(+), 35 deletions(-)

diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index aae310d45a..2ddb75af04 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -301,13 +301,10 @@ void rx_nr_prach_ru(RU_t *ru,
 
     // do DFT
     if (mu==1) {
-      if (fp->N_RB_UL <= 100)
-        AssertFatal(1==0,"N_RB_UL %d not support for NR PRACH yet\n",fp->N_RB_UL);
-      else if (fp->N_RB_UL < 137) {
-        if (fp->threequarter_fs==0) {
-          //40 MHz @ 61.44 Ms/s
-          //50 MHz @ 61.44 Ms/s
-          prach2 = prach[aa] + (Ncp<<2); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 to bring to 61.44 Ms/s
+      switch(fp->samples_per_subframe) {
+        case 61440:
+          // 40, 50, 60 MHz @ 61.44 Ms/s
+          prach2 = prach[aa] + (4*Ncp); // Ncp is for 30.72 Ms/s, so multiply by 2 for I/Q, and 2 to bring to 61.44 Ms/s
           if (prach_sequence_length == 0) {
             if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
               dftlen=49152;
@@ -327,10 +324,9 @@ void rx_nr_prach_ru(RU_t *ru,
               for (int i=0;i<4;i++) dft(DFT_12288,prach2+(i*12288*2),rxsigF[aa]+(i*12288*2),1);
               reps=4;
             }
-          }// 839 sequence
-          else {
-            if (prachStartSymbol == 0)
-              prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe (15/30 kHz only)
+          } else { // 839 sequence
+            if (prachStartSymbol == 0) prach2+=64; // 32 samples @ 61.44 Ms/s in first symbol of each half subframe (15/30 kHz only)
+
             dftlen=2048;
             dft(DFT_2048,prach2,rxsigF[aa],1);
             if (prachFormat != 9/*C0*/) {
@@ -352,15 +348,15 @@ void rx_nr_prach_ru(RU_t *ru,
               reps+=6;
             }
           }
-        } else { // threequarter sampling
-          //	40 MHz @ 46.08 Ms/s
+          break;
+
+        case 46080:
+          // 40 MHz @ 46.08 Ms/s
           prach2 = prach[aa] + (3*Ncp); // 46.08 is 1.5 * 30.72, times 2 for I/Q
           if (prach_sequence_length == 0) {
-            AssertFatal(fp->N_RB_UL <= 107,"cannot do 108..136 PRBs with 3/4 sampling\n");
             if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
               dftlen=36864;
               dft(DFT_36864,prach2,rxsigF[aa],1);
-	      reps++;
             }
             if (prachFormat == 1 || prachFormat == 2) {
               dft(DFT_36864,prach2+73728,rxsigF[aa]+73728,1);
@@ -374,10 +370,11 @@ void rx_nr_prach_ru(RU_t *ru,
             if (prachFormat == 3) {
               dftlen=9216;
               for (int i=0;i<4;i++) dft(DFT_9216,prach2+(i*9216*2),rxsigF[aa]+(i*9216*2),1);
-                reps=4;
+              reps=4;
             }
-          } else {
+          } else { // 839 sequence
             if (prachStartSymbol == 0) prach2+=48; // 24 samples @ 46.08 Ms/s in first symbol of each half subframe (15/30 kHz only)
+
             dftlen=1536;
             dft(DFT_1536,prach2,rxsigF[aa],1);
             if (prachFormat != 9/*C0*/) {
@@ -398,14 +395,12 @@ void rx_nr_prach_ru(RU_t *ru,
               for (int i=6;i<12;i++) dft(DFT_1536,prach2+(3072*i),rxsigF[aa]+(3072*i),1);
               reps+=6;
             }
-          } // short format
-        } // 3/4 sampling
-      } // <=50 MHz BW
-      else if (fp->N_RB_UL <= 273) {
-        if (fp->threequarter_fs==0) {
-          prach2 = prach[aa] + (Ncp<<3);
-          //80,90,100 MHz @ 122.88 Ms/s
+          }
+          break;
 
+        case 122880:
+          // 70, 80, 90, 100 MHz @ 122.88 Ms/s
+          prach2 = prach[aa] + (8*Ncp);
           if (prach_sequence_length == 0) {
             if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
               dftlen=98304;
@@ -425,8 +420,7 @@ void rx_nr_prach_ru(RU_t *ru,
               for (int i=0;i<4;i++) dft(DFT_24576,prach2+(i*2*24576),rxsigF[aa]+(i*2*24576),1);
               reps=4;
             }
-          }
-          else {
+          } else { // 839 sequence
             if (prachStartSymbol == 0) prach2+=128; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
 
             dftlen=4096;
@@ -451,24 +445,29 @@ void rx_nr_prach_ru(RU_t *ru,
               reps+=6;
             }
           }
-        } else {
-          AssertFatal(fp->N_RB_UL <= 217,"cannot do more than 217 PRBs with 3/4 sampling\n");
+          break;
+
+        case 92160:
+          // 80, 90 MHz @ 92.16 Ms/s
           prach2 = prach[aa] + (6*Ncp);
-          // 80 MHz @ 92.16 Ms/s
           if (prach_sequence_length == 0) {
             if (prachFormat == 0 || prachFormat == 1 || prachFormat == 2) {
               dftlen=73728;
-	      dft(DFT_73728,prach2,rxsigF[aa],1);
-	      reps++;
+              dft(DFT_73728,prach2,rxsigF[aa],1);
             }
             if (prachFormat == 1 || prachFormat == 2) {
-              dft(DFT_73728,prach2+(2*73728),rxsigF[aa]+(2*73728),1);
+              dft(DFT_73728,prach2+147456,rxsigF[aa]+147456,1);
               reps++;
             }
+            if (prachFormat == 2) {
+              dft(DFT_73728,prach2+(147456*2),rxsigF[aa]+(147456*2),1);
+              dft(DFT_73728,prach2+(147456*3),rxsigF[aa]+(147456*3),1);
+              reps+=2;
+            }
             if (prachFormat == 3) {
               dftlen=18432;
-	      for (int i=0;i<4;i++) dft(DFT_18432,prach2+(i*2*18432),rxsigF[aa]+(i*2*18432),1);
-	      reps=4;
+              for (int i=0;i<4;i++) dft(DFT_18432,prach2+(i*2*18432),rxsigF[aa]+(i*2*18432),1);
+              reps=4;
             }
           } else {
             if (prachStartSymbol == 0) prach2+=96; // 64 samples @ 122.88 Ms/s in first symbol of each half subframe (15/30 kHz only)
@@ -495,7 +494,9 @@ void rx_nr_prach_ru(RU_t *ru,
               reps+=6;
             }
           }
-        }
+          break;
+        default:
+          AssertFatal(1==0,"sample_rate %f MHz not support for NR PRACH yet\n", fp->samples_per_subframe / 1000.0);
       }
     }
     else if (mu==3) {
-- 
2.26.2