Agora  1.2.0
Agora project
modulation.h
Go to the documentation of this file.
1 #ifndef MODULATION_H_
2 #define MODULATION_H_
3 
4 #include <emmintrin.h>
5 #include <immintrin.h>
6 
7 #include <cmath>
8 #include <iostream>
9 
10 #include "common_typedef_sdk.h"
11 #include "gettime.h"
12 #include "memory_manage.h"
13 #include "message.h"
14 #include "symbols.h"
15 
16 #define BPSK_LEVEL M_SQRT1_2
17 #define QPSK_LEVEL M_SQRT1_2
18 
19 #define SCALE_BYTE_CONV_QPSK 20
20 #define SCALE_BYTE_CONV_QAM16 100
21 #define SCALE_BYTE_CONV_QAM64 100
22 #define SCALE_BYTE_CONV_QAM256 100
23 #define QAM16_THRESHOLD (2 / sqrt(10))
24 #define QAM64_THRESHOLD_1 (2 / sqrt(42))
25 #define QAM64_THRESHOLD_2 (4 / sqrt(42))
26 #define QAM64_THRESHOLD_3 (6 / sqrt(42))
27 #define QAM256_THRESHOLD_1 (2 / sqrt(170))
28 #define QAM256_THRESHOLD_2 (4 / sqrt(170))
29 #define QAM256_THRESHOLD_3 (6 / sqrt(170))
30 #define QAM256_THRESHOLD_4 (8 / sqrt(170))
31 #define QAM256_THRESHOLD_5 (10 / sqrt(170))
32 #define QAM256_THRESHOLD_6 (12 / sqrt(170))
33 #define QAM256_THRESHOLD_7 (14 / sqrt(170))
34 
35 static const std::map<std::string, size_t> kModulStringMap{
36  {"BPSK", 1}, {"QPSK", 2}, {"16QAM", 4},
37  {"64QAM", 6}, {"256QAM", 8}, {"1024QAM", 10}};
38 
39 static inline std::string MapModToStr(size_t mod_order) {
40  switch (mod_order) {
41  case 1:
42  return std::string("BPSK");
43  case 2:
44  return std::string("QPSK");
45  case 4:
46  return std::string("16QAM");
47  case 6:
48  return std::string("64QAM");
49  case 8:
50  return std::string("256QAM");
51  case 10:
52  return std::string("1024QAM");
53  default:
54  return std::string("UNKNOWN!");
55  }
56 }
57 
63 
66 void ModSimd(uint8_t* in, complex_float*& out, size_t len,
67  Table<complex_float>& mod_table);
68 
69 void DemodQpskHardLoop(const float* vec_in, uint8_t* vec_out, int num);
70 void DemodQpskSoftSse(float* x, int8_t* z, int len);
71 
72 void Demod16qamHardLoop(const float* vec_in, uint8_t* vec_out, int num);
73 void Demod16qamHardSse(float* vec_in, uint8_t* vec_out, int num);
74 void Demod16qamHardAvx2(float* vec_in, uint8_t* vec_out, int num);
75 
76 void Demod16qamSoftLoop(const float* vec_in, int8_t* llr, int num);
77 void Demod16qamSoftSse(float* vec_in, int8_t* llr, int num);
78 void Demod16qamSoftAvx2(float* vec_in, int8_t* llr, int num);
79 
80 void Demod64qamHardLoop(const float* vec_in, uint8_t* vec_out, int num);
81 void Demod64qamHardSse(float* vec_in, uint8_t* vec_out, int num);
82 void Demod64qamHardAvx2(float* vec_in, uint8_t* vec_out, int num);
83 
84 void Demod64qamSoftLoop(const float* vec_in, int8_t* llr, int num);
85 void Demod64qamSoftSse(float* vec_in, int8_t* llr, int num);
86 void Demod64qamSoftAvx2(float* vec_in, int8_t* llr, int num);
87 
88 void Demod256qamHardLoop(const float* vec_in, uint8_t* vec_out, int num);
89 void Demod256qamHardSse(float* vec_in, uint8_t* vec_out, int num);
90 void Demod256qamHardAvx2(float* vec_in, uint8_t* vec_out, int num);
91 #ifdef __AVX512F__
92 void Demod256qamHardAvx512(float* vec_in, uint8_t* vec_out, int num);
93 #endif
94 void Demod256qamSoftLoop(const float* vec_in, int8_t* llr, int num);
95 void Demod256qamSoftSse(const float* vec_in, int8_t* llr, int num);
96 void Demod256qamSoftAvx2(const float* vec_in, int8_t* llr, int num);
97 
98 #ifdef __AVX512F__
99 void Demod256qamSoftAvx512(const float* vec_in, int8_t* llr, int num);
100 #endif
101 void Print256Epi8(__m256i var);
102 
103 #endif // MODULATION_H_
__attribute__
class RadioSocket __attribute__
InitQam64Table
void InitQam64Table(Table< complex_float > &table)
Definition: modulation.cc:140
sqrt
2 sqrt()
Demod64qamHardSse
void Demod64qamHardSse(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:732
Demod256qamHardLoop
void Demod256qamHardLoop(const float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:1269
DemodQpskHardLoop
void DemodQpskHardLoop(const float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:264
Catch::Generators::table
GeneratorWrapper< std::tuple< Ts... > > table(std::initializer_list< std::tuple< typename std::decay< Ts >::type... >> tuples)
Definition: catch.hpp:4052
complex_float
Definition: test_transpose.cc:22
Table::IsAllocated
bool IsAllocated()
Definition: memory_manage.h:82
QAM64_THRESHOLD_3
#define QAM64_THRESHOLD_3
Definition: modulation.h:26
QAM64_THRESHOLD_2
#define QAM64_THRESHOLD_2
Definition: modulation.h:25
fmt::v8::printf
auto printf(const S &fmt, const T &... args) -> int
Definition: printf.h:631
SCALE_BYTE_CONV_QAM256
#define SCALE_BYTE_CONV_QAM256
Definition: modulation.h:22
ModSimd
void ModSimd(uint8_t *in, complex_float *&out, size_t len, Table< complex_float > &mod_table)
Definition: modulation.cc:218
DemodQpskHardLoop
void DemodQpskHardLoop(const float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:264
Demod64qamHardAvx2
void Demod64qamHardAvx2(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:921
Demod16qamHardAvx2
void Demod16qamHardAvx2(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:472
Demod64qamSoftLoop
void Demod64qamSoftLoop(const float *vec_in, int8_t *llr, int num)
Definition: modulation_srslte.cc:117
modulation.h
ModSimd
void ModSimd(uint8_t *in, complex_float *&out, size_t len, Table< complex_float > &mod_table)
Definition: modulation.cc:218
Demod256qamSoftSse
void Demod256qamSoftSse(const float *vec_in, int8_t *llr, int num)
Definition: modulation.cc:2201
QAM256_THRESHOLD_7
#define QAM256_THRESHOLD_7
Definition: modulation.h:33
memory_manage.h
Demod256qamHardSse
void Demod256qamHardSse(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:1329
Demod16qamHardLoop
void Demod16qamHardLoop(const float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:322
Demod64qamHardLoop
void Demod64qamHardLoop(const float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:699
Demod256qamSoftLoop
void Demod256qamSoftLoop(const float *vec_in, int8_t *llr, int num)
Definition: modulation.cc:2157
ModSingleUint8
complex_float ModSingleUint8(uint8_t x, Table< complex_float > &mod_table)
Definition: modulation.cc:213
x
x
Definition: simulate_performance.m:69
Print256Epi8
void Print256Epi8(__m256i var)
Definition: modulation.cc:17
QAM256_THRESHOLD_3
#define QAM256_THRESHOLD_3
Definition: modulation.h:29
Demod64qamSoftSse
void Demod64qamSoftSse(float *vec_in, int8_t *llr, int num)
Definition: modulation_srslte.cc:131
SCALE_BYTE_CONV_QAM16
#define SCALE_BYTE_CONV_QAM16
Definition: modulation.h:20
kSCsPerCacheline
static constexpr size_t kSCsPerCacheline
Definition: symbols.h:312
Demod16qamHardSse
void Demod16qamHardSse(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:345
Table< complex_float >
index
index
Definition: parse_all_dl.m:11
Demod64qamHardAvx2
void Demod64qamHardAvx2(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:921
x2
x2
Definition: simulate_performance.m:31
QAM16_THRESHOLD
#define QAM16_THRESHOLD
Definition: modulation.h:23
InitModulationTable
void InitModulationTable(Table< complex_float > &mod_table, size_t mod_order)
Definition: modulation.cc:42
fmt::v8::detail::abs
constexpr std::chrono::duration< Rep, Period > abs(std::chrono::duration< Rep, Period > d)
Definition: chrono.h:1488
Demod64qamSoftAvx2
void Demod64qamSoftAvx2(float *vec_in, int8_t *llr, int num)
Definition: modulation.cc:1103
Demod16qamSoftAvx2
void Demod16qamSoftAvx2(float *vec_in, int8_t *llr, int num)
Definition: modulation.cc:601
Demod256qamHardAvx2
void Demod256qamHardAvx2(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:1569
InitQam16Table
void InitQam16Table(Table< complex_float > &table)
Definition: modulation.cc:112
Demod256qamHardSse
void Demod256qamHardSse(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:1329
Demod16qamSoftSse
void Demod16qamSoftSse(float *vec_in, int8_t *llr, int num)
Definition: modulation_srslte.cc:36
Demod16qamSoftLoop
void Demod16qamSoftLoop(const float *vec_in, int8_t *llr, int num)
Definition: modulation_srslte.cc:24
QAM256_THRESHOLD_6
#define QAM256_THRESHOLD_6
Definition: modulation.h:32
message.h
Self defined functions for message storage and passing.
SCALE_BYTE_CONV_QAM64
#define SCALE_BYTE_CONV_QAM64
Definition: modulation.h:21
Demod16qamHardLoop
void Demod16qamHardLoop(const float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:322
len
uint16_t len
Definition: eth_common.h:62
QAM64_THRESHOLD_1
#define QAM64_THRESHOLD_1
Definition: modulation.h:24
i
for i
Definition: generate_data.m:107
Demod256qamHardLoop
void Demod256qamHardLoop(const float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:1269
ModSingle
complex_float ModSingle(int x, Table< complex_float > &mod_table)
Definition: modulation.cc:209
InitQam64Table
void InitQam64Table(Table< complex_float > &qam64_table)
Definition: modulation.cc:140
Demod16qamHardAvx2
void Demod16qamHardAvx2(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:472
Demod256qamHardAvx2
void Demod256qamHardAvx2(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:1569
QAM256_THRESHOLD_5
#define QAM256_THRESHOLD_5
Definition: modulation.h:31
ModSingle
complex_float ModSingle(int x, Table< complex_float > &mod_table)
Definition: modulation.cc:209
Print128Epi8
void Print128Epi8(__m128i var)
Definition: modulation.cc:28
Demod16qamSoftAvx2
void Demod16qamSoftAvx2(float *vec_in, int8_t *llr, int num)
Definition: modulation.cc:601
ModSingleUint8
complex_float ModSingleUint8(uint8_t x, Table< complex_float > &mod_table)
Definition: modulation.cc:213
Demod64qamHardSse
void Demod64qamHardSse(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:732
Print256Epi16
void Print256Epi16(__m256i var)
Definition: modulation.cc:9
Print256Epi8
void Print256Epi8(__m256i var)
Definition: modulation.cc:17
symbols.h
InitQpskTable
void InitQpskTable(Table< complex_float > &qpsk_table)
Definition: modulation.cc:75
QAM256_THRESHOLD_1
#define QAM256_THRESHOLD_1
Definition: modulation.h:27
Demod16qamHardSse
void Demod16qamHardSse(float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:345
MapModToStr
static std::string MapModToStr(size_t mod_order)
Definition: modulation.h:39
InitQpskTable
void InitQpskTable(Table< complex_float > &table)
Definition: modulation.cc:75
kMaxModType
static constexpr size_t kMaxModType
Definition: symbols.h:297
Demod256qamSoftLoop
void Demod256qamSoftLoop(const float *vec_in, int8_t *llr, int num)
Definition: modulation.cc:2157
DemodQpskSoftSse
void DemodQpskSoftSse(float *x, int8_t *z, int len)
Definition: modulation_srslte.cc:245
Demod64qamSoftAvx2
void Demod64qamSoftAvx2(float *vec_in, int8_t *llr, int num)
Definition: modulation.cc:1103
kModulStringMap
static const std::map< std::string, size_t > kModulStringMap
Definition: modulation.h:35
Print256Epi32
void Print256Epi32(__m256i var)
Definition: modulation.cc:3
Agora_memory::Alignment_t::kAlign32
@ kAlign32
Demod256qamSoftAvx2
void Demod256qamSoftAvx2(const float *vec_in, int8_t *llr, int num)
Definition: modulation.cc:2365
Demod256qamSoftSse
void Demod256qamSoftSse(const float *vec_in, int8_t *llr, int num)
Definition: modulation.cc:2201
InitModulationTable
void InitModulationTable(Table< complex_float > &table, size_t mod_order)
Definition: modulation.cc:42
InitQam256Table
void InitQam256Table(Table< complex_float > &table)
Definition: modulation.cc:175
Table::Malloc
void Malloc(size_t dim1, size_t dim2, Agora_memory::Alignment_t alignment)
Definition: memory_manage.h:37
QAM256_THRESHOLD_2
#define QAM256_THRESHOLD_2
Definition: modulation.h:28
Demod256qamSoftAvx2
void Demod256qamSoftAvx2(const float *vec_in, int8_t *llr, int num)
Definition: modulation.cc:2365
QAM256_THRESHOLD_4
#define QAM256_THRESHOLD_4
Definition: modulation.h:30
x1
end BigStation x1
Definition: simulate_performance.m:30
InitQam16Table
void InitQam16Table(Table< complex_float > &qam16_table)
Definition: modulation.cc:112
gettime.h
InitQam256Table
void InitQam256Table(Table< complex_float > &qam256_table)
Definition: modulation.cc:175
Demod64qamHardLoop
void Demod64qamHardLoop(const float *vec_in, uint8_t *vec_out, int num)
Definition: modulation.cc:699
fmt::v8::detail::digits::result
result
Definition: format-inl.h:640
ofdmtxrx.mod_order
int mod_order
Definition: ofdmtxrx.py:397