GNU Radio's LORA_SDR Package
utilities.h
Go to the documentation of this file.
1 #ifndef UTILITIES_H
2 #define UTILITIES_H
3 
4 #include <cstdint>
5 #include <string.h>
6 #include <iomanip>
7 #include <numeric>
8 #include <gnuradio/expj.h>
9 #include <sys/resource.h>
10 #include <sys/syscall.h>
11 #include <volk/volk.h>
12 
13 
14 namespace gr {
15  namespace lora_sdr {
16 
17  // #define THREAD_MEASURE
18 
19  #define RESET "\033[0m"
20  #define RED "\033[31m" /* Red */
21 
22  typedef double LLR; ///< Log-Likelihood Ratio type
23  //typedef long double LLR; // 16 Bytes
24 
25  enum Symbol_type {
33  };
34  /**
35  * \brief return the modulus a%b between 0 and (b-1)
36  */
37  inline long mod(long a, long b)
38  { return (a%b+b)%b; }
39 
40  inline double double_mod(double a, long b)
41  { return fmod(fmod(a,b)+b,b);}
42 
43  /**
44  * \brief Convert an integer into a MSB first vector of bool
45  *
46  * \param integer
47  * The integer to convert
48  * \param n_bits
49  * The output number of bits
50  */
51  inline std::vector<bool> int2bool(uint integer,uint8_t n_bits){
52  std::vector<bool> vec(n_bits,0);
53  int j=n_bits;
54  for(int i=0 ;i<n_bits;i++) {
55  vec[--j]=((integer>>i)& 1);
56  }
57  return vec;
58 
59  };
60  /**
61  * \brief Convert a MSB first vector of bool to a integer
62  *
63  * \param b
64  * The boolean vector to convert
65  */
66  inline uint32_t bool2int(std::vector<bool> b){
67  uint32_t integer = std::accumulate(b.begin(), b.end(), 0, [](int x, int y) { return (x << 1) + y; });
68  return integer;
69  };
70  /**
71  * \brief Return an modulated upchirp using s_f=bw
72  *
73  * \param chirp
74  * The pointer to the modulated upchirp
75  * \param id
76  * The number used to modulate the chirp
77  * \param sf
78  * The spreading factor to use
79  * \param os_factor
80  * The oversampling factor used to generate the upchirp
81  */
82  inline void build_upchirp(gr_complex* chirp, uint32_t id, uint8_t sf, uint8_t os_factor = 1){
83  double N = (1 << sf) ;
84  int n_fold = N* os_factor - id*os_factor;
85  for(uint n = 0; n < N* os_factor; n++){
86  if(n<n_fold)
87  chirp[n] = gr_complex(1.0,0.0)*gr_expj(2.0*M_PI *(n*n/(2*N)/pow(os_factor,2)+(id/N-0.5)*n/os_factor));
88  else
89  chirp[n] = gr_complex(1.0,0.0)*gr_expj(2.0*M_PI *(n*n/(2*N)/pow(os_factor,2)+(id/N-1.5)*n/os_factor));
90 
91  }
92  }
93 
94  /**
95  * \brief Return the reference chirps using s_f=bw
96  *
97  * \param upchirp
98  * The pointer to the reference upchirp
99  * \param downchirp
100  * The pointer to the reference downchirp
101  * \param sf
102  * The spreading factor to use
103  */
104  inline void build_ref_chirps(gr_complex* upchirp, gr_complex* downchirp, uint8_t sf, uint8_t os_factor = 1){
105  double N = (1 << sf);
106  build_upchirp(upchirp,0,sf,os_factor);
107  volk_32fc_conjugate_32fc(&downchirp[0], &upchirp[0], N*os_factor);
108 
109  // for(uint n = 0; n < N ;n++){
110  // //the scaling factor of 0.9 is here to avoid to saturate the USRP_SINK
111  // upchirp[n] = gr_complex(0.9f, 0.0f)*gr_expj(2.0 * M_PI * (n*n/(2*N)-0.5*n));
112  // downchirp[n] = gr_complex(0.9f, 0.0f)*gr_expj(-2.0 * M_PI * (n*n/(2*N)-0.5*n));
113  // }
114  }
115 
116  inline std::string random_string(int Nbytes){
117  const char* charmap = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
118  const size_t charmapLength = strlen(charmap);
119  auto generator = [&](){ return charmap[rand()%charmapLength]; };
120  std::string result;
121  result.reserve(Nbytes);
122  std::generate_n(std::back_inserter(result), Nbytes, generator);
123  return result;
124  }
125  }
126 }
127 #endif /* UTILITIES_H */
Symbol_type
Definition: utilities.h:25
Definition: utilities.h:32
Definition: utilities.h:28
Definition: utilities.h:26
std::string random_string(int Nbytes)
Definition: utilities.h:116
double LLR
Log-Likelihood Ratio type.
Definition: utilities.h:22
uint32_t bool2int(std::vector< bool > b)
Convert a MSB first vector of bool to a integer.
Definition: utilities.h:66
Definition: utilities.h:30
double double_mod(double a, long b)
Definition: utilities.h:40
Definition: add_crc.h:28
long mod(long a, long b)
return the modulus ab between 0 and (b-1)
Definition: utilities.h:37
Definition: utilities.h:29
void build_ref_chirps(gr_complex *upchirp, gr_complex *downchirp, uint8_t sf, uint8_t os_factor=1)
Return the reference chirps using s_f=bw.
Definition: utilities.h:104
Definition: utilities.h:31
std::vector< bool > int2bool(uint integer, uint8_t n_bits)
Convert an integer into a MSB first vector of bool.
Definition: utilities.h:51
Definition: utilities.h:27
void build_upchirp(gr_complex *chirp, uint32_t id, uint8_t sf, uint8_t os_factor=1)
Return an modulated upchirp using s_f=bw.
Definition: utilities.h:82