Changes on PUSCH DRMS configuration structure

master
ismagom 10 years ago
parent 4e2f9311b7
commit ee53e11a8b

@ -427,6 +427,10 @@ int main(int argc, char **argv) {
if (((sfn%2) == 1) && (ue_sync_get_sfidx(&ue_sync) == 1)) { if (((sfn%2) == 1) && (ue_sync_get_sfidx(&ue_sync) == 1)) {
ue_sync_get_last_timestamp(&ue_sync, &uhd_time); ue_sync_get_last_timestamp(&ue_sync, &uhd_time);
cfo_correct(&ue_sync.sfind.cfocorr,
prach_buffers[7], prach_buffers[7],
-ue_sync_get_cfo(&ue_sync) / lte_symbol_sz(cell.nof_prb));
timestamp_copy(&next_tx_time, &uhd_time); timestamp_copy(&next_tx_time, &uhd_time);
timestamp_add(&next_tx_time, 0, 0.01); // send next frame (10 ms) timestamp_add(&next_tx_time, 0, 0.01); // send next frame (10 ms)
printf("Send prach sfn: %d. Last frame time = %.6f, send prach time = %.6f\n", printf("Send prach sfn: %d. Last frame time = %.6f, send prach time = %.6f\n",
@ -490,7 +494,7 @@ int main(int argc, char **argv) {
printf("ta: %d, n_ta: %d\n", rar_msg.timing_adv_cmd, n_ta); printf("ta: %d, n_ta: %d\n", rar_msg.timing_adv_cmd, n_ta);
float time_adv_sec = ((float) n_ta)*TS_PRB(cell.nof_prb); float time_adv_sec = ((float) n_ta)*TS_PRB(cell.nof_prb);
vec_sc_prod_cfc(ul_signal, 2, ul_signal, SF_LEN_PRB(cell.nof_prb)); vec_sc_prod_cfc(ul_signal, 20, ul_signal, SF_LEN_PRB(cell.nof_prb));
timestamp_copy(&next_tx_time, &uhd_time); timestamp_copy(&next_tx_time, &uhd_time);

@ -52,8 +52,8 @@ typedef struct LIBLTE_API {
typedef struct LIBLTE_API { typedef struct LIBLTE_API {
refsignal_ul_cfg_t common; refsignal_ul_cfg_t common;
float beta_pusch; float beta_pusch;
lte_hopping_method_t hopping_method; bool group_hopping_en;
uint32_t nof_prb; bool sequence_hopping_en;
}refsignal_drms_pusch_cfg_t; }refsignal_drms_pusch_cfg_t;
typedef struct LIBLTE_API { typedef struct LIBLTE_API {
@ -86,19 +86,31 @@ LIBLTE_API int refsignal_ul_init(refsignal_ul_t *q,
LIBLTE_API void refsignal_ul_free(refsignal_ul_t *q); LIBLTE_API void refsignal_ul_free(refsignal_ul_t *q);
LIBLTE_API bool refsignal_drms_pusch_cfg_isvalid(refsignal_ul_t *q, LIBLTE_API bool refsignal_drms_pusch_cfg_isvalid(refsignal_ul_t *q,
refsignal_drms_pusch_cfg_t *cfg); refsignal_drms_pusch_cfg_t *cfg,
uint32_t nof_prb);
LIBLTE_API void refsignal_drms_pusch_put(refsignal_ul_t *q, LIBLTE_API void refsignal_drms_pusch_put(refsignal_ul_t *q,
refsignal_drms_pusch_cfg_t *cfg, refsignal_drms_pusch_cfg_t *cfg,
cf_t *r_pusch, cf_t *r_pusch,
uint32_t ns_idx, uint32_t ns_idx,
uint32_t nof_prb,
uint32_t n_prb, uint32_t n_prb,
cf_t *sf_symbols); cf_t *sf_symbols);
LIBLTE_API int refsignal_dmrs_pusch_gen(refsignal_ul_t *q, refsignal_drms_pusch_cfg_t *cfg, uint32_t ns, cf_t *r_pusch); LIBLTE_API int refsignal_dmrs_pusch_gen(refsignal_ul_t *q,
refsignal_drms_pusch_cfg_t *cfg,
LIBLTE_API void refsignal_dmrs_pucch_gen(refsignal_ul_t *q, refsignal_drms_pucch_cfg_t *cfg, uint32_t ns, cf_t *r_pucch); uint32_t nof_prb,
uint32_t ns,
LIBLTE_API void refsignal_srs_gen(refsignal_ul_t *q, refsignal_srs_cfg_t *cfg, uint32_t ns, cf_t *r_srs); cf_t *r_pusch);
LIBLTE_API void refsignal_dmrs_pucch_gen(refsignal_ul_t *q,
refsignal_drms_pucch_cfg_t *cfg,
uint32_t ns,
cf_t *r_pucch);
LIBLTE_API void refsignal_srs_gen(refsignal_ul_t *q,
refsignal_srs_cfg_t *cfg,
uint32_t ns,
cf_t *r_srs);
#endif #endif

@ -144,10 +144,6 @@ typedef enum LIBLTE_API {
LTE_BPSK = 0, LTE_QPSK = 1, LTE_QAM16 = 2, LTE_QAM64 = 3 LTE_BPSK = 0, LTE_QPSK = 1, LTE_QAM16 = 2, LTE_QAM64 = 3
} lte_mod_t; } lte_mod_t;
typedef enum LIBLTE_API {
HOPPING_OFF = 0, HOPPING_GROUP = 1, HOPPING_SEQUENCE = 2
} lte_hopping_method_t;
typedef struct LIBLTE_API { typedef struct LIBLTE_API {
int id; int id;
float fd; float fd;

@ -210,13 +210,13 @@ static void arg_r_uv_mprb(float *arg, uint32_t M_sc, uint32_t u, uint32_t v) {
} }
/* Computes argument of r_u_v signal */ /* Computes argument of r_u_v signal */
static void compute_pusch_r_uv_arg(refsignal_ul_t *q, refsignal_drms_pusch_cfg_t *cfg, uint32_t u, uint32_t v) { static void compute_pusch_r_uv_arg(refsignal_ul_t *q, refsignal_drms_pusch_cfg_t *cfg, uint32_t nof_prb, uint32_t u, uint32_t v) {
if (cfg->nof_prb == 1) { if (nof_prb == 1) {
arg_r_uv_1prb(q->tmp_arg, u); arg_r_uv_1prb(q->tmp_arg, u);
} else if (cfg->nof_prb == 2) { } else if (nof_prb == 2) {
arg_r_uv_2prb(q->tmp_arg, u); arg_r_uv_2prb(q->tmp_arg, u);
} else { } else {
arg_r_uv_mprb(q->tmp_arg, RE_X_RB*cfg->nof_prb, u, v); arg_r_uv_mprb(q->tmp_arg, RE_X_RB*nof_prb, u, v);
} }
} }
@ -232,11 +232,11 @@ static float get_alpha(refsignal_ul_t *q, refsignal_ul_cfg_t *cfg, uint32_t ns)
} }
bool refsignal_drms_pusch_cfg_isvalid(refsignal_ul_t *q, refsignal_drms_pusch_cfg_t *cfg) { bool refsignal_drms_pusch_cfg_isvalid(refsignal_ul_t *q, refsignal_drms_pusch_cfg_t *cfg, uint32_t nof_prb) {
if (cfg->common.cyclic_shift < NOF_CSHIFT && if (cfg->common.cyclic_shift < NOF_CSHIFT &&
cfg->common.cyclic_shift_for_drms < NOF_CSHIFT && cfg->common.cyclic_shift_for_drms < NOF_CSHIFT &&
cfg->common.delta_ss < NOF_DELTA_SS && cfg->common.delta_ss < NOF_DELTA_SS &&
cfg->nof_prb < q->cell.nof_prb) { nof_prb < q->cell.nof_prb) {
return true; return true;
} else { } else {
return false; return false;
@ -245,25 +245,28 @@ bool refsignal_drms_pusch_cfg_isvalid(refsignal_ul_t *q, refsignal_drms_pusch_cf
void refsignal_drms_pusch_put(refsignal_ul_t *q, refsignal_drms_pusch_cfg_t *cfg, void refsignal_drms_pusch_put(refsignal_ul_t *q, refsignal_drms_pusch_cfg_t *cfg,
cf_t *r_pusch, cf_t *r_pusch,
uint32_t ns_idx, uint32_t n_prb, uint32_t ns_idx,
uint32_t nof_prb,
uint32_t n_prb,
cf_t *sf_symbols) cf_t *sf_symbols)
{ {
if (ns_idx < 2) { if (ns_idx < 2) {
DEBUG("Putting DRMS to n_prb: %d, L: %d, ns_idx: %d\n", n_prb, nof_prb, ns_idx);
uint32_t L = (ns_idx+1)*CP_NSYMB(q->cell.cp)-4; uint32_t L = (ns_idx+1)*CP_NSYMB(q->cell.cp)-4;
memcpy(&sf_symbols[RE_IDX(q->cell.nof_prb, L, n_prb*RE_X_RB)], r_pusch, cfg->nof_prb*RE_X_RB*sizeof(cf_t)); memcpy(&sf_symbols[RE_IDX(q->cell.nof_prb, L, n_prb*RE_X_RB)], r_pusch, nof_prb*RE_X_RB*sizeof(cf_t));
} }
} }
/* Generate DRMS for PUSCH signal according to 5.5.2.1 of 36.211 */ /* Generate DRMS for PUSCH signal according to 5.5.2.1 of 36.211 */
int refsignal_dmrs_pusch_gen(refsignal_ul_t *q, refsignal_drms_pusch_cfg_t *cfg, uint32_t ns, cf_t *r_pusch) { int refsignal_dmrs_pusch_gen(refsignal_ul_t *q, refsignal_drms_pusch_cfg_t *cfg, uint32_t nof_prb, uint32_t ns, cf_t *r_pusch) {
int ret = LIBLTE_ERROR_INVALID_INPUTS; int ret = LIBLTE_ERROR_INVALID_INPUTS;
if (refsignal_drms_pusch_cfg_isvalid(q, cfg)) { if (refsignal_drms_pusch_cfg_isvalid(q, cfg, nof_prb)) {
ret = LIBLTE_ERROR; ret = LIBLTE_ERROR;
// Get group hopping number u // Get group hopping number u
uint32_t f_gh=0; uint32_t f_gh=0;
if (cfg->hopping_method == HOPPING_GROUP) { if (cfg->group_hopping_en) {
f_gh = q->f_gh[ns]; f_gh = q->f_gh[ns];
} }
uint32_t u = (f_gh + (q->cell.id%30)+cfg->common.delta_ss)%30; uint32_t u = (f_gh + (q->cell.id%30)+cfg->common.delta_ss)%30;
@ -271,25 +274,25 @@ int refsignal_dmrs_pusch_gen(refsignal_ul_t *q, refsignal_drms_pusch_cfg_t *cfg,
// Get sequence hopping number v // Get sequence hopping number v
uint32_t v = 0; uint32_t v = 0;
if (cfg->nof_prb >= 6 && cfg->hopping_method == HOPPING_SEQUENCE) { if (nof_prb >= 6 && cfg->sequence_hopping_en) {
v = q->v_pusch[ns][cfg->common.delta_ss]; v = q->v_pusch[ns][cfg->common.delta_ss];
} }
// Compute signal argument // Compute signal argument
compute_pusch_r_uv_arg(q, cfg, u, v); compute_pusch_r_uv_arg(q, cfg, nof_prb, u, v);
// Add cyclic prefix alpha // Add cyclic prefix alpha
float alpha = get_alpha(q, &cfg->common, ns); float alpha = get_alpha(q, &cfg->common, ns);
if (verbose == VERBOSE_DEBUG) { if (verbose == VERBOSE_DEBUG) {
uint32_t N_sz = largest_prime_lower_than(cfg->nof_prb*RE_X_RB); uint32_t N_sz = largest_prime_lower_than(nof_prb*RE_X_RB);
DEBUG("Generating PUSCH DRMS sequence with parameters:\n",0); DEBUG("Generating PUSCH DRMS sequence with parameters:\n",0);
DEBUG("\tu: %d, v: %d, alpha: %f, N_sc: %d, root q: %d\n", DEBUG("\tnof_prb: %d, u: %d, v: %d, alpha: %f, N_sc: %d, root q: %d\n",
u, v, alpha, N_sz, get_q(u,v,N_sz)); nof_prb, u, v, alpha, N_sz, get_q(u,v,N_sz));
} }
// Do complex exponential and adjust amplitude // Do complex exponential and adjust amplitude
for (int i=0;i<RE_X_RB*cfg->nof_prb;i++) { for (int i=0;i<RE_X_RB*nof_prb;i++) {
r_pusch[i] = cfg->beta_pusch * cexpf(I*(q->tmp_arg[i] + alpha*i)); r_pusch[i] = cfg->beta_pusch * cexpf(I*(q->tmp_arg[i] + alpha*i));
} }
ret = 0; ret = 0;

@ -76,18 +76,16 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
bzero(&pusch_cfg, sizeof(refsignal_drms_pusch_cfg_t)); bzero(&pusch_cfg, sizeof(refsignal_drms_pusch_cfg_t));
pusch_cfg.group_hopping_en = false;
pusch_cfg.sequence_hopping_en = false;
char *tmp = mexutils_get_char_struct(UECFG, "Hopping"); char *tmp = mexutils_get_char_struct(UECFG, "Hopping");
if (tmp) { if (tmp) {
if (!strcmp(tmp, "Group")) { if (!strcmp(tmp, "Group")) {
pusch_cfg.hopping_method = HOPPING_GROUP; pusch_cfg.group_hopping_en = true;
} else if (!strcmp(tmp, "Sequence")) { } else if (!strcmp(tmp, "Sequence")) {
pusch_cfg.hopping_method = HOPPING_SEQUENCE; pusch_cfg.sequence_hopping_en = true;
} else {
pusch_cfg.hopping_method = HOPPING_OFF;
} }
mxFree(tmp); mxFree(tmp);
} else {
pusch_cfg.hopping_method = HOPPING_OFF;
} }
@ -104,7 +102,7 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
mexErrMsgTxt("Error field PRBSet not found in PUSCH config\n"); mexErrMsgTxt("Error field PRBSet not found in PUSCH config\n");
return; return;
} }
pusch_cfg.nof_prb = mexutils_read_f(p, &prbset); uint32_t nof_prb = mexutils_read_f(p, &prbset);
if (mexutils_read_uint32_struct(PUSCHCFG, "DynCyclicShift", &pusch_cfg.common.cyclic_shift_for_drms)) { if (mexutils_read_uint32_struct(PUSCHCFG, "DynCyclicShift", &pusch_cfg.common.cyclic_shift_for_drms)) {
pusch_cfg.common.cyclic_shift_for_drms = 0; pusch_cfg.common.cyclic_shift_for_drms = 0;
@ -120,13 +118,12 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
return; return;
} }
mexPrintf("nof_prb: %d, ",pusch_cfg.nof_prb); mexPrintf("nof_prb: %d, ",nof_prb);
mexPrintf("cyclic_shift: %d, ",pusch_cfg.common.cyclic_shift); mexPrintf("cyclic_shift: %d, ",pusch_cfg.common.cyclic_shift);
mexPrintf("cyclic_shift_for_drms: %d, ",pusch_cfg.common.cyclic_shift_for_drms); mexPrintf("cyclic_shift_for_drms: %d, ",pusch_cfg.common.cyclic_shift_for_drms);
mexPrintf("delta_ss: %d, ",pusch_cfg.common.delta_ss); mexPrintf("delta_ss: %d, ",pusch_cfg.common.delta_ss);
mexPrintf("hopping_method: %d\n, ",pusch_cfg.hopping_method);
cf_t *signal = vec_malloc(2*RE_X_RB*pusch_cfg.nof_prb*sizeof(cf_t)); cf_t *signal = vec_malloc(2*RE_X_RB*nof_prb*sizeof(cf_t));
if (!signal) { if (!signal) {
perror("malloc"); perror("malloc");
return; return;
@ -139,10 +136,10 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
bzero(sf_symbols, SF_LEN_RE(cell.nof_prb, cell.cp)*sizeof(cf_t)); bzero(sf_symbols, SF_LEN_RE(cell.nof_prb, cell.cp)*sizeof(cf_t));
for (uint32_t i=0;i<2;i++) { for (uint32_t i=0;i<2;i++) {
//mexPrintf("Generating DRMS for ns=%d, nof_prb=%d\n", 2*sf_idx+i,pusch_cfg.nof_prb); //mexPrintf("Generating DRMS for ns=%d, nof_prb=%d\n", 2*sf_idx+i,pusch_cfg.nof_prb);
refsignal_dmrs_pusch_gen(&refs, &pusch_cfg, 2*sf_idx+i, &signal[i*RE_X_RB*pusch_cfg.nof_prb]); refsignal_dmrs_pusch_gen(&refs, &pusch_cfg, nof_prb, 2*sf_idx+i, &signal[i*RE_X_RB*nof_prb]);
} }
for (uint32_t i=0;i<2;i++) { for (uint32_t i=0;i<2;i++) {
refsignal_drms_pusch_put(&refs, &pusch_cfg, &signal[i*RE_X_RB*pusch_cfg.nof_prb], i, prbset[0], sf_symbols); refsignal_drms_pusch_put(&refs, &pusch_cfg, &signal[i*RE_X_RB*nof_prb], i, nof_prb, prbset[0], sf_symbols);
} }
if (nlhs >= 1) { if (nlhs >= 1) {
mexutils_write_cf(sf_symbols, &plhs[0], SF_LEN_RE(cell.nof_prb, cell.cp), 1); mexutils_write_cf(sf_symbols, &plhs[0], SF_LEN_RE(cell.nof_prb, cell.cp), 1);

@ -74,8 +74,6 @@ void parse_args(int argc, char **argv) {
} }
} }
lte_hopping_method_t hopping_modes[3]={HOPPING_OFF, HOPPING_SEQUENCE, HOPPING_GROUP};
int main(int argc, char **argv) { int main(int argc, char **argv) {
refsignal_ul_t refs; refsignal_ul_t refs;
refsignal_drms_pusch_cfg_t pusch_cfg; refsignal_drms_pusch_cfg_t pusch_cfg;
@ -100,24 +98,32 @@ int main(int argc, char **argv) {
for (int n=6;n<cell.nof_prb;n++) { for (int n=6;n<cell.nof_prb;n++) {
for (int delta_ss=29;delta_ss<NOF_DELTA_SS;delta_ss++) { for (int delta_ss=29;delta_ss<NOF_DELTA_SS;delta_ss++) {
for (int cshift=0;cshift<NOF_CSHIFT;cshift++) { for (int cshift=0;cshift<NOF_CSHIFT;cshift++) {
for (int h=1;h<3;h++) { for (int h=0;h<3;h++) {
for (int ns=0;ns<NSLOTS_X_FRAME;ns++) { for (int ns=0;ns<NSLOTS_X_FRAME;ns++) {
for (int cshift_drms=0;cshift_drms<NOF_CSHIFT;cshift_drms++) { for (int cshift_drms=0;cshift_drms<NOF_CSHIFT;cshift_drms++) {
pusch_cfg.beta_pusch = 1.0; pusch_cfg.beta_pusch = 1.0;
pusch_cfg.nof_prb = n; uint32_t nof_prb = n;
pusch_cfg.common.cyclic_shift = cshift; pusch_cfg.common.cyclic_shift = cshift;
pusch_cfg.common.cyclic_shift_for_drms = cshift_drms; pusch_cfg.common.cyclic_shift_for_drms = cshift_drms;
pusch_cfg.common.delta_ss = delta_ss; pusch_cfg.common.delta_ss = delta_ss;
pusch_cfg.hopping_method = hopping_modes[h]; if (!h) {
pusch_cfg.group_hopping_en = false;
pusch_cfg.sequence_hopping_en = false;
} else if (h == 1) {
pusch_cfg.group_hopping_en = false;
pusch_cfg.sequence_hopping_en = true;
} else if (h == 2) {
pusch_cfg.group_hopping_en = true;
pusch_cfg.sequence_hopping_en = false;
}
pusch_cfg.common.en_drms_2 = true; pusch_cfg.common.en_drms_2 = true;
printf("Beta: %f, ",pusch_cfg.beta_pusch); printf("Beta: %f, ",pusch_cfg.beta_pusch);
printf("nof_prb: %d, ",pusch_cfg.nof_prb); printf("nof_prb: %d, ",nof_prb);
printf("cyclic_shift: %d, ",pusch_cfg.common.cyclic_shift); printf("cyclic_shift: %d, ",pusch_cfg.common.cyclic_shift);
printf("cyclic_shift_for_drms: %d, ",pusch_cfg.common.cyclic_shift_for_drms); printf("cyclic_shift_for_drms: %d, ",pusch_cfg.common.cyclic_shift_for_drms);
printf("delta_ss: %d, ",pusch_cfg.common.delta_ss); printf("delta_ss: %d, ",pusch_cfg.common.delta_ss);
printf("hopping_method: %d, ",pusch_cfg.hopping_method);
printf("Slot: %d\n", ns); printf("Slot: %d\n", ns);
refsignal_dmrs_pusch_gen(&refs, &pusch_cfg, ns, signal); refsignal_dmrs_pusch_gen(&refs, &pusch_cfg, nof_prb, ns, signal);
exit(0); exit(0);
} }
} }

@ -409,8 +409,8 @@ int pusch_uci_encode_rnti(pusch_t *q, harq_t *harq, uint8_t *data, uci_data_t uc
return LIBLTE_ERROR_INVALID_INPUTS; return LIBLTE_ERROR_INVALID_INPUTS;
} }
INFO("Encoding PUSCH SF: %d, Mod %s, TBS: %d, NofSymbols: %d, NofBitsE: %d, rv_idx: %d\n", INFO("Encoding PUSCH SF: %d, Mod %s, RNTI: %d, TBS: %d, NofSymbols: %d, NofBitsE: %d, rv_idx: %d\n",
harq->sf_idx, lte_mod_string(harq->mcs.mod), harq->mcs.tbs, harq->nof_re, harq->nof_bits, harq->rv); harq->sf_idx, lte_mod_string(harq->mcs.mod), rnti, harq->mcs.tbs, harq->nof_re, harq->nof_bits, harq->rv);
bzero(q->pusch_q, harq->nof_bits); bzero(q->pusch_q, harq->nof_bits);
if (ulsch_uci_encode(&q->dl_sch, harq, data, uci_data, q->pusch_g, q->pusch_q)) { if (ulsch_uci_encode(&q->dl_sch, harq, data, uci_data, q->pusch_g, q->pusch_q)) {

@ -112,8 +112,8 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
ra_ul_alloc_t prb_alloc; ra_ul_alloc_t prb_alloc;
bzero(&prb_alloc, sizeof(ra_ul_alloc_t)); bzero(&prb_alloc, sizeof(ra_ul_alloc_t));
prb_alloc.L_prb = mexutils_read_f(p, &prbset); prb_alloc.L_prb = mexutils_read_f(p, &prbset);
prb_alloc.n_prb[2*sf_idx] = prbset[0]; prb_alloc.n_prb[0] = prbset[0];
prb_alloc.n_prb[2*sf_idx+1] = prbset[0]; prb_alloc.n_prb[1] = prbset[0];
free(prbset); free(prbset);
mexPrintf("L_prb: %d, n_prb: %d\n", prb_alloc.L_prb, prb_alloc.n_prb[2*sf_idx]); mexPrintf("L_prb: %d, n_prb: %d\n", prb_alloc.L_prb, prb_alloc.n_prb[2*sf_idx]);

@ -140,7 +140,7 @@ void ue_ul_reset(ue_ul_t *q) {
void ue_ul_set_pusch_cfg(ue_ul_t *q, refsignal_drms_pusch_cfg_t *pusch_drms_cfg, pusch_hopping_cfg_t *pusch_hopping_cfg) void ue_ul_set_pusch_cfg(ue_ul_t *q, refsignal_drms_pusch_cfg_t *pusch_drms_cfg, pusch_hopping_cfg_t *pusch_hopping_cfg)
{ {
memcpy(&q->pusch_drms_cfg, pusch_drms_cfg, sizeof(refsignal_drms_pucch_cfg_t)); memcpy(&q->pusch_drms_cfg, pusch_drms_cfg, sizeof(refsignal_drms_pusch_cfg_t));
pusch_set_hopping_cfg(&q->pusch, pusch_hopping_cfg); pusch_set_hopping_cfg(&q->pusch, pusch_hopping_cfg);
} }
@ -186,27 +186,25 @@ int ue_ul_pusch_uci_encode_rnti(ue_ul_t *q, ra_pusch_t *ra_ul, uint8_t *data, uc
fprintf(stderr, "Error configuring HARQ process\n"); fprintf(stderr, "Error configuring HARQ process\n");
return ret; return ret;
} }
printf("sf_idx: %d, rnti: %d\n", sf_idx, rnti);
if (pusch_encode_rnti(&q->pusch, &q->harq_process[0], data, rnti, q->sf_symbols)) { if (pusch_encode_rnti(&q->pusch, &q->harq_process[0], data, rnti, q->sf_symbols)) {
fprintf(stderr, "Error encoding TB\n"); fprintf(stderr, "Error encoding TB\n");
return ret; return ret;
} }
q->pusch_drms_cfg.nof_prb = ra_ul->prb_alloc.L_prb;
for (uint32_t i=0;i<2;i++) { for (uint32_t i=0;i<2;i++) {
// FIXME: Pregenerate for all possible number of prb // FIXME: Pregenerate for all possible number of prb
if (refsignal_dmrs_pusch_gen(&q->drms, &q->pusch_drms_cfg, 2*sf_idx+i, q->refsignal)) { if (refsignal_dmrs_pusch_gen(&q->drms, &q->pusch_drms_cfg, ra_ul->prb_alloc.L_prb, 2*sf_idx+i, q->refsignal)) {
fprintf(stderr, "Error generating PUSCH DRMS signals\n"); fprintf(stderr, "Error generating PUSCH DRMS signals\n");
return ret; return ret;
} }
printf("n_prb_tilde[%d] = %d\n", i, ra_ul->prb_alloc.n_prb_tilde[i]);
refsignal_drms_pusch_put(&q->drms, &q->pusch_drms_cfg, q->refsignal, i, refsignal_drms_pusch_put(&q->drms, &q->pusch_drms_cfg, q->refsignal, i,
ra_ul->prb_alloc.n_prb_tilde[i], q->sf_symbols); ra_ul->prb_alloc.L_prb, ra_ul->prb_alloc.n_prb_tilde[i], q->sf_symbols);
} }
lte_ifft_run_sf(&q->fft, q->sf_symbols, output_signal); lte_ifft_run_sf(&q->fft, q->sf_symbols, output_signal);
// cfo_correct(&q->cfo, output_signal, output_signal, q->current_cfo / lte_symbol_sz(q->cell.nof_prb)); cfo_correct(&q->cfo, output_signal, output_signal, q->current_cfo / lte_symbol_sz(q->cell.nof_prb));
ret = LIBLTE_SUCCESS; ret = LIBLTE_SUCCESS;
} }

@ -35,7 +35,6 @@ for prb=3
if (error(k) > 10^-3) if (error(k) > 10^-3)
k=1; k=1;
end end
read_real
k=k+1; k=k+1;
end end
end end
@ -49,5 +48,5 @@ plot(error);
disp(info) disp(info)
disp(length(subframe_mat)) disp(length(subframe_mat))
n=1:length(subframe_mat(:)); n=1:length(subframe_mat(:));
plot(n,real(subframe_mat(:)),n,real(subframe_lib(:))) %plot(n,real(subframe_mat(:)),n,real(subframe_lib(:)))
plot(abs(subframe_mat(:)-subframe_lib(:)))

@ -1,6 +1,6 @@
clear clear
ueConfig=struct('NCellID',1,'NULRB',25,'NSubframe',4,'RNTI',82,'CyclicPrefixUL','Normal','NTxAnts',1); ueConfig=struct('NCellID',0,'NULRB',25,'NSubframe',4,'RNTI',82,'CyclicPrefixUL','Normal','NTxAnts',1);
puschConfig=struct('NLayers',1,'OrthCover','Off','PRBSet',[21:24]','Modulation','QPSK','RV',0,'Shortened',0); puschConfig=struct('NLayers',1,'OrthCover','Off','PRBSet',[0:2]','Modulation','QPSK','RV',0,'Shortened',0);
addpath('../../debug/lte/phy/lib/phch/test') addpath('../../debug/lte/phy/lib/phch/test')
@ -10,7 +10,7 @@ addpath('../../debug/lte/phy/lib/phch/test')
% rvs=0; % rvs=0;
% betas=0:3:11; % betas=0:3:11;
TBs=88; TBs=56;
cqilen=0; cqilen=0;
mods={'QPSK'}; mods={'QPSK'};
rvs=0; rvs=0;
@ -68,7 +68,8 @@ end
if (length(TBs) == 1) if (length(TBs) == 1)
%disp(info) %disp(info)
n=1:length(mat); %n=1:length(mat);
%plot(abs(double(mat)-double(lib))) %plot(abs(double(mat)-double(lib)))
plot(n,real(lib(n)),n,real(mat(n))) %plot(n,real(lib(n)),n,real(mat(n)))
plot(abs(waveform_lib-waveform))
end end

Loading…
Cancel
Save