Changed log macros names. Added PUCCH shortened support

master
ismagom 10 years ago
parent ec4ea55a4b
commit 5f6e7e5f59

@ -1,13 +1,13 @@
clear clear
ueConfig=struct('NCellID',25,'RNTI',11,'NULRB',6,'NSubframe',1,'CyclicPrefixUL','Normal','NTxAnts',1,'Hopping','Off'); ueConfig=struct('NCellID',25,'RNTI',11,'NULRB',6,'NSubframe',1,'CyclicPrefixUL','Normal','NTxAnts',1,'Hopping','Off');
pucchConfig=struct('NLayers',1,'OrthCover','Off','Shortened',0,'ResourceSize',0); pucchConfig=struct('NLayers',1,'OrthCover','Off','Shortened',1,'ResourceSize',0);
addpath('../../build/srslte/lib/phch/test') addpath('../../build/srslte/lib/phch/test')
format_str={'1','1a','1b','2','2a','2b'}; format_str={'1','1a','1b','2','2a','2b'};
k=1; k=1;
for f=1:5 for f=0:2
for n=0:7:130 for n=0:7:130
for d=1:3 for d=1:3
for ncs=0:d:7 for ncs=0:d:7
@ -48,7 +48,8 @@ for f=1:5
if (error_sym > 1e-5) if (error_sym > 1e-5)
disp(info) disp(info)
plot(abs(sym-sym_mat)) plot(1:length(sym),sym,1:length(sym_mat),sym_mat)
legend('srsLTE','Matlab')
error('Error in symbols'); error('Error in symbols');
end end
if (error_dmrs > 1e-5) if (error_dmrs > 1e-5)

