Consider the ratio of PUSCH EPRE to DMRS EPRE when calculating PUSCH DMRS power scaling
This commit is contained in:
@@ -36,6 +36,7 @@
|
|||||||
#include "common/utils/LOG/log.h"
|
#include "common/utils/LOG/log.h"
|
||||||
#include "nr_common.h"
|
#include "nr_common.h"
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#define C_SRS_NUMBER (64)
|
#define C_SRS_NUMBER (64)
|
||||||
#define B_SRS_NUMBER (4)
|
#define B_SRS_NUMBER (4)
|
||||||
@@ -1427,3 +1428,15 @@ frequency_range_t get_freq_range_from_band(uint16_t band)
|
|||||||
{
|
{
|
||||||
return band <= 256 ? FR1 : FR2;
|
return band <= 256 ? FR1 : FR2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float get_beta_dmrs_pusch(int num_cdm_groups_no_data, pusch_dmrs_type_t dmrs_type)
|
||||||
|
{
|
||||||
|
float beta_dmrs_pusch = 1.0;
|
||||||
|
if (num_cdm_groups_no_data == 2) {
|
||||||
|
beta_dmrs_pusch = powf(10.0, 3.0 / 20.0);
|
||||||
|
} else if (num_cdm_groups_no_data == 3) {
|
||||||
|
if (dmrs_type == pusch_dmrs_type2)
|
||||||
|
beta_dmrs_pusch = powf(10.0, 4.77 / 20.0);
|
||||||
|
}
|
||||||
|
return beta_dmrs_pusch;
|
||||||
|
}
|
||||||
|
|||||||
@@ -123,6 +123,11 @@ typedef enum frequency_range_e {
|
|||||||
FR2
|
FR2
|
||||||
} frequency_range_t;
|
} frequency_range_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
pusch_dmrs_type1 = 0,
|
||||||
|
pusch_dmrs_type2 = 1
|
||||||
|
} pusch_dmrs_type_t;
|
||||||
|
|
||||||
#define MAX_NUM_SLOTS_ALLOWED 80 // up to numerology 3 (120 KHz SCS) is supported
|
#define MAX_NUM_SLOTS_ALLOWED 80 // up to numerology 3 (120 KHz SCS) is supported
|
||||||
enum slot_type { TDD_NR_DOWNLINK_SLOT, TDD_NR_UPLINK_SLOT, TDD_NR_MIXED_SLOT };
|
enum slot_type { TDD_NR_DOWNLINK_SLOT, TDD_NR_UPLINK_SLOT, TDD_NR_MIXED_SLOT };
|
||||||
|
|
||||||
@@ -295,6 +300,17 @@ frequency_range_t get_freq_range_from_freq(uint64_t freq);
|
|||||||
frequency_range_t get_freq_range_from_arfcn(uint32_t arfcn);
|
frequency_range_t get_freq_range_from_arfcn(uint32_t arfcn);
|
||||||
frequency_range_t get_freq_range_from_band(uint16_t band);
|
frequency_range_t get_freq_range_from_band(uint16_t band);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Calculates the scaling factor for the ratio of PUSCH EPRE to DMRS EPRE.
|
||||||
|
*
|
||||||
|
* @param num_cdm_groups_no_data The number of CDM groups without data.
|
||||||
|
* @param dmrs_type The DMRS type.
|
||||||
|
* @return The calculated beta scaling factor for the ratio of PUSCH EPRE to DMRS EPRE.
|
||||||
|
*
|
||||||
|
* @note The values are derived from TS 38.214 Table 6.2.2-1.
|
||||||
|
*/
|
||||||
|
float get_beta_dmrs_pusch(int num_cdm_groups_no_data, pusch_dmrs_type_t dmrs_type);
|
||||||
|
|
||||||
#define CEILIDIV(a,b) ((a+b-1)/b)
|
#define CEILIDIV(a,b) ((a+b-1)/b)
|
||||||
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
|
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
* contact@openairinterface.org
|
* contact@openairinterface.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "nr_common.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "nr_ul_estimation.h"
|
#include "nr_ul_estimation.h"
|
||||||
@@ -480,6 +481,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
pusch_pdu->scid,
|
pusch_pdu->scid,
|
||||||
Ns,
|
Ns,
|
||||||
symbol);
|
symbol);
|
||||||
|
pusch_dmrs_type_t dmrs_type = pusch_pdu->dmrs_config_type == NFAPI_NR_DMRS_TYPE1 ? pusch_dmrs_type1 : pusch_dmrs_type2;
|
||||||
|
float beta_dmrs_pusch = get_beta_dmrs_pusch(pusch_pdu->num_dmrs_cdm_grps_no_data, dmrs_type);
|
||||||
|
int16_t dmrs_scaling = (1 / beta_dmrs_pusch) * (1 << 14);
|
||||||
nr_pusch_dmrs_rx(gNB,
|
nr_pusch_dmrs_rx(gNB,
|
||||||
Ns,
|
Ns,
|
||||||
gold,
|
gold,
|
||||||
@@ -488,7 +492,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
0,
|
0,
|
||||||
nb_rb_pusch,
|
nb_rb_pusch,
|
||||||
(pusch_pdu->bwp_start + pusch_pdu->rb_start) * NR_NB_SC_PER_RB,
|
(pusch_pdu->bwp_start + pusch_pdu->rb_start) * NR_NB_SC_PER_RB,
|
||||||
pusch_pdu->dmrs_config_type);
|
pusch_pdu->dmrs_config_type,
|
||||||
|
dmrs_scaling);
|
||||||
} else { // if transform precoding or SC-FDMA is enabled in Uplink
|
} else { // if transform precoding or SC-FDMA is enabled in Uplink
|
||||||
// NR_SC_FDMA supports type1 DMRS so only 6 DMRS REs per RB possible
|
// NR_SC_FDMA supports type1 DMRS so only 6 DMRS REs per RB possible
|
||||||
const int index = get_index_for_dmrs_lowpapr_seq(nb_rb_pusch * (NR_NB_SC_PER_RB / 2));
|
const int index = get_index_for_dmrs_lowpapr_seq(nb_rb_pusch * (NR_NB_SC_PER_RB / 2));
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
//#define NR_PBCH_DMRS_LENGTH 144
|
//#define NR_PBCH_DMRS_LENGTH 144
|
||||||
//#define DEBUG_PUSCH
|
//#define DEBUG_PUSCH
|
||||||
|
|
||||||
|
#include "PHY/TOOLS/tools_defs.h"
|
||||||
#include "refsig_defs_ue.h"
|
#include "refsig_defs_ue.h"
|
||||||
#include "PHY/defs_nr_UE.h"
|
#include "PHY/defs_nr_UE.h"
|
||||||
#include "nr_refsig.h"
|
#include "nr_refsig.h"
|
||||||
@@ -73,7 +74,8 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
|
|||||||
unsigned char lp,
|
unsigned char lp,
|
||||||
unsigned short nb_pusch_rb,
|
unsigned short nb_pusch_rb,
|
||||||
uint32_t re_offset,
|
uint32_t re_offset,
|
||||||
uint8_t dmrs_type)
|
uint8_t dmrs_type,
|
||||||
|
int16_t dmrs_scaling)
|
||||||
{
|
{
|
||||||
typedef int array_of_w[2];
|
typedef int array_of_w[2];
|
||||||
const array_of_w *wf = (dmrs_type == pusch_dmrs_type1) ? wf1 : wf2;
|
const array_of_w *wf = (dmrs_type == pusch_dmrs_type1) ? wf1 : wf2;
|
||||||
@@ -91,6 +93,7 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
|
|||||||
int i = k + dmrs_offset;
|
int i = k + dmrs_offset;
|
||||||
int w = (wf[p - 1000][i & 1]) * (wt[p - 1000][lp]);
|
int w = (wf[p - 1000][i & 1]) * (wt[p - 1000][lp]);
|
||||||
output[k] = get_modulated(nr_gold_pusch, i, w == 1);
|
output[k] = get_modulated(nr_gold_pusch, i, w == 1);
|
||||||
|
output[k] = c16mulRealShift(output[k], dmrs_scaling, 14);
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("nr_pusch_dmrs_rx dmrs config type %d port %d nb_pusch_rb %d\n", dmrs_type, p, nb_pusch_rb);
|
printf("nr_pusch_dmrs_rx dmrs config type %d port %d nb_pusch_rb %d\n", dmrs_type, p, nb_pusch_rb);
|
||||||
printf("wf[%d] = %d wt[%d]= %d\n", i&1, wf[p-1000][i&1], lp, wt[p-1000][lp]);
|
printf("wf[%d] = %d wt[%d]= %d\n", i&1, wf[p-1000][i&1], lp, wt[p-1000][lp]);
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
|
|||||||
unsigned char lp,
|
unsigned char lp,
|
||||||
unsigned short nb_pusch_rb,
|
unsigned short nb_pusch_rb,
|
||||||
uint32_t re_offset,
|
uint32_t re_offset,
|
||||||
uint8_t dmrs_type);
|
uint8_t dmrs_type,
|
||||||
|
int16_t dmrs_scaling);
|
||||||
|
|
||||||
void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
|
void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
|
||||||
int32_t **dataF,
|
int32_t **dataF,
|
||||||
|
|||||||
@@ -392,13 +392,15 @@ static void dmrs_amp_mult(const uint32_t dmrs_port,
|
|||||||
const c16_t *mod_dmrs,
|
const c16_t *mod_dmrs,
|
||||||
c16_t *mod_dmrs_out,
|
c16_t *mod_dmrs_out,
|
||||||
const uint32_t n_dmrs,
|
const uint32_t n_dmrs,
|
||||||
const pusch_dmrs_type_t dmrs_type)
|
const pusch_dmrs_type_t dmrs_type,
|
||||||
|
const unsigned int num_cdm_groups_no_data)
|
||||||
{
|
{
|
||||||
|
float beta_dmrs_pusch = get_beta_dmrs_pusch(num_cdm_groups_no_data, dmrs_type);
|
||||||
/* short array that hold amplitude for k_prime = 0 and k_prime = 1 */
|
/* short array that hold amplitude for k_prime = 0 and k_prime = 1 */
|
||||||
int32_t alpha_dmrs[2] __attribute((aligned(16)));
|
int32_t alpha_dmrs[2] __attribute((aligned(16)));
|
||||||
for (int_fast8_t i = 0; i < sizeofArray(alpha_dmrs); i++) {
|
for (int_fast8_t i = 0; i < sizeofArray(alpha_dmrs); i++) {
|
||||||
const int32_t a = Wf[i] * Wt * AMP;
|
const int32_t a = Wf[i] * Wt * AMP;
|
||||||
alpha_dmrs[i] = a;
|
alpha_dmrs[i] = a * beta_dmrs_pusch;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* multiply amplitude with complex DMRS vector */
|
/* multiply amplitude with complex DMRS vector */
|
||||||
@@ -440,9 +442,9 @@ static void map_symbols(const nr_phy_pxsch_params_t p,
|
|||||||
c16_t mod_dmrs[ALNARS_16_4(n_dmrs)] __attribute((aligned(16)));
|
c16_t mod_dmrs[ALNARS_16_4(n_dmrs)] __attribute((aligned(16)));
|
||||||
if (p.transform_precoding == transformPrecoder_disabled) {
|
if (p.transform_precoding == transformPrecoder_disabled) {
|
||||||
nr_modulation(gold, n_dmrs * 2, DMRS_MOD_ORDER, (int16_t *)mod_dmrs);
|
nr_modulation(gold, n_dmrs * 2, DMRS_MOD_ORDER, (int16_t *)mod_dmrs);
|
||||||
dmrs_amp_mult(p.dmrs_port, p.Wt, p.Wf, mod_dmrs, mod_dmrs_amp, n_dmrs, p.dmrs_type);
|
dmrs_amp_mult(p.dmrs_port, p.Wt, p.Wf, mod_dmrs, mod_dmrs_amp, n_dmrs, p.dmrs_type, p.num_cdm_no_data);
|
||||||
} else {
|
} else {
|
||||||
dmrs_amp_mult(p.dmrs_port, p.Wt, p.Wf, dmrs_seq, mod_dmrs_amp, n_dmrs, p.dmrs_type);
|
dmrs_amp_mult(p.dmrs_port, p.Wt, p.Wf, dmrs_seq, mod_dmrs_amp, n_dmrs, p.dmrs_type, p.num_cdm_no_data);
|
||||||
}
|
}
|
||||||
} else if ((p.pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) && ptrs_symbol) {
|
} else if ((p.pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) && ptrs_symbol) {
|
||||||
AssertFatal(p.transform_precoding == transformPrecoder_disabled, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
|
AssertFatal(p.transform_precoding == transformPrecoder_disabled, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
|
||||||
|
|||||||
@@ -344,12 +344,6 @@ typedef enum {
|
|||||||
* DESCRIPTION : configuration for PUSCH
|
* DESCRIPTION : configuration for PUSCH
|
||||||
*
|
*
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
pusch_dmrs_type1 = 0,
|
|
||||||
pusch_dmrs_type2 = 1
|
|
||||||
} pusch_dmrs_type_t;
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
txConfig_codebook = 1,
|
txConfig_codebook = 1,
|
||||||
txConfig_nonCodebook = 2
|
txConfig_nonCodebook = 2
|
||||||
|
|||||||
Reference in New Issue
Block a user