prs resource mapping
This commit is contained in:
@@ -5,7 +5,8 @@
|
|||||||
#include "PHY/NR_REFSIG/nr_refsig.h"
|
#include "PHY/NR_REFSIG/nr_refsig.h"
|
||||||
#include "PHY/sse_intrin.h"
|
#include "PHY/sse_intrin.h"
|
||||||
|
|
||||||
#define DEBUG_PRS
|
//#define DEBUG_PRS
|
||||||
|
#define DEBUG_PRS_MAP
|
||||||
|
|
||||||
extern short nr_qpsk_mod_table[8];
|
extern short nr_qpsk_mod_table[8];
|
||||||
|
|
||||||
@@ -15,14 +16,25 @@ int nr_generate_prs(uint32_t *nr_gold_prs,
|
|||||||
uint8_t ssb_start_symbol,
|
uint8_t ssb_start_symbol,
|
||||||
nfapi_nr_config_request_scf_t *config,
|
nfapi_nr_config_request_scf_t *config,
|
||||||
NR_DL_FRAME_PARMS *frame_parms) {
|
NR_DL_FRAME_PARMS *frame_parms) {
|
||||||
//int k,l;
|
|
||||||
//int16_t a;
|
|
||||||
|
// Get K_Prime from the table for the length of PRS or LPRS
|
||||||
|
int k_prime_table[4][12] = {
|
||||||
|
{0,1,0,1,0,1,0,1,0,1,0,1},
|
||||||
|
{0,2,1,3,0,2,1,3,0,2,1,3},
|
||||||
|
{0,3,1,4,2,5,0,3,1,4,2,5},
|
||||||
|
{0,6,3,9,1,7,4,10,2,8,5,11}};
|
||||||
|
|
||||||
|
int k_prime = 0;
|
||||||
|
int k=0;
|
||||||
int16_t mod_prs[NR_MAX_PRS_LENGTH<<1];
|
int16_t mod_prs[NR_MAX_PRS_LENGTH<<1];
|
||||||
uint8_t idx=0;
|
uint8_t idx=0;
|
||||||
uint8_t nushift = config->cell_config.phy_cell_id.value &3;
|
uint8_t combSize = 6;
|
||||||
LOG_D(PHY, "PRS mapping started at symbol %d shift %d\n", ssb_start_symbol+1, nushift);
|
uint8_t REOffset = 0;
|
||||||
|
uint8_t symbolStart = 5;
|
||||||
/// QPSK modulation
|
uint8_t NumPRSSymbols = 6;
|
||||||
|
|
||||||
|
// QPSK modulation
|
||||||
for (int m=0; m<NR_MAX_PRS_LENGTH; m++) {
|
for (int m=0; m<NR_MAX_PRS_LENGTH; m++) {
|
||||||
idx = (((nr_gold_prs[(m<<1)>>5])>>((m<<1)&0x1f))&3);
|
idx = (((nr_gold_prs[(m<<1)>>5])>>((m<<1)&0x1f))&3);
|
||||||
mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1];
|
mod_prs[m<<1] = nr_qpsk_mod_table[idx<<1];
|
||||||
@@ -33,8 +45,52 @@ int nr_generate_prs(uint32_t *nr_gold_prs,
|
|||||||
(((nr_gold_prs[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1), mod_prs[(m<<1)], mod_prs[(m<<1)+1]);
|
(((nr_gold_prs[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1), mod_prs[(m<<1)], mod_prs[(m<<1)+1]);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PRS resource mapping with combsize=k which means PRS symbols exist in every k-th subcarrier in frequency domain
|
||||||
|
// According to ts138.211 sec.7.4.1.7.2
|
||||||
|
|
||||||
|
for (int l = symbolStart; l < symbolStart + NumPRSSymbols; l++) {
|
||||||
|
|
||||||
|
int symInd = l-5;
|
||||||
|
if (combSize==2) {
|
||||||
|
k_prime = k_prime_table[0][symInd];
|
||||||
|
}
|
||||||
|
else if (combSize==4){
|
||||||
|
k_prime = k_prime_table[1][symInd];
|
||||||
|
}
|
||||||
|
else if (combSize==6){
|
||||||
|
k_prime = k_prime_table[2][symInd];
|
||||||
|
}
|
||||||
|
else if (combSize==12){
|
||||||
|
k_prime = k_prime_table[3][symInd];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int m = 0; m < NR_MAX_PRS_LENGTH; m++) {
|
||||||
|
#ifdef DEBUG_PRS_MAP
|
||||||
|
printf("m %d at k %d of l %d\n", m, k, l);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_prs[m<<1]) >> 15;
|
||||||
|
((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_prs[(m<<1) + 1]) >> 15;
|
||||||
|
|
||||||
|
#ifdef DEBUG_PRS_MAP
|
||||||
|
printf("(%d,%d)\n",
|
||||||
|
((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1],
|
||||||
|
((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
k=m*combSize+(REOffset+k_prime)%combSize;
|
||||||
|
|
||||||
|
//if (k >= frame_parms->ofdm_symbol_size)
|
||||||
|
//k-=frame_parms->ofdm_symbol_size;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user