dft-based pucch0 receiver
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
|
||||
#include "T.h"
|
||||
|
||||
#define DEBUG_NR_PUCCH_RX 1
|
||||
|
||||
void nr_decode_pucch0(int32_t **rxdataF,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
@@ -79,28 +80,32 @@ void nr_decode_pucch0(int32_t **rxdataF,
|
||||
|
||||
nr_group_sequence_hopping(pucch_GroupHopping,pucch_pdu->hopping_id,n_hop,slot,&u,&v); // calculating u and v value
|
||||
alpha = nr_cyclic_shift_hopping(pucch_pdu->hopping_id,pucch_pdu->initial_cyclic_shift,mcs[i],l,pucch_pdu->start_symbol_index,slot);
|
||||
#ifdef DEBUG_NR_PUCCH_RX
|
||||
printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \t(for symbol l=%d)\n",u,v,alpha,l);
|
||||
#endif
|
||||
#ifdef DEBUG_NR_PUCCH_RX
|
||||
printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \t(for symbol l=%d/%d,mcs %d)\n",u,v,alpha,l,l+pucch_pdu->start_symbol_index,mcs[i]);
|
||||
#endif
|
||||
for (n=0; n<12; n++){
|
||||
x_n_re[i][(12*l)+n] = (int16_t)((int16_t)(((((int32_t)(round(32767*cos(alpha*n))) * table_5_2_2_2_2_Re[u][n])>>15)
|
||||
- (((int32_t)(round(32767*sin(alpha*n))) * table_5_2_2_2_2_Im[u][n])>>15)))>>15); // Re part of base sequence shifted by alpha
|
||||
- (((int32_t)(round(32767*sin(alpha*n))) * table_5_2_2_2_2_Im[u][n])>>15)))); // Re part of base sequence shifted by alpha
|
||||
x_n_im[i][(12*l)+n] =(int16_t)((int16_t)(((((int32_t)(round(32767*cos(alpha*n))) * table_5_2_2_2_2_Im[u][n])>>15)
|
||||
+ (((int32_t)(round(32767*sin(alpha*n))) * table_5_2_2_2_2_Re[u][n])>>15)))>>15); // Im part of base sequence shifted by alpha
|
||||
#ifdef DEBUG_NR_PUCCH_RX
|
||||
printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \tx_n(l=%d,n=%d)=(%d,%d)\n",
|
||||
u,v,alpha,l,n,x_n_re[(12*l)+n],x_n_im[(12*l)+n]);
|
||||
#endif
|
||||
+ (((int32_t)(round(32767*sin(alpha*n))) * table_5_2_2_2_2_Re[u][n])>>15)))); // Im part of base sequence shifted by alpha
|
||||
#ifdef DEBUG_NR_PUCCH_RX
|
||||
printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \tx_n(l=%d,n=%d)=(%d,%d) %d,%d\n",
|
||||
u,v,alpha,l,n,x_n_re[i][(12*l)+n],x_n_im[i][(12*l)+n],
|
||||
(int32_t)(round(32767*cos(alpha*n))),
|
||||
(int32_t)(round(32767*sin(alpha*n))));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
int16_t r_re[24],r_im[24];
|
||||
/*
|
||||
* Implementing TS 38.211 Subclause 6.3.2.3.2 Mapping to physical resources
|
||||
*/
|
||||
uint32_t re_offset=0;
|
||||
uint8_t l2;
|
||||
|
||||
#ifdef OLD_IMPL
|
||||
int16_t r_re[24],r_im[24];
|
||||
|
||||
for (l=0; l<pucch_pdu->nr_of_symbols; l++) {
|
||||
|
||||
l2 = l+pucch_pdu->start_symbol_index;
|
||||
@@ -122,7 +127,7 @@ void nr_decode_pucch0(int32_t **rxdataF,
|
||||
if (re_offset>= frame_parms->ofdm_symbol_size)
|
||||
re_offset-=frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
}
|
||||
}
|
||||
double corr[nr_sequences],corr_re[nr_sequences],corr_im[nr_sequences];
|
||||
memset(corr,0,nr_sequences*sizeof(double));
|
||||
memset(corr_re,0,nr_sequences*sizeof(double));
|
||||
@@ -144,7 +149,55 @@ void nr_decode_pucch0(int32_t **rxdataF,
|
||||
max_corr=corr[i];
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
int16_t *x_re = x_n_re[0],*x_im = x_n_im[0];
|
||||
int16_t xr[32] __attribute__((aligned(32)));
|
||||
int16_t xrt[32] __attribute__((aligned(32)));
|
||||
int32_t xrtmag=0;
|
||||
int maxpos=0;
|
||||
int n2=0;
|
||||
uint8_t index=0;
|
||||
memset((void*)xr,0,32*sizeof(int16_t));
|
||||
|
||||
for (l=0; l<pucch_pdu->nr_of_symbols; l++) {
|
||||
|
||||
l2 = l+pucch_pdu->start_symbol_index;
|
||||
re_offset = (12*pucch_pdu->prb_start) + frame_parms->first_carrier_offset;
|
||||
if (re_offset>= frame_parms->ofdm_symbol_size)
|
||||
re_offset-=frame_parms->ofdm_symbol_size;
|
||||
|
||||
AssertFatal(re_offset+12 < frame_parms->ofdm_symbol_size,"pucch straddles DC carrier, handle this!\n");
|
||||
|
||||
n2=0;
|
||||
int16_t *r=(int16_t*)&rxdataF[0][(l2*frame_parms->ofdm_symbol_size+re_offset)];
|
||||
if (l==0) for (n=0;n<12;n++,n2+=2) {
|
||||
xr[n2] =((int32_t)x_re[n]*r[n2]+(int32_t)x_im[n]*r[n2+1])>>15;
|
||||
xr[n2+1]=((int32_t)x_re[n]*r[n2+1]-(int32_t)x_im[n]*r[n2])>>15;
|
||||
printf("x (%d,%d), r (%d,%d), xr (%d,%d)\n",
|
||||
x_re[n],x_im[n],r[n2],r[n2+1],xr[n2],xr[n2+1]);
|
||||
}
|
||||
else for (n=0;n<12;n++,n2+=2) {
|
||||
xr[n2] +=((int32_t)x_re[n]*r[n2]+(int32_t)x_im[n]*r[n2+1])>>15;
|
||||
xr[n2+1]+=((int32_t)x_re[n]*r[n2+1]-(int32_t)x_im[n]*r[n2])>>15;
|
||||
}
|
||||
x_re+=12;
|
||||
x_im+=12;
|
||||
}
|
||||
idft16f(xr,xrt);
|
||||
n2=0;
|
||||
int32_t temp;
|
||||
for (n=0;n<16;n++,n2+=2) {
|
||||
#ifdef DEBUG_NR_PUCCH_RX
|
||||
printf("PUCCH IDFT[%d] = (%d,%d)\n",n,xrt[n2],xrt[n2+1]);
|
||||
#endif
|
||||
if ((temp=(int32_t)xrt[n2]*xrt[n2]+(int32_t)xrt[n2+1]*xrt[n2+1])<xrtmag) {
|
||||
xrtmag=temp;
|
||||
maxpos=n;
|
||||
}
|
||||
}
|
||||
exit(-1);
|
||||
#endif
|
||||
// first bit of bitmap for sr presence and second bit for acknack presence
|
||||
uci_pdu->pdu_bit_map = pucch_pdu->sr_flag | ((pucch_pdu->bit_len_harq>0)<<1);
|
||||
uci_pdu->pucch_format = 0; // format 0
|
||||
@@ -281,7 +334,6 @@ void nr_decode_pucch1( int32_t **rxdataF,
|
||||
re_offset = ((l+startingSymbolIndex)*frame_parms->ofdm_symbol_size) + (12*startingPRB) + frame_parms->first_carrier_offset;
|
||||
}
|
||||
|
||||
//txptr = &txdataF[0][re_offset];
|
||||
for (int n=0; n<12; n++) {
|
||||
if ((n==6) && (startingPRB == (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 1)) {
|
||||
// if number RBs in bandwidth is odd and current PRB contains DC, we need to recalculate the offset when n=6 (for second half PRB)
|
||||
@@ -294,7 +346,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
|
||||
#ifdef DEBUG_NR_PUCCH_RX
|
||||
printf("\t [nr_generate_pucch1] mapping PUCCH to RE \t amp=%d \tofdm_symbol_size=%d \tN_RB_DL=%d \tfirst_carrier_offset=%d \tz_pucch[%d]=txptr(%d)=(x_n(l=%d,n=%d)=(%d,%d))\n",
|
||||
amp,frame_parms->ofdm_symbol_size,frame_parms->N_RB_DL,frame_parms->first_carrier_offset,i+n,re_offset,
|
||||
l,n,((int16_t *)&txdataF[0][re_offset])[0],((int16_t *)&txdataF[0][re_offset])[1]);
|
||||
l,n,((int16_t *)&rxdataF[0][re_offset])[0],((int16_t *)&rxdataF[0][re_offset])[1]);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -305,7 +357,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
|
||||
#ifdef DEBUG_NR_PUCCH_RX
|
||||
printf("\t [nr_generate_pucch1] mapping DM-RS to RE \t amp=%d \tofdm_symbol_size=%d \tN_RB_DL=%d \tfirst_carrier_offset=%d \tz_dm-rs[%d]=txptr(%d)=(x_n(l=%d,n=%d)=(%d,%d))\n",
|
||||
amp,frame_parms->ofdm_symbol_size,frame_parms->N_RB_DL,frame_parms->first_carrier_offset,i+n,re_offset,
|
||||
l,n,((int16_t *)&txdataF[0][re_offset])[0],((int16_t *)&txdataF[0][re_offset])[1]);
|
||||
l,n,((int16_t *)&rxdataF[0][re_offset])[0],((int16_t *)&rxdataF[0][re_offset])[1]);
|
||||
#endif
|
||||
// printf("l=%d\ti=%d\tre_offset=%d\treceived dmrs re=%d\tim=%d\n",l,i,re_offset,z_dmrs_re_rx[i+n],z_dmrs_im_rx[i+n]);
|
||||
}
|
||||
@@ -416,7 +468,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
|
||||
mprime, m, n, (mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n,
|
||||
table_6_3_2_4_1_2_Wi_Re[N_SF_mprime_PUCCH_1][w_index][m],y_n_re[n],table_6_3_2_4_1_2_Wi_Im[N_SF_mprime_PUCCH_1][w_index][m],y_n_im[n],
|
||||
table_6_3_2_4_1_2_Wi_Re[N_SF_mprime_PUCCH_1][w_index][m],y_n_im[n],table_6_3_2_4_1_2_Wi_Im[N_SF_mprime_PUCCH_1][w_index][m],y_n_re[n],
|
||||
z_re[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n],z_im[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n]);
|
||||
z_re_rx[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n],z_im_rx[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n]);
|
||||
#endif
|
||||
// multiplying with conjugate of low papr sequence
|
||||
z_re_temp = (int16_t)(((((int32_t)(r_u_v_alpha_delta_re[n])*z_re_rx[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n])>>15)
|
||||
@@ -450,7 +502,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
|
||||
mprime, m, n, (mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n,
|
||||
table_6_3_2_4_1_2_Wi_Re[N_SF_mprime_PUCCH_1][w_index][m],r_u_v_alpha_delta_dmrs_re[n],table_6_3_2_4_1_2_Wi_Im[N_SF_mprime_PUCCH_1][w_index][m],r_u_v_alpha_delta_dmrs_im[n],
|
||||
table_6_3_2_4_1_2_Wi_Re[N_SF_mprime_PUCCH_1][w_index][m],r_u_v_alpha_delta_dmrs_im[n],table_6_3_2_4_1_2_Wi_Im[N_SF_mprime_PUCCH_1][w_index][m],r_u_v_alpha_delta_dmrs_re[n],
|
||||
z_dmrs_re[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n],z_dmrs_im[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n]);
|
||||
z_dmrs_re_rx[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n],z_dmrs_im_rx[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n]);
|
||||
#endif
|
||||
//finding channel coeffcients by dividing received dmrs with actual dmrs and storing them in z_dmrs_re_rx and z_dmrs_im_rx arrays
|
||||
z_dmrs_re_temp = (int16_t)(((((int32_t)(r_u_v_alpha_delta_dmrs_re[n])*z_dmrs_re_rx[(mprime*12*N_SF_mprime0_PUCCH_DMRS_1)+(m*12)+n])>>15)
|
||||
@@ -501,7 +553,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
|
||||
mprime, m, n, (mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n,
|
||||
table_6_3_2_4_1_2_Wi_Re[N_SF_mprime_PUCCH_1][w_index][m],y_n_re[n],table_6_3_2_4_1_2_Wi_Im[N_SF_mprime_PUCCH_1][w_index][m],y_n_im[n],
|
||||
table_6_3_2_4_1_2_Wi_Re[N_SF_mprime_PUCCH_1][w_index][m],y_n_im[n],table_6_3_2_4_1_2_Wi_Im[N_SF_mprime_PUCCH_1][w_index][m],y_n_re[n],
|
||||
z_re[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n],z_im[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n]);
|
||||
z_re_rx[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n],z_im_rx[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n]);
|
||||
#endif
|
||||
z_re_temp = (int16_t)(((((int32_t)(r_u_v_alpha_delta_re[n])*z_re_rx[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n])>>15)
|
||||
+ (((int32_t)(r_u_v_alpha_delta_im[n])*z_im_rx[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n])>>15))>>1);
|
||||
@@ -529,7 +581,7 @@ void nr_decode_pucch1( int32_t **rxdataF,
|
||||
mprime, m, n, (mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n,
|
||||
table_6_3_2_4_1_2_Wi_Re[N_SF_mprime_PUCCH_1][w_index][m],r_u_v_alpha_delta_dmrs_re[n],table_6_3_2_4_1_2_Wi_Im[N_SF_mprime_PUCCH_1][w_index][m],r_u_v_alpha_delta_dmrs_im[n],
|
||||
table_6_3_2_4_1_2_Wi_Re[N_SF_mprime_PUCCH_1][w_index][m],r_u_v_alpha_delta_dmrs_im[n],table_6_3_2_4_1_2_Wi_Im[N_SF_mprime_PUCCH_1][w_index][m],r_u_v_alpha_delta_dmrs_re[n],
|
||||
z_dmrs_re[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n],z_dmrs_im[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n]);
|
||||
z_dmrs_re_rx[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n],z_dmrs_im_rx[(mprime*12*N_SF_mprime0_PUCCH_1)+(m*12)+n]);
|
||||
#endif
|
||||
//finding channel coeffcients by dividing received dmrs with actual dmrs and storing them in z_dmrs_re_rx and z_dmrs_im_rx arrays
|
||||
z_dmrs_re_temp = (int16_t)(((((int32_t)(r_u_v_alpha_delta_dmrs_re[n])*z_dmrs_re_rx[(mprime*12*N_SF_mprime0_PUCCH_DMRS_1)+(m*12)+n])>>15)
|
||||
|
||||
@@ -2437,6 +2437,10 @@ static inline void idft16(int16_t *x,int16_t *y)
|
||||
#endif
|
||||
}
|
||||
|
||||
void idft16f(int16_t *x,int16_t *y) {
|
||||
idft16(x,y);
|
||||
}
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
#ifdef __AVX2__
|
||||
// Does two 16-point IDFTS (x[0 .. 15] is 128 LSBs of input vector, x[16..31] is in 128 MSBs)
|
||||
|
||||
@@ -171,6 +171,8 @@ This function performs optimized fixed-point radix-2 FFT/IFFT.
|
||||
);
|
||||
*/
|
||||
|
||||
void idft16f(int16_t *x,int16_t *y);
|
||||
|
||||
void idft1536(int16_t *sigF,int16_t *sig,int scale);
|
||||
|
||||
void idft6144(int16_t *sigF,int16_t *sig,int scale);
|
||||
|
||||
Reference in New Issue
Block a user