free5GRAN  V1.0
sequence_generator.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2020 Telecom Paris
3 
4  Licensed under the Apache License, Version 2.0 (the "License");
5  you may not use this file except in compliance with the License.
6  You may obtain a copy of the License at
7 
8  http://www.apache.org/licenses/LICENSE-2.0
9 
10  Unless required by applicable law or agreed to in writing, software
11  distributed under the License is distributed on an "AS IS" BASIS,
12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  See the License for the specific language governing permissions and
14  limitations under the License.
15  */
16 
17 #include "sequence_generator.h"
18 #include "../../variables/common_variables/common_variables.h"
19 #include <cmath>
20 #include <iostream>
21 using namespace std;
22 
23 void free5GRAN::utils::sequence_generator::generate_pss_sequence(int n_id_2, int *output_sequence) {
33  for (int i = 0; i < free5GRAN::SIZE_PSS_SSS_SIGNAL; i++){
34  if (i < 7){
35  x_seq[i] = free5GRAN::PSS_BASE_SEQUENCE[i];
36  } else {
37  x_seq[i] = (x_seq[i - 3] + x_seq[i - 7]) % 2;
38  }
39  }
40  for (int n = 0; n < free5GRAN::SIZE_PSS_SSS_SIGNAL; n++){
41  int m = (n + 43 * n_id_2) % free5GRAN::SIZE_PSS_SSS_SIGNAL;
42  output_sequence[n] = 1 - 2 * x_seq[m];
43  }
44 
45 }
46 
47 void free5GRAN::utils::sequence_generator::generate_sss_sequence(int n_id_1, int n_id_2, int *output_sequence) {
57  int m0, m1;
60  for (int i = 0; i < free5GRAN::SIZE_PSS_SSS_SIGNAL; i++){
61  if (i < 7){
62  x0_seq[i] = free5GRAN::SSS_BASE_X0_SEQUENCE[i];
63  x1_seq[i] = free5GRAN::SSS_BASE_X1_SEQUENCE[i];;
64  } else {
65  x0_seq[i] = (x0_seq[i - 3] + x0_seq[i - 7]) % 2;
66  x1_seq[i] = (x1_seq[i - 6] + x1_seq[i - 7]) % 2;
67  }
68  }
69  m0 = 15 * (n_id_1 / 112) + 5 * n_id_2;
70  m1 = n_id_1 % 112;
71  for (int n = 0; n < free5GRAN::SIZE_PSS_SSS_SIGNAL; n++){
72  output_sequence[n] = (1 - 2 * x0_seq[(n + m0) % free5GRAN::SIZE_PSS_SSS_SIGNAL]) * (1 - 2 * x1_seq[(n + m1) % free5GRAN::SIZE_PSS_SSS_SIGNAL]);
73  }
74 }
75 
76 void free5GRAN::utils::sequence_generator::generate_pbch_dmrs_sequence(int pci, int i_bar_ssb, complex<float> *output_sequence) {
86  int c_init = pow(2,11) * (i_bar_ssb + 1) * (pci / 4 + 1) + pow(2,6) * (i_bar_ssb + 1) + (pci % 4);
89  for (int m = 0 ; m < free5GRAN::SIZE_SSB_DMRS_SYMBOLS; m++){
90  output_sequence[m] = (float) (1 / sqrt(2)) * complex<float>(1 - 2 * seq[2 * m], 1 - 2 * seq[2 * m + 1]);
91  }
92 }
93 
94 
95 void free5GRAN::utils::sequence_generator::generate_c_sequence(long c_init, int length, int *output_sequence, int demod_type) {
106  int x1[1600 + length], x2[1600 + length], base_x2[32];
107 
108  for (int j = 0; j < 31; j ++){
109  base_x2[j] = ((int) c_init / (int) pow(2,j)) % 2;
110  }
111  for (int n = 0; n < 1600 + length; n ++){
112  if (n < 31){
114  x2[n] = base_x2[n];
115  }else {
116  x1[n] = (x1[n - 28] + x1[n - 31]) % 2;
117  x2[n] = (x2[n - 28] + x2[n - 29] + x2[n - 30] + x2[n - 31]) % 2;
118  }
119  }
120  for (int j = 0; j < length; j ++){
121  output_sequence[j] = (x1[j + 1600] + x2[j + 1600]) % 2;
122  if (demod_type == 1){
123  output_sequence[j] = (output_sequence[j]==0) ? 1 : -1;
124  }
125  }
126 
127 }
128 
129 void free5GRAN::utils::sequence_generator::generate_pdcch_dmrs_sequence(int nid, int slot_number, int symbol_number, complex<float> *output_sequence, int size){
141  long c_init = (long)(pow(2, 17) * (14 * slot_number + symbol_number + 1) * (2 * nid + 1) + 2 * nid) % (long)pow(2,31);
142  int seq[2 * size];
143  generate_c_sequence(c_init, 2 * size, seq, 0);
144  for (int m = 0; m < size; m++){
145  output_sequence[m] = (float) (1 / sqrt(2)) * complex<float>(1 - 2 * seq[2 * m], 1 - 2 * seq[2 * m + 1]);
146  }
147 }
148 
149 
150 void free5GRAN::utils::sequence_generator::generate_pdcch_dmrs_sequence(int nid, int slot_number, int symbol_number, vector<complex<float>> &output_sequence, int size){
162  long c_init = (long)(pow(2, 17) * (14 * slot_number + symbol_number + 1) * (2 * nid + 1) + 2 * nid) % (long)pow(2,31);
163  int seq[2 * size];
164  generate_c_sequence(c_init, 2 * size, seq, 0);
165  for (int m = 0; m < size; m++){
166  output_sequence[m] = (float) (1 / sqrt(2)) * complex<float>(1 - 2 * seq[2 * m], 1 - 2 * seq[2 * m + 1]);
167  }
168 }
169 
170 void free5GRAN::utils::sequence_generator::generate_pdsch_dmrs_sequence(int n_symb_slot, int slot_number, int symbol_number, int n_scid, int n_id_scid, complex<float> *output_sequence, int size){
184  long c_init = (long)(pow(2, 17) * (n_symb_slot * slot_number + symbol_number + 1) * (2 * n_id_scid + 1) + 2 * n_id_scid + n_scid) % (long)pow(2,31);
185  int seq[2 * size];
186  generate_c_sequence(c_init, 2 * size, seq, 0);
187  for (int m = 0; m < size; m++){
188  output_sequence[m] = (float) (1 / sqrt(2)) * complex<float>(1 - 2 * seq[2 * m], 1 - 2 * seq[2 * m + 1]);
189  }
190 }
191 
int SSS_BASE_X1_SEQUENCE[7]
int SIZE_SSB_DMRS_SYMBOLS
int DMRS_BASE_X1_SEQUENCE[32]
void generate_sss_sequence(int n_id_1, int n_id_2, int *output_sequence)
void generate_pbch_dmrs_sequence(int pci, int i_bar_ssb, complex< float > *output_sequence)
void generate_pdsch_dmrs_sequence(int n_symb_slot, int slot_number, int symbol_number, int n_scid, int n_id_scid, complex< float > *output_sequence, int size)
int SSS_BASE_X0_SEQUENCE[7]
void generate_pdcch_dmrs_sequence(int nid, int slot_number, int symbol_number, complex< float > *output_sequence, int size)
void generate_pss_sequence(int n_id_2, int *output_sequence)
int PSS_BASE_SEQUENCE[7]
void generate_c_sequence(long c_init, int length, int *output_sequence, int demod_type)