Harmonize phy_simulators to use compute_tx_energy_level() and compute_noise_variance()
This commit is contained in:
@@ -196,9 +196,16 @@ double compute_tx_energy_level(c16_t **txdata, int nb_antennas, int offset, int
|
||||
}
|
||||
|
||||
// Computes noise variance from the input transmit energy and SNR
|
||||
double compute_noise_variance(double txlev_sum, uint16_t ofdm_symbol_size, int N_RB, double SNR, int n_trials)
|
||||
double compute_noise_variance(double txlev_sum,
|
||||
uint16_t ofdm_symbol_size,
|
||||
int N_RB,
|
||||
uint8_t precod_nbr_layers,
|
||||
double SNR,
|
||||
int n_trials)
|
||||
{
|
||||
double sigma_dB = 10 * log10(txlev_sum * ((double)ofdm_symbol_size / (12 * N_RB))) - SNR;
|
||||
// Justification of division by precod_nbr_layers:
|
||||
// When the channel is the identity matrix, the results in terms of SNR should be almost equal for 2x2 and 4x4.
|
||||
double sigma_dB = 10 * log10(txlev_sum / precod_nbr_layers * ((double)ofdm_symbol_size / (12 * N_RB))) - SNR;
|
||||
double sigma = pow(10, sigma_dB / 10);
|
||||
|
||||
if (n_trials == 1)
|
||||
|
||||
@@ -929,7 +929,12 @@ double signal_energy_fp2(struct complexd *s, uint32_t length);
|
||||
|
||||
double compute_tx_energy_level(c16_t **txdata, int nb_antennas, int offset, int length, int n_trials);
|
||||
|
||||
double compute_noise_variance(double txlev_sum, uint16_t ofdm_symbol_size, int N_RB, double SNR, int n_trials);
|
||||
double compute_noise_variance(double txlev_sum,
|
||||
uint16_t ofdm_symbol_size,
|
||||
int N_RB,
|
||||
uint8_t precod_nbr_layers,
|
||||
double SNR,
|
||||
int n_trials);
|
||||
|
||||
int32_t iSqrt(int32_t value);
|
||||
uint8_t log2_approx(uint32_t);
|
||||
|
||||
@@ -324,7 +324,7 @@ int main(int argc, char **argv)
|
||||
setbuf(stdout, NULL);
|
||||
int c;
|
||||
int i,aa;//,l;
|
||||
double sigma2, sigma2_dB=10, SNR, snr0=-2.0, snr1=2.0;
|
||||
double SNR, snr0 = -2.0, snr1 = 2.0;
|
||||
uint8_t snr1set=0;
|
||||
double effRate;
|
||||
//float psnr;
|
||||
@@ -1172,15 +1172,12 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
int txlev[n_tx];
|
||||
int txlev_sum = 0;
|
||||
// Compute transmitter energy level
|
||||
int l_ofdm = 6;
|
||||
for (aa=0; aa<n_tx; aa++) {
|
||||
txlev[aa] = signal_energy((int32_t *)&txdata[aa][slot_offset +l_ofdm*frame_parms->ofdm_symbol_size + (l_ofdm-1)*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
|
||||
frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
|
||||
txlev_sum += txlev[aa];
|
||||
if (n_trials==1) printf("txlev[%d] = %d (%f dB) txlev_sum %d\n",aa,txlev[aa],10*log10((double)txlev[aa]),txlev_sum);
|
||||
}
|
||||
int symbol_offset = slot_offset + l_ofdm * frame_parms->ofdm_symbol_size + (l_ofdm - 1) * frame_parms->nb_prefix_samples
|
||||
+ frame_parms->nb_prefix_samples0;
|
||||
int symbol_length = frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples;
|
||||
double txlev_sum = compute_tx_energy_level(txdata, n_tx, symbol_offset, symbol_length, n_trials);
|
||||
|
||||
for (i = 0; i < slot_length; i++) {
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
@@ -1189,11 +1186,11 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size);
|
||||
//Compute AWGN variance
|
||||
sigma2_dB = 10 * log10((double)txlev_sum * ((double)UE->frame_parms.ofdm_symbol_size/(12*pdsch_pdu_rel15->rbSize))) - SNR;
|
||||
sigma2 = pow(10, sigma2_dB/10);
|
||||
if (n_trials==1) printf("sigma2 %f (%f dB), txlev_sum %f (factor %f)\n",sigma2,sigma2_dB,10*log10((double)txlev_sum),(double)(double)UE->frame_parms.ofdm_symbol_size/(12*pdsch_pdu_rel15->rbSize));
|
||||
double ts = 1.0/(frame_parms->subcarrier_spacing * frame_parms->ofdm_symbol_size);
|
||||
|
||||
// Estimate noise power from the transmitter level and SNR
|
||||
double sigma2 =
|
||||
compute_noise_variance(txlev_sum, UE->frame_parms.ofdm_symbol_size, pdsch_pdu_rel15->rbSize, 1, SNR, n_trials);
|
||||
|
||||
for (aa = 0; aa < n_rx; aa++) {
|
||||
bzero(r_re[aa], slot_length * sizeof(double));
|
||||
|
||||
@@ -131,7 +131,7 @@ int main(int argc, char **argv){
|
||||
sigaction(SIGINT, &sigint_action, &oldaction);
|
||||
|
||||
get_softmodem_params()->sl_mode = 0;
|
||||
double sigma2, sigma2_dB = 0, SNR, snr0 = -2.0, snr1 = 0.0, ue_speed0 = 0.0, ue_speed1 = 0.0;
|
||||
double SNR, snr0 = -2.0, snr1 = 0.0, ue_speed0 = 0.0, ue_speed1 = 0.0;
|
||||
double **s_re, **s_im, **r_re, **r_im, iqim = 0.0, delay_avg = 0, ue_speed = 0, fs=-1, bw;
|
||||
int i, l, aa, aarx, trial, n_frames = 1, rx_prach_start; //, ntrials=1;
|
||||
c16_t **txdata;
|
||||
@@ -728,14 +728,7 @@ int main(int argc, char **argv){
|
||||
|
||||
for (trial = 0; trial < n_frames && !stop; trial++) {
|
||||
if (input_fd == NULL) {
|
||||
sigma2_dB = 10*log10((double)tx_lev) - SNR - 10*log10(N_RB_UL*12/N_ZC);
|
||||
|
||||
if (n_frames==1)
|
||||
printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %f\n",sigma2_dB,SNR,10*log10((double)tx_lev));
|
||||
|
||||
//AWGN
|
||||
sigma2 = pow(10,sigma2_dB/10);
|
||||
// printf("Sigma2 %f (sigma2_dB %f)\n",sigma2,sigma2_dB);
|
||||
double sigma2 = compute_noise_variance(tx_lev, N_ZC, N_RB_UL, 1, SNR, n_frames);
|
||||
|
||||
if (awgn_flag == 0) {
|
||||
multipath_tv_channel(UE2gNB, s_re, s_im, r_re, r_im, frame_parms->samples_per_frame, 0);
|
||||
|
||||
@@ -96,7 +96,7 @@ int main(int argc, char **argv)
|
||||
sigaction(SIGINT, &sigint_action, &oldaction);
|
||||
|
||||
int i;//,l;
|
||||
double sigma2, sigma2_dB=10,SNR,snr0=-2.0,snr1=2.0;
|
||||
double SNR, snr0 = -2.0, snr1 = 2.0;
|
||||
double cfo=0;
|
||||
uint8_t snr1set=0;
|
||||
double **s_re,**s_im,**r_re,**r_im;
|
||||
@@ -566,15 +566,16 @@ int main(int argc, char **argv)
|
||||
// SNR Computation
|
||||
// standard says: SNR = S / N, where S is the total signal energy, N is the noise energy in the transmission bandwidth (i.e. N_RB_DL resource blocks)
|
||||
// txlev = S.
|
||||
int txlev = signal_energy((int32_t *)&txdataF[0][startingSymbolIndex*frame_parms->ofdm_symbol_size], frame_parms->ofdm_symbol_size);
|
||||
|
||||
// Compute transmitter energy level
|
||||
int symbol_offset = startingSymbolIndex * frame_parms->ofdm_symbol_size;
|
||||
int symbol_length = frame_parms->ofdm_symbol_size;
|
||||
double txlev = compute_tx_energy_level(txdataF, 1, symbol_offset, symbol_length, n_trials);
|
||||
|
||||
// sigma2 is variance per dimension, so N/(N_RB*12)
|
||||
// so, sigma2 = N/(N_RB_DL*12) => (S/SNR)/(N_RB*12)
|
||||
int N_RB = (format == 0 || format == 1) ? 1 : nrofPRB;
|
||||
sigma2_dB = 10*log10(txlev*(N_RB_DL/N_RB))-SNR;
|
||||
sigma2 = pow(10.0,sigma2_dB/10.0);
|
||||
|
||||
if (n_trials==1) printf("txlev %d (%f dB), offset %d, sigma2 %f ( %f dB)\n",txlev,10*log10(txlev),startingSymbolIndex*frame_parms->ofdm_symbol_size,sigma2,sigma2_dB);
|
||||
double sigma2 = compute_noise_variance(txlev, N_RB_DL * 12, N_RB, 1, SNR, n_trials);
|
||||
|
||||
for (int symb=0; symb<gNB->frame_parms.symbols_per_slot;symb++) {
|
||||
if (symb<startingSymbolIndex || symb >= startingSymbolIndex+nrofSymbols) {
|
||||
@@ -648,7 +649,16 @@ int main(int argc, char **argv)
|
||||
gNB_I0_measurements(gNB, nr_slot_tx, 0, gNB->frame_parms.symbols_per_slot, rb_mask_ul);
|
||||
start_meas(&gNB->phy_proc_rx);
|
||||
|
||||
if (n_trials==1) printf("noise rxlev %d (%d dB), rxlev pucch %d dB sigma2 %f dB, SNR %f, TX %f, I0 (pucch) %d, I0 (avg) %d\n",rxlev,dB_fixed(rxlev),dB_fixed(rxlev_pucch),sigma2_dB,SNR,10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/12),gNB->measurements.n0_subband_power_tot_dB[startingPRB],gNB->measurements.n0_subband_power_avg_dB);
|
||||
if (n_trials == 1)
|
||||
printf("noise rxlev %d (%d dB), rxlev pucch %d dB sigma2 %f dB, SNR %f, TX %f, I0 (pucch) %d, I0 (avg) %d\n",
|
||||
rxlev,
|
||||
dB_fixed(rxlev),
|
||||
dB_fixed(rxlev_pucch),
|
||||
10 * log10(sigma2),
|
||||
SNR,
|
||||
10 * log10((double)txlev * UE->frame_parms.ofdm_symbol_size / 12),
|
||||
gNB->measurements.n0_subband_power_tot_dB[startingPRB],
|
||||
gNB->measurements.n0_subband_power_avg_dB);
|
||||
if(format==0){
|
||||
nfapi_nr_uci_pucch_pdu_format_0_1_t uci_pdu;
|
||||
nfapi_nr_pucch_pdu_t pucch_pdu;
|
||||
|
||||
@@ -549,7 +549,7 @@ int main(int argc, char *argv[])
|
||||
int tao_ns_count = 0;
|
||||
for (trial = 0; trial < n_trials && !stop; trial++) {
|
||||
// Estimate noise power from the transmitter level and SNR
|
||||
double sigma = compute_noise_variance(txlev_sum, ofdm_symbol_size, srs_pdu.bwp_size, SNR, n_trials);
|
||||
double sigma = compute_noise_variance(txlev_sum, ofdm_symbol_size, srs_pdu.bwp_size, 1, SNR, n_trials);
|
||||
|
||||
//----------- Apply propagation channel ----------------------------
|
||||
multipath_channel(UE2gNB, s_re, s_im, r_re, r_im, slot_length, 0, (n_trials == 1) ? 1 : 0);
|
||||
|
||||
@@ -281,7 +281,6 @@ int main(int argc, char *argv[])
|
||||
char *filename_csv = NULL;
|
||||
int i;
|
||||
double SNR, snr0 = -2.0, snr1 = 2.0;
|
||||
double sigma, sigma_dB;
|
||||
double snr_step = .2;
|
||||
uint8_t snr1set = 0;
|
||||
int slot = 8, frame = 1;
|
||||
@@ -308,7 +307,7 @@ int main(int argc, char *argv[])
|
||||
int Imcs = 9;
|
||||
uint8_t precod_nbr_layers = 1;
|
||||
int tx_offset;
|
||||
int32_t txlev_sum = 0, atxlev[4];
|
||||
double txlev_sum = 0;
|
||||
int start_rb = 0;
|
||||
int UE_id = 0;
|
||||
int print_perf = 0;
|
||||
@@ -1401,36 +1400,22 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
///////////
|
||||
////////////////////////////////////////////////////
|
||||
// Compute transmitter energy level
|
||||
tx_offset = get_samples_slot_timestamp(&gNB->frame_parms, slot);
|
||||
txlev_sum = 0;
|
||||
for (int aa = 0; aa < UE->frame_parms.nb_antennas_tx; aa++) {
|
||||
atxlev[aa] =
|
||||
signal_energy((int32_t *)&UE->common_vars
|
||||
.txData[aa][tx_offset + 5 * gNB->frame_parms.ofdm_symbol_size
|
||||
+ 4 * gNB->frame_parms.nb_prefix_samples + gNB->frame_parms.nb_prefix_samples0],
|
||||
gNB->frame_parms.ofdm_symbol_size + gNB->frame_parms.nb_prefix_samples);
|
||||
|
||||
txlev_sum += atxlev[aa];
|
||||
|
||||
if (n_trials == 1)
|
||||
printf("txlev[%d] = %d (%f dB) txlev_sum %d\n", aa, atxlev[aa], 10 * log10((double)atxlev[aa]), txlev_sum);
|
||||
}
|
||||
int symbol_offset = tx_offset + 5 * gNB->frame_parms.ofdm_symbol_size + 4 * gNB->frame_parms.nb_prefix_samples
|
||||
+ gNB->frame_parms.nb_prefix_samples0;
|
||||
int symbol_length = gNB->frame_parms.ofdm_symbol_size + gNB->frame_parms.nb_prefix_samples;
|
||||
txlev_sum = compute_tx_energy_level(UE->common_vars.txData,
|
||||
UE->frame_parms.nb_antennas_tx,
|
||||
symbol_offset,
|
||||
symbol_length,
|
||||
n_trials);
|
||||
} else
|
||||
n_trials = 1;
|
||||
|
||||
if (input_fd == NULL) {
|
||||
// Justification of division by precod_nbr_layers:
|
||||
// When the channel is the identity matrix, the results in terms of SNR should be almost equal for 2x2 and 4x4.
|
||||
sigma_dB =
|
||||
10 * log10((double)txlev_sum / precod_nbr_layers * ((double)gNB->frame_parms.ofdm_symbol_size / (12 * nb_rb))) - SNR;
|
||||
sigma = pow(10, sigma_dB / 10);
|
||||
|
||||
if (n_trials == 1)
|
||||
printf("sigma %f (%f dB), txlev_sum %f (factor %f)\n",
|
||||
sigma,
|
||||
sigma_dB,
|
||||
10 * log10((double)txlev_sum),
|
||||
(double)(double)gNB->frame_parms.ofdm_symbol_size / (12 * nb_rb));
|
||||
double sigma =
|
||||
compute_noise_variance(txlev_sum, gNB->frame_parms.ofdm_symbol_size, nb_rb, precod_nbr_layers, SNR, n_trials);
|
||||
|
||||
for (i = 0; i < slot_length; i++) {
|
||||
for (int aa = 0; aa < UE->frame_parms.nb_antennas_tx; aa++) {
|
||||
|
||||
Reference in New Issue
Block a user