@ -40,10 +40,10 @@
#ifndef LOG_H #ifndef LOG_H
#define LOG_H #define LOG_H
#define Error(fmt, ...) log_h->error(__FILE__, __LINE__, fmt, ##__VA_ARGS__) #define Error(fmt, ...) log_h->error_line(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Warning(fmt, ...) log_h->warning(__FILE__, __LINE__, fmt, ##__VA_ARGS__) #define Warning(fmt, ...) log_h->warning_line(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Info(fmt, ...) log_h->info(__FILE__, __LINE__, fmt, ##__VA_ARGS__) #define Info(fmt, ...) log_h->info_line(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
#define Debug(fmt, ...) log_h->debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__) #define Debug(fmt, ...) log_h->debug_line(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
namespace srslte { namespace srslte {
@ -78,10 +78,10 @@ public:
virtual void debug(std::string message, ...) = 0; virtual void debug(std::string message, ...) = 0;
// Same with line and file info // Same with line and file info
// virtual void error(std::string file, int line, std::string message, ...) = 0; virtual void error_line(std::string file, int line, std::string message, ...) = 0;
// virtual void warning(std::string file, int line, std::string message, ...) = 0; virtual void warning_line(std::string file, int line, std::string message, ...) = 0;
// virtual void info(std::string file, int line, std::string message, ...) = 0; virtual void info_line(std::string file, int line, std::string message, ...) = 0;
// virtual void debug(std::string file, int line, std::string message, ...) = 0; virtual void debug_line(std::string file, int line, std::string message, ...) = 0;
protected: protected:
std::string get_service_name() { return service_name; } std::string get_service_name() { return service_name; }

@ -59,10 +59,10 @@ public:
void debug(string message, ...); void debug(string message, ...);
// Same with line and file info // Same with line and file info
void error(string file, int line, string message, ...); void error_line(string file, int line, string message, ...);
void warning(string file, int line, string message, ...); void warning_line(string file, int line, string message, ...);
void info(string file, int line, string message, ...); void info_line(string file, int line, string message, ...);
void debug(string file, int line, string message, ...); void debug_line(string file, int line, string message, ...);
private: private:
typedef enum { typedef enum {

@ -96,7 +96,7 @@ void log_stdout::warning(string msg, ...)
} }
void log_stdout::error(string file, int line, string msg, ...) void log_stdout::error_line(string file, int line, string msg, ...)
{ {
va_list args; va_list args;
va_start(args, msg); va_start(args, msg);
@ -104,7 +104,7 @@ void log_stdout::error(string file, int line, string msg, ...)
va_end(args); va_end(args);
} }
void log_stdout::info(string file, int line, string msg, ...) void log_stdout::info_line(string file, int line, string msg, ...)
{ {
if (level >= LOG_LEVEL_INFO) { if (level >= LOG_LEVEL_INFO) {
va_list args; va_list args;
@ -114,7 +114,7 @@ void log_stdout::info(string file, int line, string msg, ...)
} }
} }
void log_stdout::debug(string file, int line, string msg, ...) void log_stdout::debug_line(string file, int line, string msg, ...)
{ {
if (level >= LOG_LEVEL_DEBUG) { if (level >= LOG_LEVEL_DEBUG) {
va_list args; va_list args;
@ -124,7 +124,7 @@ void log_stdout::debug(string file, int line, string msg, ...)
} }
} }
void log_stdout::warning(string file, int line, string msg, ...) void log_stdout::warning_line(string file, int line, string msg, ...)
{ {
va_list args; va_list args;
va_start(args, msg); va_start(args, msg);

@ -199,7 +199,7 @@ bool phy::sr_is_ready_to_send(uint32_t tti_) {
if (srslte_ue_ul_sr_send_tti(I_sr, tti_)) { if (srslte_ue_ul_sr_send_tti(I_sr, tti_)) {
sr_enabled = false; sr_enabled = false;
sr_tx_tti = tti_; sr_tx_tti = tti_;
Info("SR sending at TTI=%d\n", tti_); Info("SR transmission at TTI=%d\n", tti_);
return true; return true;
} }
} }

@ -102,7 +102,6 @@ bool ul_buffer::generate_cqi_report()
bool ul_buffer::generate_sr() { bool ul_buffer::generate_sr() {
uci_data.scheduling_request = true; uci_data.scheduling_request = true;
uci_pending = true; uci_pending = true;
Debug("SR Generating\n");
return true; return true;
} }
@ -154,6 +153,14 @@ bool ul_buffer::generate_data(ul_sched_grant *grant, srslte_softbuffer_tx_t *sof
pusch_hopping.current_tx_nb = grant->get_current_tx_nb(); pusch_hopping.current_tx_nb = grant->get_current_tx_nb();
} }
bool is_shortened = false;
if (params_db->get_param(phy_params::SRS_IS_CS_CONFIGURED)) {
if (srslte_refsignal_srs_send_cs((uint32_t) params_db->get_param(phy_params::SRS_CS_SFCFG), tti%10) == 1) {
is_shortened = true;
Info("PUCCH/PUSCH Shortened\n");
}
}
srslte_pucch_cfg_t pucch_cfg; srslte_pucch_cfg_t pucch_cfg;
bzero(&pucch_cfg, sizeof(srslte_pucch_cfg_t)); bzero(&pucch_cfg, sizeof(srslte_pucch_cfg_t));
pucch_cfg.beta_pucch = (float) params_db->get_param(phy_params::PUCCH_BETA)/10; pucch_cfg.beta_pucch = (float) params_db->get_param(phy_params::PUCCH_BETA)/10;
@ -161,6 +168,7 @@ bool ul_buffer::generate_data(ul_sched_grant *grant, srslte_softbuffer_tx_t *sof
pucch_cfg.group_hopping_en = dmrs_cfg.group_hopping_en; pucch_cfg.group_hopping_en = dmrs_cfg.group_hopping_en;
pucch_cfg.N_cs = params_db->get_param(phy_params::PUCCH_CYCLIC_SHIFT); pucch_cfg.N_cs = params_db->get_param(phy_params::PUCCH_CYCLIC_SHIFT);
pucch_cfg.n_rb_2 = params_db->get_param(phy_params::PUCCH_N_RB_2); pucch_cfg.n_rb_2 = params_db->get_param(phy_params::PUCCH_N_RB_2);
pucch_cfg.shortened = is_shortened;
srslte_pucch_sched_t pucch_sched; srslte_pucch_sched_t pucch_sched;
bzero(&pucch_sched, sizeof(srslte_pucch_sched_t)); bzero(&pucch_sched, sizeof(srslte_pucch_sched_t));
@ -183,17 +191,7 @@ bool ul_buffer::generate_data(ul_sched_grant *grant, srslte_softbuffer_tx_t *sof
// Transmit on PUSCH if UL grant available, otherwise in PUCCH // Transmit on PUSCH if UL grant available, otherwise in PUCCH
if (grant) { if (grant) {
/* grant->to_pusch_cfg(tti%10, is_shortened?1:0, &ue_ul);
uint32_t N_srs = 0;
if (params_db->get_param(phy_params::SRS_IS_CS_CONFIGURED)) {
if (srslte_refsignal_srs_send_cs((uint32_t) params_db->get_param(phy_params::SRS_CS_SFCFG), tti%10) == 1) {
N_srs = 1;
printf("UL grant tti=%d is shortened. SF-CFG=%d\n", tti,
(int) params_db->get_param(phy_params::SRS_CS_SFCFG));
}
}
*/
grant->to_pusch_cfg(tti%10, 0, &ue_ul);
Info("PUSCH: TTI=%d, TBS=%d, mod=%s, rb_start=%d n_prb=%d, ack=%s, sr=%s, rnti=%d, sf_idx=%d\n", Info("PUSCH: TTI=%d, TBS=%d, mod=%s, rb_start=%d n_prb=%d, ack=%s, sr=%s, rnti=%d, sf_idx=%d\n",
tti, grant->get_tbs(), srslte_mod_string(ue_ul.pusch_cfg.grant.mcs.mod), ue_ul.pusch_cfg.grant.n_prb[0], tti, grant->get_tbs(), srslte_mod_string(ue_ul.pusch_cfg.grant.mcs.mod), ue_ul.pusch_cfg.grant.n_prb[0],
@ -207,6 +205,7 @@ bool ul_buffer::generate_data(ul_sched_grant *grant, srslte_softbuffer_tx_t *sof
grant->get_rnti(), grant->get_rnti(),
signal_buffer); signal_buffer);
} else { } else {
Info("PUCCH: TTI=%d n_cce=%d, sf_idx=%d, ack=%s, sr=%s\n", tti, last_n_cce, tti%10, Info("PUCCH: TTI=%d n_cce=%d, sf_idx=%d, ack=%s, sr=%s\n", tti, last_n_cce, tti%10,
uci_data.uci_ack_len>0?(uci_data.uci_ack?"1":"0"):"no",uci_data.scheduling_request?"yes":"no"); uci_data.uci_ack_len>0?(uci_data.uci_ack?"1":"0"):"no",uci_data.scheduling_request?"yes":"no");

@ -70,6 +70,7 @@ typedef struct SRSLTE_API {
uint32_t n_rb_2; uint32_t n_rb_2;
uint32_t N_cs; uint32_t N_cs;
bool group_hopping_en; bool group_hopping_en;
bool shortened;
} srslte_pucch_cfg_t; } srslte_pucch_cfg_t;
/* PUSCH object */ /* PUSCH object */
@ -100,6 +101,9 @@ SRSLTE_API bool srslte_pucch_set_cfg(srslte_pucch_t* q,
SRSLTE_API int srslte_pucch_set_crnti(srslte_pucch_t *q, SRSLTE_API int srslte_pucch_set_crnti(srslte_pucch_t *q,
uint16_t c_rnti); uint16_t c_rnti);
SRSLTE_API uint32_t srslte_pucch_nof_symbols(srslte_pucch_cfg_t *cfg,
srslte_pucch_format_t format);
SRSLTE_API int srslte_pucch_encode(srslte_pucch_t *q, SRSLTE_API int srslte_pucch_encode(srslte_pucch_t *q,
srslte_pucch_format_t format, srslte_pucch_format_t format,
uint32_t n_pucch, // n_pucch_1 or n_pucch_2 depending on format uint32_t n_pucch, // n_pucch_1 or n_pucch_2 depending on format

@ -49,10 +49,18 @@ uint32_t pucch_symbol_format1_cpext[4] = {0, 1, 4, 5};
uint32_t pucch_symbol_format2_cpnorm[5] = {0, 2, 3, 4, 6}; uint32_t pucch_symbol_format2_cpnorm[5] = {0, 2, 3, 4, 6};
uint32_t pucch_symbol_format2_cpext[5] = {0, 1, 2, 4, 5}; uint32_t pucch_symbol_format2_cpext[5] = {0, 1, 2, 4, 5};
// Table 5.4.1-2 Orthogonal sequences w for N_sf=4 float w_n_oc[2][3][4] = {
float w_n_oc[3][4] = {{1, 1, 1, 1}, // Table 5.4.1-2 Orthogonal sequences w for N_sf=4 (complex argument)
{1,-1, 1,-1}, {{0, 0, 0, 0},
{1,-1,-1,1}}; {0,M_PI, 0, M_PI},
{0,M_PI, M_PI, 0}},
// Table 5.4.1-3 Orthogonal sequences w for N_sf=3
{{0, 0, 0, 0},
{0,2*M_PI/3, 4*M_PI/3,0},
{0,4*M_PI/3,2*M_PI/3,0}},
};
/* Verify PUCCH configuration as given in Section 5.4 36.211 */ /* Verify PUCCH configuration as given in Section 5.4 36.211 */
bool srslte_pucch_cfg_isvalid(srslte_pucch_cfg_t *cfg, uint32_t nof_prb) { bool srslte_pucch_cfg_isvalid(srslte_pucch_cfg_t *cfg, uint32_t nof_prb) {
@ -80,12 +88,16 @@ void srslte_pucch_cfg_default(srslte_pucch_cfg_t *cfg) {
cfg->delta_pucch_shift = 1; cfg->delta_pucch_shift = 1;
} }
uint32_t get_N_sf(srslte_pucch_format_t format) { uint32_t get_N_sf(srslte_pucch_format_t format, uint32_t slot_idx, bool shortened) {
switch (format) { switch (format) {
case SRSLTE_PUCCH_FORMAT_1: case SRSLTE_PUCCH_FORMAT_1:
case SRSLTE_PUCCH_FORMAT_1A: case SRSLTE_PUCCH_FORMAT_1A:
case SRSLTE_PUCCH_FORMAT_1B: case SRSLTE_PUCCH_FORMAT_1B:
return 4; if (!slot_idx) {
return 4;
} else {
return shortened?3:4;
}
case SRSLTE_PUCCH_FORMAT_2: case SRSLTE_PUCCH_FORMAT_2:
case SRSLTE_PUCCH_FORMAT_2A: case SRSLTE_PUCCH_FORMAT_2A:
case SRSLTE_PUCCH_FORMAT_2B: case SRSLTE_PUCCH_FORMAT_2B:
@ -94,6 +106,14 @@ uint32_t get_N_sf(srslte_pucch_format_t format) {
return 0; return 0;
} }
uint32_t srslte_pucch_nof_symbols(srslte_pucch_cfg_t *cfg, srslte_pucch_format_t format) {
uint32_t len=0;
for (uint32_t ns=0;ns<2;ns++) {
len += SRSLTE_NRE*get_N_sf(format, ns, cfg->shortened);
}
return len;
}
// Number of bits per subframe (M_bit) Table 5.4-1 36.211 // Number of bits per subframe (M_bit) Table 5.4-1 36.211
uint32_t srslte_pucch_nbits_format(srslte_pucch_format_t format) { uint32_t srslte_pucch_nbits_format(srslte_pucch_format_t format) {
switch(format) { switch(format) {
@ -271,8 +291,9 @@ static int pucch_put(srslte_pucch_t *q, srslte_pucch_format_t format, uint32_t n
// Determine m // Determine m
uint32_t m = srslte_pucch_m(&q->pucch_cfg, format, n_pucch, q->cell.cp); uint32_t m = srslte_pucch_m(&q->pucch_cfg, format, n_pucch, q->cell.cp);
uint32_t N_sf = get_N_sf(format); uint32_t N_sf_0 = get_N_sf(format, 0, q->pucch_cfg.shortened);
for (uint32_t ns=0;ns<2;ns++) { for (uint32_t ns=0;ns<2;ns++) {
uint32_t N_sf = get_N_sf(format, ns%2, q->pucch_cfg.shortened);
// Determine n_prb // Determine n_prb
uint32_t n_prb = m/2; uint32_t n_prb = m/2;
if ((m+ns)%2) { if ((m+ns)%2) {
@ -283,7 +304,7 @@ static int pucch_put(srslte_pucch_t *q, srslte_pucch_format_t format, uint32_t n
for (uint32_t i=0;i<N_sf;i++) { for (uint32_t i=0;i<N_sf;i++) {
uint32_t l = get_pucch_symbol(i, format, q->cell.cp); uint32_t l = get_pucch_symbol(i, format, q->cell.cp);
memcpy(&output[SRSLTE_RE_IDX(q->cell.nof_prb, l+ns*nsymbols, n_prb*SRSLTE_NRE)], memcpy(&output[SRSLTE_RE_IDX(q->cell.nof_prb, l+ns*nsymbols, n_prb*SRSLTE_NRE)],
&q->z[i*SRSLTE_NRE+ns*N_sf*SRSLTE_NRE], &q->z[i*SRSLTE_NRE+ns*N_sf_0*SRSLTE_NRE],
SRSLTE_NRE*sizeof(cf_t)); SRSLTE_NRE*sizeof(cf_t));
} }
} else { } else {
@ -467,9 +488,9 @@ int srslte_pucch_encode(srslte_pucch_t* q, srslte_pucch_format_t format,
fprintf(stderr, "Error encoding PUCCH bits\n"); fprintf(stderr, "Error encoding PUCCH bits\n");
return SRSLTE_ERROR; return SRSLTE_ERROR;
} }
uint32_t N_sf_0 = get_N_sf(format, 0, q->pucch_cfg.shortened);
uint32_t N_sf=get_N_sf(format);
for (uint32_t ns=2*sf_idx;ns<2*(sf_idx+1);ns++) { for (uint32_t ns=2*sf_idx;ns<2*(sf_idx+1);ns++) {
uint32_t N_sf = get_N_sf(format, ns%2, q->pucch_cfg.shortened);
// Get group hopping number u // Get group hopping number u
uint32_t f_gh=0; uint32_t f_gh=0;
if (q->pucch_cfg.group_hopping_en) { if (q->pucch_cfg.group_hopping_en) {
@ -478,7 +499,7 @@ int srslte_pucch_encode(srslte_pucch_t* q, srslte_pucch_format_t format,
uint32_t u = (f_gh + (q->cell.id%30))%30; uint32_t u = (f_gh + (q->cell.id%30))%30;
srslte_refsignal_r_uv_arg_1prb(q->tmp_arg, u); srslte_refsignal_r_uv_arg_1prb(q->tmp_arg, u);
uint32_t N_sf_widx = N_sf==3?1:0;
for (uint32_t m=0;m<N_sf;m++) { for (uint32_t m=0;m<N_sf;m++) {
uint32_t l = get_pucch_symbol(m, format, q->cell.cp); uint32_t l = get_pucch_symbol(m, format, q->cell.cp);
uint32_t n_prime_ns; uint32_t n_prime_ns;
@ -499,8 +520,8 @@ int srslte_pucch_encode(srslte_pucch_t* q, srslte_pucch_format_t format,
DEBUG("PUCCH d_0: %.1f+%.1fi, alpha: %.1f, n_oc: %d, n_prime_ns: %d, n_rb_2=%d\n", DEBUG("PUCCH d_0: %.1f+%.1fi, alpha: %.1f, n_oc: %d, n_prime_ns: %d, n_rb_2=%d\n",
__real__ q->d[0], __imag__ q->d[0], alpha, n_oc, n_prime_ns, q->pucch_cfg.n_rb_2); __real__ q->d[0], __imag__ q->d[0], alpha, n_oc, n_prime_ns, q->pucch_cfg.n_rb_2);
for (uint32_t n=0;n<SRSLTE_PUCCH_N_SEQ;n++) { for (uint32_t n=0;n<SRSLTE_PUCCH_N_SEQ;n++) {
q->z[(ns%2)*N_sf*SRSLTE_PUCCH_N_SEQ+m*SRSLTE_PUCCH_N_SEQ+n] = q->pucch_cfg.beta_pucch q->z[(ns%2)*N_sf_0*SRSLTE_PUCCH_N_SEQ+m*SRSLTE_PUCCH_N_SEQ+n] = q->pucch_cfg.beta_pucch
*q->d[0]*w_n_oc[n_oc%3][m]*cexpf(I*(q->tmp_arg[n]+alpha*n+S_ns)); *q->d[0]*cexpf(I*(w_n_oc[N_sf_widx][n_oc%3][m]+q->tmp_arg[n]+alpha*n+S_ns));
} }
} }
} }

@ -109,6 +109,13 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
mxFree(hop); mxFree(hop);
} }
pucch_cfg.shortened = false;
uint32_t sh = 0;
mexutils_read_uint32_struct(PUCCHCFG, "Shortened", &sh);
if (sh == 1) {
pucch_cfg.shortened = true;
}
uint8_t bits[SRSLTE_PUCCH_MAX_BITS]; uint8_t bits[SRSLTE_PUCCH_MAX_BITS];
uint8_t pucch2_bits[2]; uint8_t pucch2_bits[2];
float *bits_ptr; float *bits_ptr;
@ -167,10 +174,7 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
} }
if (nlhs >= 1) { if (nlhs >= 1) {
uint32_t n_bits = 96; uint32_t n_bits = srslte_pucch_nof_symbols(&pucch_cfg, format);
if (format >= SRSLTE_PUCCH_FORMAT_2) {
n_bits = 120;
}
mexutils_write_cf(pucch.z, &plhs[0], n_bits, 1); mexutils_write_cf(pucch.z, &plhs[0], n_bits, 1);
} }

Loading…
Cancel
Save