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)