free5GRAN  V1.0
physical_channel.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 <iostream>
18 #include <fstream>
19 #include "physical_channel.h"
20 #include "../libphy/libphy.h"
21 #include "../../utils/sequence_generator/sequence_generator.h"
22 #include "../transport_channel/transport_channel.h"
23 #include "../../variables/common_variables/common_variables.h"
24 #include "../../utils/common_utils/common_utils.h"
25 
26 using namespace std;
27 
28 void free5GRAN::phy::physical_channel::decode_pdcch(vector<complex<float>> pdcch_symbols,int *dci_bits, int agg_level, int* reg_index, int* reg_index_sorted, int pci) {
47  int pdcch_bits[agg_level * 6 * 9 * 2];
48  /*
49  * Demodulate PBCH Signal
50  */
51  free5GRAN::phy::signal_processing::hard_demodulation(pdcch_symbols,pdcch_bits,agg_level * 6 * 9,1);
52 
53  int c_seq[agg_level * 6 * 9 * 2];
54  free5GRAN::utils::sequence_generator::generate_c_sequence((long) pci % (long)pow(2,31), agg_level * 6 * 9 * 2, c_seq,0);
55 
56  /*
57  * De-scramble pbch_bits to scrambled_bits
58  */
59  free5GRAN::utils::common_utils::scramble(pdcch_bits, c_seq, dci_bits, agg_level * 6 * 9 * 2, 0);
60 
61 }
62 
63 void free5GRAN::phy::physical_channel::decode_pdsch(vector<complex<float>> pdsch_samples, double *unscrambled_soft_bits, int pci) {
78  int ds_sch_bits_length;
79  long c_init;
80  ds_sch_bits_length = 2 * pdsch_samples.size();
81  int c_seq[ds_sch_bits_length];
82  double soft_bits[ds_sch_bits_length];
83  /*
84  * Soft demodulation
85  */
86  free5GRAN::phy::signal_processing::soft_demodulation(pdsch_samples, soft_bits, pdsch_samples.size(), 1);
87 
88  /*
89  * C init computation. 65535 is the RNTI for SIB1
90  */
91  c_init = 65535 * pow(2,15) + pci;
92 
93  /*
94  * Scrambling
95  */
96  free5GRAN::utils::sequence_generator::generate_c_sequence(c_init, ds_sch_bits_length, c_seq, 1);
97  free5GRAN::utils::common_utils::scramble(soft_bits, c_seq, unscrambled_soft_bits, ds_sch_bits_length, 0);
98 
99 }
100 
101 void free5GRAN::phy::physical_channel::decode_pbch(vector<complex<float>> pbch_symbols, int i_ssb, int pci, int *bch_bits) {
117  int pbch_bits[free5GRAN::SIZE_SSB_PBCH_SYMBOLS * 2];
118  /*
119  * Demodulate PBCH Signal
120  */
122 
123  // Generate de-scrambling sequence
124  int c_seq[free5GRAN::SIZE_SSB_PBCH_SYMBOLS * 2 * (1 + i_ssb)];
126 
127  /*
128  * De-scramble pbch_bits to scrambled_bits
129  */
131 }
132 
133 void free5GRAN::phy::physical_channel::compute_pbch_indexes(vector<vector<vector<int>>> &ref, int pci){
140  //Looping over 3 OFDM symbols containing DMRS and PBCH
141  for (int symbol = 1; symbol < free5GRAN::NUM_SYMBOLS_SSB; symbol ++){
142  // Creating Resource element de-mapper reference grid
143  for (int i = 0; i < free5GRAN::NUM_SC_SSB; i++){
144  ref[2][symbol - 1][i] = 0;
145  if (symbol == 1 || symbol == 3){
146  if (pci % 4 != i % 4){
147  ref[0][symbol - 1][i] = 1;
148  ref[1][symbol - 1][i] = 0;
149  }else{
150  ref[0][symbol - 1][i] = 0;
151  ref[1][symbol - 1][i] = 1;
152  }
153  }else if (symbol == 2){
154  if (pci % 4 != i % 4 && (i < free5GRAN::INTERVAL_SSB_NO_PBCH_DMRS[0] || i > free5GRAN::INTERVAL_SSB_NO_PBCH_DMRS[1])){
155  ref[0][symbol - 1][i] = 1;
156  ref[1][symbol - 1][i] = 0;
158  ref[0][symbol - 1][i] = 0;
159  ref[1][symbol - 1][i] = 1;
160  }else{
161  ref[0][symbol - 1][i] = 0;
162  ref[1][symbol - 1][i] = 0;
163  }
164  if (i >= 56 && i <=182){
165  ref[2][symbol - 1][i] = 1;
166  }
167  }
168  }
169  }
170 }
171 
172 void free5GRAN::phy::physical_channel::compute_pdcch_indexes(vector<vector<vector<int>>> &ref, free5GRAN::pdcch_t0ss_monitoring_occasions pdcch_ss_mon_occ, int agg_level, int *reg_bundles, int height_reg_rb){
182  for (int symb = 0; symb < pdcch_ss_mon_occ.n_symb_coreset; symb ++){
183  for (int k = 0 ; k < agg_level ; k ++) {
184  for (int reg = 0; reg < free5GRAN::NUMBER_REG_PER_CCE; reg++) {
185  if (reg % pdcch_ss_mon_occ.n_symb_coreset == symb){
186  for (int s = 0; s < 12; s++) {
187  if (s % 4 == 1){
188  ref[1][symb][reg_bundles[k] * 12 * height_reg_rb + (reg/pdcch_ss_mon_occ.n_symb_coreset) * 12 + s] = 1;
189  ref[0][symb][reg_bundles[k] * 12 * height_reg_rb + (reg/pdcch_ss_mon_occ.n_symb_coreset) * 12 + s] = 0;
190  }else {
191  ref[1][symb][reg_bundles[k] * 12 * height_reg_rb + (reg/pdcch_ss_mon_occ.n_symb_coreset) * 12 + s] = 0;
192  ref[0][symb][reg_bundles[k] * 12 * height_reg_rb + (reg/pdcch_ss_mon_occ.n_symb_coreset) * 12 + s] = 1;
193  }
194  }
195  }
196  }
197  }
198  }
199 }
200 
201 void free5GRAN::phy::physical_channel::compute_pdsch_indexes(vector<vector<vector<int>>> &ref, bool dmrs_symbol_array[], int L, int lrb){
210  // Creating Resource element de-mapper reference grid
211  for (int symb = 0; symb < L; symb ++){
212  for (int i = 0; i < 12 * lrb; i++){
213  if (dmrs_symbol_array[symb]){
214  if (i % 2 == 0){
215  ref[0][symb][i] = 0;
216  ref[1][symb][i] = 1;
217  }else {
218  ref[0][symb][i] = 0;
219  ref[1][symb][i] = 0;
220  }
221  }
222  else{
223  ref[0][symb][i] = 1;
224  ref[1][symb][i] = 0;
225  }
226  }
227  }
228 }
void scramble(int *input_bits, int *c_seq, int *output_bits, int length, int offset)
void soft_demodulation(vector< complex< float >> signal, double *soft_bits, int signal_length, int modulation_scheme)
Definition: libphy.cpp:203
int INTERVAL_SSB_NO_PBCH_DMRS[2]
void decode_pbch(vector< complex< float >> pbch_symbols, int i_ssb, int pci, int *bch_bits)
void decode_pdsch(vector< complex< float >> pdsch_samples, double *unscrambled_soft_bits, int pci)
void compute_pdcch_indexes(vector< vector< vector< int >>> &ref, free5GRAN::pdcch_t0ss_monitoring_occasions pdcch_ss_mon_occ, int agg_level, int *reg_bundles, int height_reg_rb)
int SIZE_SSB_PBCH_SYMBOLS
void decode_pdcch(vector< complex< float >> pdcch_symbols, int *dci_bits, int agg_level, int *reg_index, int *reg_index_sorted, int pci)
void compute_pdsch_indexes(vector< vector< vector< int >>> &ref, bool dmrs_symbol_array[], int L, int lrb)
void compute_pbch_indexes(vector< vector< vector< int >>> &ref, int pci)
void hard_demodulation(vector< complex< float >> signal, int *bits, int signal_length, int modulation_scheme)
Definition: libphy.cpp:166
void generate_c_sequence(long c_init, int length, int *output_sequence, int demod_type)