Agora  1.2.0
Agora project
comms-lib.h
Go to the documentation of this file.
1 // Copyright (c) 2018-2020, Rice University
2 // RENEW OPEN SOURCE LICENSE: http://renew-wireless.org/license
3 
12 #ifndef COMMSLIB_H_
13 #define COMMSLIB_H_
14 
15 #include <cmath>
16 #include <complex>
17 #include <map>
18 #include <string>
19 #include <vector>
20 
21 #include "common_typedef_sdk.h"
22 #include "immintrin.h"
23 #include "memory_manage.h"
24 #include "mkl_dfti.h"
25 
26 static const std::map<std::string, size_t> kBeamformingStr{
27  {"ZF", 0}, {"MMSE", 1}, {"MRC", 2}};
28 
29 class CommsLib {
30  public:
31  enum SequenceType {
38  };
39 
41  kBpsk = 1,
42  kQpsk = 2,
43  kQaM16 = 4,
44  kQaM64 = 6,
45  kQaM256 = 8
46  };
47 
48  enum BeamformingAlgorithm { kZF = 0, kMMSE = 1, kMRC = 2 };
49 
50  explicit CommsLib(std::string);
51  ~CommsLib();
52 
53  static std::vector<std::vector<double>> GetSequence(size_t seq_len, int type);
54  static std::vector<std::complex<float>> Modulate(
55  const std::vector<int8_t>& in, int type);
56 
57  static std::vector<size_t> GetDataSc(size_t fft_size, size_t data_sc_num,
58  size_t pilot_sc_offset,
59  size_t pilot_sc_spacing);
60  static std::vector<size_t> GetNullSc(size_t fft_size, size_t data_sc_num);
61  static std::vector<std::complex<float>> GetPilotScValue(
62  size_t fft_size, size_t data_sc_num, size_t pilot_sc_offset,
63  size_t pilot_sc_spacing);
64  static std::vector<size_t> GetPilotScIdx(size_t fft_size, size_t data_sc_num,
65  size_t pilot_sc_offset,
66  size_t pilot_sc_spacing);
67 
68  static MKL_LONG FFT(std::vector<std::complex<float>>& in_out, int fft_size);
69  static MKL_LONG IFFT(std::vector<std::complex<float>>& in_out, int fft_size,
70  bool normalize = true);
71  static MKL_LONG FFT(complex_float* in_out, int fft_size);
72  static MKL_LONG IFFT(complex_float* in_out, int fft_size,
73  bool normalize = true);
74  static std::vector<std::complex<float>> FFTShift(
75  const std::vector<std::complex<float>>& in);
76  static std::vector<complex_float> FFTShift(
77  const std::vector<complex_float>& in);
78  static void FFTShift(complex_float* in, complex_float* tmp, int fft_size);
79 
80  static float ComputeOfdmSnr(const std::vector<std::complex<float>>& data_t,
81  size_t data_start_index, size_t data_stop_index);
82  static size_t FindPilotSeq(const std::vector<std::complex<float>>& iq,
83  const std::vector<std::complex<float>>& pilot,
84  size_t seq_len);
85  static int FindLts(const std::vector<std::complex<double>>& iq, int seq_len);
86  template <typename T>
87  static std::vector<T> Convolve(std::vector<std::complex<T>> const& f,
88  std::vector<std::complex<T>> const& g);
89  template <typename T>
90  static std::vector<std::complex<T>> Csign(std::vector<std::complex<T>> iq);
91  static void Meshgrid(const std::vector<int>& x_in,
92  const std::vector<int>& y_in,
93  std::vector<std::vector<int>>& x,
94  std::vector<std::vector<int>>& y);
95  static inline int Hadamard2(int i, int j) {
96  return (__builtin_parity(i & j) != 0 ? -1 : 1);
97  }
98  static std::vector<float> MagnitudeFft(
99  std::vector<std::complex<float>> const& samps,
100  std::vector<float> const& win, size_t fft_size);
101  static std::vector<float> HannWindowFunction(size_t fft_size);
102  static double WindowFunctionPower(std::vector<float> const& win);
103  static float FindTone(std::vector<float> const& magnitude, double win_gain,
104  double fft_bin, size_t fft_size,
105  const size_t delta = 10);
106  static float MeasureTone(std::vector<std::complex<float>> const& samps,
107  std::vector<float> const& win, double win_gain,
108  double fft_bin, size_t fft_size,
109  const size_t delta = 10);
110  static std::vector<std::complex<float>> ComposePartialPilotSym(
111  const std::vector<std::complex<float>>& pilot, size_t offset,
112  size_t pilot_sc_num, size_t fft_size, size_t data_size, size_t data_start,
113  size_t cp_len, bool interleaved_pilot, bool time_domain = true);
114  static std::vector<std::complex<float>> SeqCyclicShift(
115  const std::vector<std::complex<float>>& in, float alpha);
116  static float FindMaxAbs(const complex_float* in, size_t len);
117  static float FindMaxAbs(const Table<complex_float>& in, size_t dim1,
118  size_t dim2);
119  static float FindMeanAbs(const complex_float* in, size_t len);
120  static float FindMeanAbs(const Table<complex_float>& in, size_t dim1,
121  size_t dim2);
122  static void Ifft2tx(const complex_float* in, std::complex<short>* out,
123  size_t N, size_t prefix, size_t cp, float scale);
124  static float AbsCf(complex_float d) {
125  return std::abs(std::complex<float>(d.re, d.im));
126  }
127  static int FindBeaconAvx(const std::vector<std::complex<float>>& iq,
128  const std::vector<std::complex<float>>& seq,
129  float corr_scale = 1.f);
130 
132  static ssize_t FindBeaconAvx(const std::complex<int16_t>* iq,
133  const std::vector<std::complex<float>>& seq,
134  size_t sample_window, float corr_scale = 1.f);
135 
136  static std::vector<float> CorrelateAvxS(std::vector<float> const& f,
137  std::vector<float> const& g);
138  static std::vector<float> Abs2Avx(std::vector<std::complex<float>> const& f);
139  static std::vector<int32_t> Abs2Avx(
140  std::vector<std::complex<int16_t>> const& f);
141  static std::vector<std::complex<float>> AutoCorrMultAvx(
142  std::vector<std::complex<float>> const& f, const int dly,
143  const bool conj = true);
144  static std::vector<std::complex<int16_t>> AutoCorrMultAvx(
145  std::vector<std::complex<int16_t>> const& f, const int dly,
146  const bool conj = true);
147  static std::vector<std::complex<float>> CorrelateAvx(
148  std::vector<std::complex<float>> const& f,
149  std::vector<std::complex<float>> const& g);
150  static std::vector<std::complex<float>> ComplexMultAvx(
151  std::vector<std::complex<float>> const& f,
152  std::vector<std::complex<float>> const& g, const bool conj);
153  static std::vector<std::complex<int16_t>> ComplexMultAvx(
154  std::vector<std::complex<int16_t>> const& f,
155  std::vector<std::complex<int16_t>> const& g, const bool conj);
156  static std::vector<std::complex<int16_t>> CorrelateAvx(
157  std::vector<std::complex<int16_t>> const& f,
158  std::vector<std::complex<int16_t>> const& g);
159 
160  static __m256 M256ComplexCf32Mult(__m256 data1, __m256 data2, bool conj);
161 #ifdef __AVX512F__
162  static __m512 M512ComplexCf32Mult(__m512 data1, __m512 data2, bool conj);
163 #endif
164 };
165 
166 #endif // COMMSLIB_H_
__attribute__
class RadioSocket __attribute__
CommsLib::AbsCf
static float AbsCf(complex_float d)
Definition: comms-lib.h:124
sqrt
2 sqrt()
main
int main(int argc, char *argv[])
Definition: user-main.cc:18
CommsLib::IFFT
static MKL_LONG IFFT(std::vector< std::complex< float >> &in_out, int fft_size, bool normalize=true)
Definition: comms-lib.cc:410
CommsLib::Meshgrid
static void Meshgrid(const std::vector< int > &x_in, const std::vector< int > &y_in, std::vector< std::vector< int >> &x, std::vector< std::vector< int >> &y)
Definition: comms-lib.cc:163
CommsLib::CommsLib
CommsLib(std::string)
CommsLib::GetPilotScValue
static std::vector< std::complex< float > > GetPilotScValue(size_t fft_size, size_t data_sc_num, size_t pilot_sc_offset, size_t pilot_sc_spacing)
Definition: comms-lib.cc:369
complex_float
Definition: test_transpose.cc:22
fmt::v8::printf
auto printf(const S &fmt, const T &... args) -> int
Definition: printf.h:631
datatype_conversion.h
SignalHandler
Definition: signal_handler.h:14
version_config.h
Agora project version configuration file.
ConvertShortToFloat
static void ConvertShortToFloat(const short *in_buf, float *out_buf, size_t n_elems)
Produces outputs -1->+0.999.
Definition: datatype_conversion.h:41
CommsLib::FindPilotSeq
static size_t FindPilotSeq(const std::vector< std::complex< float >> &iq, const std::vector< std::complex< float >> &pilot, size_t seq_len)
Definition: comms-lib.cc:32
CommsLib::FindLts
static int FindLts(const std::vector< std::complex< double >> &iq, int seq_len)
Definition: comms-lib.cc:54
CommsLib::GetPilotScIdx
static std::vector< size_t > GetPilotScIdx(size_t fft_size, size_t data_sc_num, size_t pilot_sc_offset, size_t pilot_sc_spacing)
Definition: comms-lib.cc:390
AVX_PACKED_CS
#define AVX_PACKED_CS
Definition: comms-lib-avx.cc:24
CommsLib::Abs2Avx
static std::vector< float > Abs2Avx(std::vector< std::complex< float >> const &f)
Definition: comms-lib-avx.cc:364
CommsLib::kZF
@ kZF
Definition: comms-lib.h:48
CommsLib::BeamformingAlgorithm
BeamformingAlgorithm
Definition: comms-lib.h:48
GetAgoraProjectVersion
const std::string & GetAgoraProjectVersion()
Definition: version_config.h:10
CommsLib::GetDataSc
static std::vector< size_t > GetDataSc(size_t fft_size, size_t data_sc_num, size_t pilot_sc_offset, size_t pilot_sc_spacing)
Definition: comms-lib.cc:325
Table::At
const T * At(size_t dim1) const
Definition: memory_manage.h:93
AGORA_LOG_INIT
#define AGORA_LOG_INIT()
Definition: logger.h:35
CommsLib::kQpsk
@ kQpsk
Definition: comms-lib.h:42
CommsLib::ModulationOrder
ModulationOrder
Definition: comms-lib.h:40
fft_size
fft_size
Definition: inspect_agora_results.m:19
CommsLib::SequenceType
SequenceType
Definition: comms-lib.h:31
memory_manage.h
AVX_PACKED_SI
#define AVX_PACKED_SI
Definition: comms-lib-avx.cc:23
ALIGNMENT
#define ALIGNMENT
Definition: comms-lib-avx.cc:21
length
end IFFT Reshape the symbol vector into two different spatial streams length(tx_syms)/NUM_UE
y
y
Definition: simulate_performance.m:74
CommsLib::FindMaxAbs
static float FindMaxAbs(const complex_float *in, size_t len)
Definition: comms-lib.cc:135
fclose
fclose(fileID)
CommsLib::kStsSeq
@ kStsSeq
Definition: comms-lib.h:32
AGORA_LOG_ERROR
#define AGORA_LOG_ERROR(...)
Definition: logger.h:39
TOSTRING
#define TOSTRING(x)
Definition: symbols.h:14
signal_handler.h
x
x
Definition: simulate_performance.m:69
Catch::cerr
std::ostream & cerr()
kBeamformingStr
static const std::map< std::string, size_t > kBeamformingStr
Definition: comms-lib.h:26
Table< complex_float >
index
index
Definition: parse_all_dl.m:11
x2
x2
Definition: simulate_performance.m:31
CommsLib::kQaM64
@ kQaM64
Definition: comms-lib.h:44
CommsLib::kBpsk
@ kBpsk
Definition: comms-lib.h:41
filename
filename
Definition: parse_all_dl.m:14
fmt::v8::detail::abs
constexpr std::chrono::duration< Rep, Period > abs(std::chrono::duration< Rep, Period > d)
Definition: chrono.h:1488
CommsLib::ComposePartialPilotSym
static std::vector< std::complex< float > > ComposePartialPilotSym(const std::vector< std::complex< float >> &pilot, size_t offset, size_t pilot_sc_num, size_t fft_size, size_t data_size, size_t data_start, size_t cp_len, bool interleaved_pilot, bool time_domain=true)
Definition: comms-lib.cc:634
CommsLib::kGoldIfft
@ kGoldIfft
Definition: comms-lib.h:36
CommsLib::Convolve
static std::vector< T > Convolve(std::vector< std::complex< T >> const &f, std::vector< std::complex< T >> const &g)
Definition: comms-lib.cc:215
CommsLib::kQaM16
@ kQaM16
Definition: comms-lib.h:43
simd_types.h
Aligned types for SIMD compatibility.
CommsLib::kLtsSeq
@ kLtsSeq
Definition: comms-lib.h:33
CommsLib::FFTShift
static std::vector< std::complex< float > > FFTShift(const std::vector< std::complex< float >> &in)
Definition: comms-lib.cc:581
CommsLib::ComplexMultAvx
static std::vector< std::complex< float > > ComplexMultAvx(std::vector< std::complex< float >> const &f, std::vector< std::complex< float >> const &g, const bool conj)
Definition: comms-lib-avx.cc:290
data_start
data_start
Definition: inspect_agora_results.m:17
len
uint16_t len
Definition: eth_common.h:62
i
for i
Definition: generate_data.m:107
CommsLib::kLtsFSeq
@ kLtsFSeq
Definition: comms-lib.h:34
Catch::cout
std::ostream & cout()
u
Plot Rx waveform for u
Definition: inspect_single_frame.m:108
comms-lib.h
Communications Library: a) Generate pilot/preamble sequences b) OFDM modulation.
CommsLib::Hadamard2
static int Hadamard2(int i, int j)
Definition: comms-lib.h:95
CommsLib::HannWindowFunction
static std::vector< float > HannWindowFunction(size_t fft_size)
Definition: comms-lib.cc:266
CommsLib::Ifft2tx
static void Ifft2tx(const complex_float *in, std::complex< short > *out, size_t N, size_t prefix, size_t cp, float scale)
Definition: comms-lib.cc:656
cp_len
cp_len
Definition: inspect_agora_results.m:20
CommsLib::kLteZadoffChu
@ kLteZadoffChu
Definition: comms-lib.h:35
CommsLib::ComputeOfdmSnr
static float ComputeOfdmSnr(const std::vector< std::complex< float >> &data_t, size_t data_start_index, size_t data_stop_index)
Definition: comms-lib.cc:608
CommsLib::FFT
static MKL_LONG FFT(std::vector< std::complex< float >> &in_out, int fft_size)
Definition: comms-lib.cc:460
CommsLib::MagnitudeFft
static std::vector< float > MagnitudeFft(std::vector< std::complex< float >> const &samps, std::vector< float > const &win, size_t fft_size)
Definition: comms-lib.cc:237
CommsLib::FindTone
static float FindTone(std::vector< float > const &magnitude, double win_gain, double fft_bin, size_t fft_size, const size_t delta=10)
Definition: comms-lib.cc:295
CommsLib::Csign
static std::vector< std::complex< T > > Csign(std::vector< std::complex< T >> iq)
Definition: comms-lib.cc:190
CommsLib::Modulate
static std::vector< std::complex< float > > Modulate(const std::vector< int8_t > &in, int type)
Definition: comms-lib.cc:663
CommsLib::FindBeaconAvx
static int FindBeaconAvx(const std::vector< std::complex< float >> &iq, const std::vector< std::complex< float >> &seq, float corr_scale=1.f)
Correlation and Peak detection of a beacon with Gold code (2 repetitions)
Definition: comms-lib-avx.cc:46
x3
x3
Definition: simulate_performance.m:32
data_size
data_size
Definition: inspect_agora_results.m:16
ofdmtxrx.x0
x0
Definition: ofdmtxrx.py:399
extract_version.data
dictionary data
Definition: extract_version.py:8
n
n
Definition: simulate_performance.m:1
d
for d
Definition: process_rx_frame.m:53
CommsLib::SeqCyclicShift
static std::vector< std::complex< float > > SeqCyclicShift(const std::vector< std::complex< float >> &in, float alpha)
Definition: comms-lib.cc:725
CommsLib::kQaM256
@ kQaM256
Definition: comms-lib.h:45
CommsLib
Definition: comms-lib.h:29
fmt::v8::detail::first
const T & first(const T &value, const Tail &...)
Definition: compile.h:178
CommsLib::kHadamard
@ kHadamard
Definition: comms-lib.h:37
phy-ue.h
Declaration file for the phy ue class.
fwrite
fwrite(fileID, pilot_f, 'float')
extract_version.m
m
Definition: extract_version.py:13
fmt::v8::detail::normalize
fp normalize(fp value)
Definition: format-inl.h:288
CommsLib::FindMeanAbs
static float FindMeanAbs(const complex_float *in, size_t len)
Definition: comms-lib.cc:155
RtAssert
static void RtAssert(bool condition, const char *throw_str)
Definition: utils.h:104
AGORA_LOG_SHUTDOWN
#define AGORA_LOG_SHUTDOWN()
Definition: logger.h:36
CommsLib::CorrelateAvxS
static std::vector< float > CorrelateAvxS(std::vector< float > const &f, std::vector< float > const &g)
Definition: comms-lib-avx.cc:505
comms-constants.inc
noise
noise
Definition: generate_data_dl.m:131
PrintCoreAssignmentSummary
void PrintCoreAssignmentSummary()
Definition: utils.cc:85
CommsLib::MeasureTone
static float MeasureTone(std::vector< std::complex< float >> const &samps, std::vector< float > const &win, double win_gain, double fft_bin, size_t fft_size, const size_t delta=10)
Definition: comms-lib.cc:317
config.h
Declaration file for the configuration class which importants json configuration values into class va...
CommsLib::AutoCorrMultAvx
static std::vector< std::complex< float > > AutoCorrMultAvx(std::vector< std::complex< float >> const &f, const int dly, const bool conj=true)
Definition: comms-lib-avx.cc:322
x1
end BigStation x1
Definition: simulate_performance.m:30
CommsLib::WindowFunctionPower
static double WindowFunctionPower(std::vector< float > const &win)
Definition: comms-lib.cc:285
CommsLib::M256ComplexCf32Mult
static __m256 M256ComplexCf32Mult(__m256 data1, __m256 data2, bool conj)
Definition: comms-lib-avx.cc:196
CommsLib::kMRC
@ kMRC
Definition: comms-lib.h:48
utils.h
Utility functions for file and text processing.
DEFINE_string
DEFINE_string(conf_file, TOSTRING(PROJECT_DIRECTORY) "/files/config/ci/chsim.json", "Config filename")
SignalHandler::SetupSignalHandlers
void SetupSignalHandlers()
Definition: signal_handler.cc:44
CommsLib::GetNullSc
static std::vector< size_t > GetNullSc(size_t fft_size, size_t data_sc_num)
Definition: comms-lib.cc:350
CommsLib::kMMSE
@ kMMSE
Definition: comms-lib.h:48
Utils::DoubleToCfloat
static std::vector< std::complex< float > > DoubleToCfloat(const std::vector< std::vector< double >> &in)
Definition: utils.cc:232
SignalException
Definition: signal_handler.h:8
M256ComplexCs16Mult
static __m256i M256ComplexCs16Mult(__m256i data1, __m256i data2, bool conj)
Definition: comms-lib-avx.cc:131
CommsLib::GetSequence
static std::vector< std::vector< double > > GetSequence(size_t seq_len, int type)
Definition: comms-lib.cc:734
max
max(y1, y1_1)
ConvertFloatToShort
static void ConvertFloatToShort(const float *in_buf, short *out_buf, size_t n_elems, size_t n_prefix=0, float scale_down_factor=1.0f)
Definition: datatype_conversion.h:237
CommsLib::CorrelateAvx
static std::vector< std::complex< float > > CorrelateAvx(std::vector< std::complex< float >> const &f, std::vector< std::complex< float >> const &g)
Definition: comms-lib-avx.cc:463
fmt::v8::detail::digits::result
result
Definition: format-inl.h:640
CommsLib::~CommsLib
~CommsLib()
fmt::v8::detail::type
type
Definition: core.h:1131
AVX_PACKED_SP
#define AVX_PACKED_SP
Definition: comms-lib-avx.cc:22