18 #include "../../variables/common_variables/common_variables.h"    47     complex<float> noise_coef;
    48     vector<int> found_indexes, symbols_with_pilot,symbols_with_no_pilot;
    49     vector<complex<float>> coef_same_sc;
    50     int upper_index, lower_index, step, step_width;
    56     for (
int i = 0; i < pilot_size; i ++){
    57         coefficients[pilot_indexes[0][i]][pilot_indexes[1][i]] = pilots[i] * conj(reference_pilot[i]) / (float) pow(abs(reference_pilot[i]),2);
    61     for (
int symbol = 0; symbol <num_symbols; symbol ++ ){
    62         found_indexes.clear();
    66         for (
int k = 0; k < pilot_size; k ++){
    67             if (pilot_indexes[0][k] == symbol){
    68                 found_indexes.push_back(pilot_indexes[1][k]);
    73         if (found_indexes.size() != 0 ){
    74             symbols_with_pilot.push_back(symbol);
    78             for (
int sc = 0; sc < num_sc; sc ++){
    80                 if(find(found_indexes.begin(), found_indexes.end(), sc) == found_indexes.end()) {
    82                     if (sc < found_indexes[0]){
    83                         lower_index = found_indexes[0];
    84                         upper_index = found_indexes[1];
    85                     }
else if(sc > found_indexes[found_indexes.size() - 1]){
    86                         lower_index = found_indexes[found_indexes.size() - 2];
    87                         upper_index = found_indexes[found_indexes.size() - 1];
    89                         for (
int k = 0; k < found_indexes.size() - 1; k ++){
    90                             if (found_indexes[k] < sc && found_indexes[k + 1] > sc){
    91                                 lower_index = found_indexes[k];
    92                                 upper_index = found_indexes[k + 1];
    97                     step = sc - lower_index;
    98                     step_width = upper_index - lower_index;
   100                     re_int = step * (real(coefficients[symbol][upper_index]) - real(coefficients[symbol][lower_index])) / step_width + real(coefficients[symbol][lower_index]);
   101                     im_int = step * (imag(coefficients[symbol][upper_index]) - imag(coefficients[symbol][lower_index])) / step_width + imag(coefficients[symbol][lower_index]);
   102                     coefficients[symbol][sc] = complex<float>(re_int,im_int);
   104                     mean_power += pow(abs(coefficients[symbol][sc]),2);
   108             symbols_with_no_pilot.push_back(symbol);
   116     for (
int s = 0; s < symbols_with_no_pilot.size(); s ++){
   117         if (symbols_with_no_pilot[s] < symbols_with_pilot[0]){
   118             lower_index = symbols_with_pilot[0];
   119             upper_index = symbols_with_pilot[1];
   120         }
else if(symbols_with_no_pilot[s] > symbols_with_pilot[symbols_with_pilot.size() - 1]){
   121             lower_index = symbols_with_pilot[symbols_with_pilot.size() - 2];
   122             upper_index = symbols_with_pilot[symbols_with_pilot.size() - 1];
   124             for (
int k = 0; k < symbols_with_pilot.size() - 1; k ++){
   125                 if (symbols_with_pilot[k] < symbols_with_no_pilot[s] && symbols_with_pilot[k + 1] > symbols_with_no_pilot[s]){
   126                     lower_index = symbols_with_pilot[k];
   127                     upper_index = symbols_with_pilot[k + 1];
   132         step = symbols_with_no_pilot[s] - lower_index;
   133         step_width = upper_index - lower_index;
   136         for (
int sc = 0; sc < num_sc; sc ++){
   137             re_int = step * (real(coefficients[upper_index][sc]) - real(coefficients[lower_index][sc])) / step_width + real(coefficients[lower_index][sc]);
   138             im_int = step * (imag(coefficients[upper_index][sc]) - imag(coefficients[lower_index][sc])) / step_width + imag(coefficients[lower_index][sc]);
   139             coefficients[symbols_with_no_pilot[s]][sc] = complex<float>(re_int,im_int);
   141             mean_power += pow(abs(coefficients[symbols_with_no_pilot[s]][sc]),2);
   146     mean_power /= num_sc * num_symbols;
   147     mean_power = 10 * log10(mean_power);
   151     for (
int symbol = 0; symbol <num_symbols; symbol ++ ){
   153         for (
int sc = 0; sc < num_sc; sc ++){
   154             noise_coef += coefficients[symbol][sc];
   156         noise_coef /= num_sc;
   157         for (
int sc = 0; sc < num_sc; sc ++){
   158             mean_noise += pow(abs(coefficients[symbol][sc] - noise_coef),2) / num_sc * num_symbols ;
   161     mean_noise = 10 * log10(mean_noise);
   163     snr = mean_power - mean_noise;
   174     for (
int i = 0; i < signal_length; i ++){
   178         if (modulation_scheme == 0){
   179             if (real(signal[i]) > 0){
   188         else if(modulation_scheme == 1){
   189             if (real(signal[i]) > 0){
   194             if (imag(signal[i]) > 0){
   219     if(modulation_scheme == 1){
   220         complex<float> s_00, s_01, s_10, s_11;
   221         double const_power = 1 / sqrt(2);
   222         s_00 = complex<double>(const_power,const_power);
   223         s_01 = complex<double>(const_power,-const_power);
   224         s_10 = complex<double>(-const_power,const_power);
   225         s_11 = complex<double>(-const_power,-const_power);
   226         for (
int i = 0; i < signal_length; i ++){
   227             double l_01,l_02, l_11, l_12;
   229             l_01 = abs(signal[i] - s_00);
   230             l_02 = abs(signal[i] - s_01);
   231             l_11 = abs(signal[i] - s_10);
   232             l_12 = abs(signal[i] - s_11);
   234             soft_bits[2 * i] = pow(min(l_11,l_12),2) - pow(min(l_01,l_02),2);
   236             l_01 = abs(signal[i] - s_00);
   237             l_02 = abs(signal[i] - s_10);
   238             l_11 = abs(signal[i] - s_01);
   239             l_12 = abs(signal[i] - s_11);
   241             soft_bits[2 * i + 1] = pow(min(l_11,l_12),2) - pow(min(l_01,l_02),2);
   261     float phase_offset = 0;
   266     for (
int symbol = 0; symbol < num_symbols; symbol ++){
   268         for (
int i = 0; i < cp_length; i ++){
   269             out += conj(input_signal[i + symbol * symbol_duration]) * input_signal[i + symbol * symbol_duration + fft_size];
   271         phase_offset += arg(out);
   274     phase_offset/= num_symbols;
   278     output = scs * phase_offset/(2 * M_PI);
   291     complex<float> j(0, 1);
   292     for (
int i = 0; i < input_length; i ++){
   293         (*input_signal)[i] = (*input_signal)[i] * exp(complex<float>(-2,0) * j * complex<float>(M_PI,0) * freq_offset * complex<float>((
float) i,0) / complex<float>(sample_rate,0));
   311     int channel_counter[num_channels];
   312     for (
int i = 0; i < num_channels; i ++){
   313         channel_counter[i] = 0;
   318     for (
int symbol = 0; symbol < num_symbols; symbol ++){
   319         for (
int sc = 0; sc < num_sc; sc ++){
   323             for (
int channel = 0; channel < num_channels; channel++){
   327                 if (ref[channel][symbol][sc] == 1){
   328                     output_channels[channel][channel_counter[channel]] = input_signal[symbol][sc];
   329                     output_indexes[channel][0][channel_counter[channel]] = symbol;
   330                     output_indexes[channel][1][channel_counter[channel]] = sc;
   331                     channel_counter[channel] ++;
   350         for (
int i = 0; i < 3; i ++){
   352             if ((gscn - (M - 3)/2) % 3 == 0){
   356         N = (gscn - (M - 3)/2) / 3;
   357         freq = N * 1.2e6 + M * 50e3;
   358     }
else if (gscn < 22256){
   360         freq = 3e9 + N * 1.44e6;
   363         freq = 24250.08e6 + N * 17.28e6;
   382     index1 = pdcch_config / 16;
   383     index2 = pdcch_config % 16;
   384     int *table1 = 
new int[4];
   386     if (pbch_scs==15e3 && common_scs == 15e3){
   388     }
else if (pbch_scs==15e3 && common_scs == 30e3){
   390     }
else if (pbch_scs==30e3 && common_scs == 15e3){
   392     }
else if (pbch_scs==30e3 && common_scs == 30e3){
   405     if (table2[3] == -1){
   430     lrb = floor(RIV/n_size_bwp) + 1;
   431     rb_start = RIV - ((lrb - 1) * n_size_bwp);
   432     if (lrb > n_size_bwp - rb_start){
   433         lrb = n_size_bwp - lrb + 2;
   434         rb_start = n_size_bwp - 1 - rb_start;
   449     if (duration < 8 || additionnal_position==0){
   451         (*output) = 
new int[size]{l0};
   452     }
else if (duration < 10){
   454         (*output) = 
new int[size]{l0,7};
   455     }
else if (additionnal_position==1){
   458             (*output) = 
new int[size]{l0,9};
   460             (*output) = 
new int[size]{l0,11};
   463     else if (additionnal_position==2){
   466             (*output) = 
new int[size]{l0,6,9};
   468             (*output) = 
new int[size]{l0,7,11};
   470     }
else if (additionnal_position==3){
   473             (*output) = 
new int[size]{l0,6,9};
   476             (*output) = 
new int[size]{l0,5,8,11};
   496     int nom_cp = ((is_extended_cp) ? 512 :  144);
   497     int base_cp = nom_cp * nfft / 2048;
   498     cum_sum_cp_lengths[0] = 0;
   499     for (
int i = 0; i < num_symb_per_subframes; i ++){
   500         if (i % (num_symb_per_subframes / 2) == 0){
   501             cp_lengths[i] = (scs * nfft - num_symb_per_subframes * nfft - (num_symb_per_subframes - 2) * base_cp) / 2;
   503             cp_lengths[i] = base_cp;
   505         if (i < num_symb_per_subframes - 1){
   506             cum_sum_cp_lengths[i + 1] = cum_sum_cp_lengths[i] + cp_lengths[i] + nfft;
   524     for (
int i = 0; i < num_symb_per_subframes; i ++){
   525         float t_start = cum_sum_symb[i]/ sampling_rate;
   526         float t_cp = cp_lengths[i] / sampling_rate;
   527         phase_decomp_factor[i] = exp(complex<float>(0,- 2 * f0 * M_PI) * (- t_start - t_cp));
   540     return 12 * (num_symb_pdsch - num_dmrs_symb);
   543 void free5GRAN::phy::signal_processing::fft(vector<complex<float>> time_domain_signal, vector<vector<complex<float>>> &output_signal, 
int fft_size, 
int *cp_lengths, 
int *cum_sum_symb, 
int num_symbols, 
int num_sc_output, 
int first_symb_index, 
int offset){
   558     fftw_complex *fft_in = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * fft_size);
   559     fftw_complex *fft_out = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * fft_size);
   561     fftw_plan fft_plan = fftw_plan_dft_1d(fft_size, fft_in, fft_out, FFTW_FORWARD, FFTW_MEASURE);
   563     for (
int symbol = 0; symbol < num_symbols; symbol ++){
   566         for (
int i = 0; i < fft_size; i++){
   567             fft_in[i][0] = real(time_domain_signal[i + offset + cum_sum_symb[symb_index] + cp_lengths[symb_index]]);
   568             fft_in[i][1] = imag(time_domain_signal[i + offset + cum_sum_symb[symb_index] + cp_lengths[symb_index]]);
   571         fftw_execute(fft_plan);
   573         for (
int i = 0; i < num_sc_output / 2; i++){
   574             output_signal[symbol][num_sc_output / 2 + i ] = complex<float>(fft_out[i][0],fft_out[i][1]);
   575             output_signal[symbol][num_sc_output / 2 - i - 1] = complex<float>(fft_out[fft_size - i - 1][0],fft_out[fft_size - i - 1][1]);
   581     if (num_samples_before_pss < index_first_pss) {
   582         if (num_samples_before_pss + 2 * frame_size < index_first_pss){
   583             frame_indexes[0][0] = index_first_pss - num_samples_before_pss - 2 * frame_size;
   584             frame_indexes[0][1] = index_first_pss - num_samples_before_pss - frame_size - 1;
   585             frame_indexes[1][0] = index_first_pss - num_samples_before_pss - frame_size;
   586             frame_indexes[1][1] = index_first_pss - num_samples_before_pss - 1;
   587             frame_numbers[0] = sfn - 2;
   588             frame_numbers[1] = sfn - 1;
   590         else if (num_samples_before_pss + frame_size < index_first_pss){
   591             frame_indexes[0][0] = index_first_pss - num_samples_before_pss - frame_size;
   592             frame_indexes[0][1] = index_first_pss - num_samples_before_pss - 1;
   593             frame_indexes[1][0] = index_first_pss - num_samples_before_pss;
   594             frame_indexes[1][1] = index_first_pss - num_samples_before_pss + frame_size - 1;
   595             frame_numbers[0] = sfn - 1;
   596             frame_numbers[1] = sfn;
   599             frame_indexes[0][0] = index_first_pss - num_samples_before_pss;
   600             frame_indexes[0][1] = index_first_pss - num_samples_before_pss + frame_size - 1;
   601             frame_indexes[1][0] = index_first_pss - num_samples_before_pss + frame_size;
   602             frame_indexes[1][1] = index_first_pss - num_samples_before_pss + 2 * frame_size - 1;
   603             frame_numbers[0] = sfn;
   604             frame_numbers[1] = sfn + 1;
   607         frame_indexes[0][0] = index_first_pss - num_samples_before_pss + frame_size;
   608         frame_indexes[0][1] = index_first_pss - num_samples_before_pss + 2 * frame_size - 1;
   609         frame_indexes[1][0] = index_first_pss - num_samples_before_pss + 2 * frame_size;
   610         frame_indexes[1][1] = index_first_pss - num_samples_before_pss + 3 * frame_size - 1;
   611         frame_numbers[0] = sfn + 1;
   612         frame_numbers[1] = sfn + 2;
 int TS_38_213_TABLE_13_4[16][4]
 
void compute_phase_decomp(int *cp_lengths, int *cum_sum_symb, float sampling_rate, float f0, int num_symb_per_subframes, complex< float > *phase_decomp_factor)
 
int NUMBER_SYMBOLS_PER_SLOT_NORMAL_CP
 
void get_candidates_frames_indexes(vector< vector< int >> &frame_indexes, int *frame_numbers, int sfn, int index_first_pss, int num_samples_before_pss, int frame_size)
 
void fft(vector< complex< float >> time_domain_signal, vector< vector< complex< float >>> &output_signal, int fft_size, int *cp_lengths, int *cum_sum_symb, int num_symbols, int num_sc_output, int first_symb_index, int offset)
 
void soft_demodulation(vector< complex< float >> signal, double *soft_bits, int signal_length, int modulation_scheme)
 
void get_pdsch_dmrs_symbols(const string &type, int duration, int additionnal_position, int l0, int **output, int &size)
 
int TS_38_213_TABLE_13_1[16][4]
 
free5GRAN::pdcch_t0ss_monitoring_occasions compute_pdcch_t0_ss_monitoring_occasions(int pdcch_config, int pbch_scs, int common_scs, int i)
 
void transpose_signal(vector< complex< float >> *input_signal, float freq_offset, int sample_rate, int input_length)
 
void compute_rb_start_lrb_dci(int RIV, int n_size_bwp, int &lrb, int &rb_start)
 
void channelEstimation(complex< float > *pilots, complex< float > *reference_pilot, vector< vector< int >> &pilot_indexes, vector< vector< complex< float >>> &coefficients, float &snr, int num_sc, int num_symbols, int pilot_size)
 
int compute_nre(int num_symb_pdsch, int num_dmrs_symb)
 
void channel_demapper(vector< vector< complex< float >>> &input_signal, vector< vector< vector< int >>> &ref, complex< float > **output_channels, vector< vector< vector< int >>> &output_indexes, int num_channels, int num_symbols, int num_sc)
 
int TS_38_213_TABLE_13_3[16][4]
 
float TS_38_213_TABLE_13_11[16][4]
 
double compute_freq_from_gscn(int gscn)
 
int TS_38_213_TABLE_13_2[16][4]
 
void compute_cp_lengths(int scs, int nfft, int is_extended_cp, int num_symb_per_subframes, int *cp_lengths, int *cum_sum_cp_lengths)
 
void compute_fine_frequency_offset(vector< complex< float >> input_signal, int symbol_duration, int fft_size, int cp_length, int scs, float &output, int num_symbols)
 
void hard_demodulation(vector< complex< float >> signal, int *bits, int signal_length, int modulation_scheme)