Harmonize phy_simulators to use compute_tx_energy_level() and compute_noise_variance()

This commit is contained in:
Rakesh Mundlamuri
2026-01-09 20:49:46 +05:30
parent f84ed0bbcf
commit a752f43ad6
7 changed files with 58 additions and 61 deletions
+9 -2
View File
@@ -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)
+6 -1
View File
@@ -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);
+11 -14
View File
@@ -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));
+2 -9
View File
@@ -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);
+17 -7
View File
@@ -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;
+1 -1
View File
@@ -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);
+12 -27
View File
@@ -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++) {