Commit e73c6c3e authored by Khalid Ahmed's avatar Khalid Ahmed Committed by Thomas Schlichter

Fixing signal_energy and noise varience calculation

parent 962c7694
...@@ -84,7 +84,7 @@ int32_t signal_energy(int32_t *input,uint32_t length) ...@@ -84,7 +84,7 @@ int32_t signal_energy(int32_t *input,uint32_t length)
mm1 = in[i]; mm1 = in[i];
mm2 = mm1; mm2 = mm1;
mm1 = _m_pmaddwd(mm1,mm1); mm1 = _m_pmaddwd(mm1,mm1);
mm1 = _m_psradi(mm1,shift);// shift any 32 bits blocs of the word by the value shift mm1 = _m_psradi(mm1,9);//shift);// shift any 32 bits blocs of the word by the value shift
mm0 = _m_paddd(mm0,mm1);// add the two 64 bits words 4 bytes by 4 bytes mm0 = _m_paddd(mm0,mm1);// add the two 64 bits words 4 bytes by 4 bytes
// mm2 = _m_psrawi(mm2,shift_DC); // mm2 = _m_psrawi(mm2,shift_DC);
mm3 = _m_paddw(mm3,mm2);// add the two 64 bits words 2 bytes by 2 bytes mm3 = _m_paddw(mm3,mm2);// add the two 64 bits words 2 bytes by 2 bytes
...@@ -95,7 +95,8 @@ int32_t signal_energy(int32_t *input,uint32_t length) ...@@ -95,7 +95,8 @@ int32_t signal_energy(int32_t *input,uint32_t length)
mm0 = _m_paddd(mm0,mm1); mm0 = _m_paddd(mm0,mm1);
temp = _m_to_int(mm0); temp = _m_to_int(mm0);
temp/=length; temp/=length;
temp<<=shift; // this is the average of x^2 //temp<<=shift; // this is the average of x^2
// now remove the DC component // now remove the DC component
...@@ -103,6 +104,7 @@ int32_t signal_energy(int32_t *input,uint32_t length) ...@@ -103,6 +104,7 @@ int32_t signal_energy(int32_t *input,uint32_t length)
mm2 = _m_psrlqi(mm3,32); mm2 = _m_psrlqi(mm3,32);
mm2 = _m_paddw(mm2,mm3); mm2 = _m_paddw(mm2,mm3);
mm2 = _m_pmaddwd(mm2,mm2); mm2 = _m_pmaddwd(mm2,mm2);
mm2 = _m_psradi(mm2,9); // fixed point representation of elements
temp2 = _m_to_int(mm2); temp2 = _m_to_int(mm2);
temp2/=(length*length); temp2/=(length*length);
// temp2<<=(2*shift_DC); // temp2<<=(2*shift_DC);
......
...@@ -133,7 +133,7 @@ int main(int argc, char **argv) { ...@@ -133,7 +133,7 @@ int main(int argc, char **argv) {
int slot = 0; int slot = 0;
int **txdata; int **txdata;
int32_t **txdataF; int32_t **txdataF;
double **r_re, **r_im; int16_t **r_re, **r_im;
FILE *output_fd = NULL; FILE *output_fd = NULL;
//uint8_t write_output_file = 0; //uint8_t write_output_file = 0;
int trial, n_trials = 1, n_errors = 0, n_false_positive = 0; int trial, n_trials = 1, n_errors = 0, n_false_positive = 0;
...@@ -164,7 +164,7 @@ int main(int argc, char **argv) { ...@@ -164,7 +164,7 @@ int main(int argc, char **argv) {
int ap; int ap;
int tx_offset; int tx_offset;
int sample_offsetF; int sample_offsetF;
int txlev; double txlev;
cpuf = get_cpu_freq_GHz(); cpuf = get_cpu_freq_GHz();
...@@ -393,17 +393,14 @@ int main(int argc, char **argv) { ...@@ -393,17 +393,14 @@ int main(int argc, char **argv) {
frame_length_complex_samples = frame_parms->samples_per_subframe; frame_length_complex_samples = frame_parms->samples_per_subframe;
//frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP; //frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP;
r_re = malloc(2 * sizeof(double *)); r_re = malloc(2 * sizeof(int16_t *));
r_im = malloc(2 * sizeof(double *)); r_im = malloc(2 * sizeof(int16_t *));
txdata = malloc(2 * sizeof(int * ));
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
r_re[i] = malloc(frame_length_complex_samples * sizeof(double)); r_re[i] = malloc(frame_length_complex_samples * sizeof(int16_t));
bzero(r_re[i], frame_length_complex_samples * sizeof(double)); bzero(r_re[i], frame_length_complex_samples * sizeof(int16_t));
r_im[i] = malloc(frame_length_complex_samples * sizeof(double)); r_im[i] = malloc(frame_length_complex_samples * sizeof(int16_t));
bzero(r_im[i], frame_length_complex_samples * sizeof(double)); bzero(r_im[i], frame_length_complex_samples * sizeof(int16_t));
txdata[i] = malloc(frame_length_complex_samples * sizeof(int));
bzero(r_re[i], frame_length_complex_samples * sizeof(int)); // [hna] r_re should be txdata
} }
//configure UE //configure UE
...@@ -618,7 +615,7 @@ int main(int argc, char **argv) { ...@@ -618,7 +615,7 @@ int main(int argc, char **argv) {
txdataF = UE->common_vars.txdataF; txdataF = UE->common_vars.txdataF;
amp = AMP; amp = AMP;
start_rb = 10; start_rb = 0;
start_sc = frame_parms->first_carrier_offset + start_rb*NR_NB_SC_PER_RB; start_sc = frame_parms->first_carrier_offset + start_rb*NR_NB_SC_PER_RB;
if (start_sc >= frame_parms->ofdm_symbol_size) if (start_sc >= frame_parms->ofdm_symbol_size)
...@@ -666,7 +663,6 @@ int main(int argc, char **argv) { ...@@ -666,7 +663,6 @@ int main(int argc, char **argv) {
((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (amp * tx_layers[ap][m<<1]) >> 15; ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (amp * tx_layers[ap][m<<1]) >> 15;
((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15; ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15;
#ifdef DEBUG_PUSCH_MAPPING #ifdef DEBUG_PUSCH_MAPPING
printf("m %d\t l %d \t k %d \t txdataF: %d %d\n", printf("m %d\t l %d \t k %d \t txdataF: %d %d\n",
m, l, k, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1], m, l, k, ((int16_t*)txdataF[ap])[(sample_offsetF)<<1],
...@@ -675,6 +671,7 @@ int main(int argc, char **argv) { ...@@ -675,6 +671,7 @@ int main(int argc, char **argv) {
m++; m++;
} }
if (++k >= frame_parms->ofdm_symbol_size) if (++k >= frame_parms->ofdm_symbol_size)
k -= frame_parms->ofdm_symbol_size; k -= frame_parms->ofdm_symbol_size;
} }
...@@ -689,6 +686,7 @@ int main(int argc, char **argv) { ...@@ -689,6 +686,7 @@ int main(int argc, char **argv) {
/////////// ///////////
tx_offset = slot*frame_parms->samples_per_slot; tx_offset = slot*frame_parms->samples_per_slot;
txdata = UE->common_vars.txdata;
for (ap=0; ap<harq_process_ul_ue->Nl; ap++) { for (ap=0; ap<harq_process_ul_ue->Nl; ap++) {
if (frame_parms->Ncp == 1) { // extended cyclic prefix if (frame_parms->Ncp == 1) { // extended cyclic prefix
...@@ -711,14 +709,16 @@ int main(int argc, char **argv) { ...@@ -711,14 +709,16 @@ int main(int argc, char **argv) {
for (i=0; i<frame_length_complex_samples; i++) { for (i=0; i<frame_length_complex_samples; i++) {
for (ap=0; ap<frame_parms->nb_antennas_tx; ap++) { for (ap=0; ap<frame_parms->nb_antennas_tx; ap++) {
r_re[ap][i] = ((double)(((short *)txdata[ap]))[(i<<1)]); r_re[ap][i] = ((int16_t *)txdata[ap])[(i<<1)];
r_im[ap][i] = ((double)(((short *)txdata[ap]))[(i<<1)+1]); r_im[ap][i] = ((int16_t *)txdata[ap])[(i<<1)+1];
} }
} }
txlev = signal_energy(&txdata[0][5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], txlev = (double) signal_energy(&txdata[0][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples); frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
txlev = txlev/512.0; // output of signal_energy is fixed point representation
for (SNR = snr0; SNR < snr1; SNR += snr_step) { for (SNR = snr0; SNR < snr1; SNR += snr_step) {
...@@ -742,8 +742,8 @@ int main(int argc, char **argv) { ...@@ -742,8 +742,8 @@ int main(int argc, char **argv) {
for (i=0; i<frame_length_complex_samples; i++) { for (i=0; i<frame_length_complex_samples; i++) {
for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) { for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) {
((short*) gNB->common_vars.rxdata[ap])[2*i] = (short) ((r_re[ap][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short*) gNB->common_vars.rxdata[ap])[2*i] = (r_re[ap][i] + (int16_t)(sqrt(sigma2/2)*gaussdouble(0.0,1.0)*512.0)); // convert to fixed point
((short*) gNB->common_vars.rxdata[ap])[2*i+1] = (short) ((r_im[ap][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short*) gNB->common_vars.rxdata[ap])[2*i+1] = (r_im[ap][i] + (int16_t)(sqrt(sigma2/2)*gaussdouble(0.0,1.0)*512.0));
} }
} }
...@@ -762,13 +762,13 @@ int main(int argc, char **argv) { ...@@ -762,13 +762,13 @@ int main(int argc, char **argv) {
bit_index = i & 0x1f; bit_index = i & 0x1f;
if ((bit_index == 0) && (i != 0)) { if ((bit_index == 0) && (i != 0)) {
scrambling_index++; scrambling_index++;
} }
if(((scrambled_output[0][scrambling_index] >> bit_index) & 1) == 0) if(((scrambled_output[0][scrambling_index] >> bit_index) & 1) == 0)
modulated_input[i] = 1.0; ///sqrt(2); //QPSK modulated_input[i] = 1.0; ///sqrt(2); //QPSK
else else
modulated_input[i] = -1.0; ///sqrt(2); modulated_input[i] = -1.0; ///sqrt(2);
//////////////////////////////////////////// ////////////////////////////////////////////
...@@ -812,11 +812,11 @@ int main(int argc, char **argv) { ...@@ -812,11 +812,11 @@ int main(int argc, char **argv) {
uint32_t llr_offset = 0; uint32_t llr_offset = 0;
for(symbol = sch_sym_start; symbol < 14; symbol++) { for(symbol = sch_sym_start; symbol < 14; symbol++) {
if (symbol == 2) // [hna] here it is assumed that symbol 2 carries 6 DMRS REs (dmrs-type 1) if (symbol == 2) // [hna] here it is assumed that symbol 2 carries 6 DMRS REs (dmrs-type 1)
nb_re = nb_rb*6; nb_re = nb_rb*6;
else else
nb_re = nb_rb*12; nb_re = nb_rb*12;
nr_ulsch_compute_llr(&ulsch_ue[0]->d_mod[d_mod_offset], nr_ulsch_compute_llr(&ulsch_ue[0]->d_mod[d_mod_offset],
gNB->pusch_vars[UE_id]->ul_ch_mag, gNB->pusch_vars[UE_id]->ul_ch_mag,
...@@ -864,9 +864,9 @@ int main(int argc, char **argv) { ...@@ -864,9 +864,9 @@ int main(int argc, char **argv) {
if(((ulsch_ue[0]->g[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) || if(((ulsch_ue[0]->g[i] == 0) && (gNB->pusch_vars[UE_id]->llr[i] <= 0)) ||
((ulsch_ue[0]->g[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0))) ((ulsch_ue[0]->g[i] == 1) && (gNB->pusch_vars[UE_id]->llr[i] >= 0)))
{ {
if(errors_scrambling == 0) if(errors_scrambling == 0)
printf("First bit in error = %d\n",i); printf("First bit in error = %d\n",i);
errors_scrambling++; errors_scrambling++;
} }
estimated_output_bit[i] = (ulsch_gNB->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7); estimated_output_bit[i] = (ulsch_gNB->harq_processes[harq_pid]->b[i/8] & (1 << (i & 7))) >> (i & 7);
...@@ -933,12 +933,10 @@ int main(int argc, char **argv) { ...@@ -933,12 +933,10 @@ int main(int argc, char **argv) {
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
free(r_re[i]); free(r_re[i]);
free(r_im[i]); free(r_im[i]);
free(txdata[i]);
} }
free(r_re); free(r_re);
free(r_im); free(r_im);
free(txdata);
if (output_fd) if (output_fd)
fclose(output_fd); fclose(output_fd);
...@@ -948,4 +946,3 @@ int main(int argc, char **argv) { ...@@ -948,4 +946,3 @@ int main(int argc, char **argv) {
return (n_errors); return (n_errors);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment