Agora  1.2.0
Agora project
UeWorker Class Reference

#include <ue_worker.h>

Collaboration diagram for UeWorker:

Public Member Functions

 UeWorker (size_t tid, Config &config, Stats &shared_stats, PhyStats &shared_phy_stats, moodycamel::ConcurrentQueue< EventData > &notify_queue, moodycamel::ConcurrentQueue< EventData > &work_queue, moodycamel::ProducerToken &work_producer, Table< int8_t > &ul_bits_buffer, Table< int8_t > &encoded_buffer, Table< complex_float > &modul_buffer, Table< complex_float > &ifft_buffer, char *const tx_buffer, Table< char > &rx_buffer, Table< complex_float > &csi_buffer, std::vector< SimdAlignCxFltVector > &equal_buffer, std::vector< size_t > &non_null_sc_ind, Table< complex_float > &fft_buffer, PtrCube< kFrameWnd, kMaxSymbols, kMaxUEs, int8_t > &demod_buffer, PtrCube< kFrameWnd, kMaxSymbols, kMaxUEs, int8_t > &decoded_buffer, std::vector< std::vector< std::complex< float >>> &ue_pilot_vec)
 
 ~UeWorker ()
 
void Start (size_t core_offset)
 
void Stop ()
 

Private Member Functions

void TaskThread (size_t core_offset)
 
void DoEncodeUe (DoEncode *encoder, size_t tag)
 
void DoModul (size_t tag)
 
void DoIfftUe (DoIFFTClient *iffter, size_t tag)
 
void DoIfft (size_t tag)
 
void DoFftPilot (size_t tag)
 
void DoFftData (size_t tag)
 
void DoDemul (size_t tag)
 
void DoDecodeUe (DoDecodeClient *decoder, size_t tag)
 

Private Attributes

size_t tid_
 
DFTI_DESCRIPTOR_HANDLE mkl_handle_
 
std::unique_ptr< moodycamel::ProducerTokenptok_
 
std::thread thread_
 
std::complex< float > * rx_samps_tmp_
 
moodycamel::ConcurrentQueue< EventData > & notify_queue_
 
moodycamel::ConcurrentQueue< EventData > & work_queue_
 
moodycamel::ProducerTokenwork_producer_token_
 
Configconfig_
 
Statsstats_
 
PhyStatsphy_stats_
 
Table< int8_t > & ul_bits_buffer_
 
Table< int8_t > & encoded_buffer_
 
Table< complex_float > & modul_buffer_
 
Table< complex_float > & ifft_buffer_
 
char *const tx_buffer_
 
Table< char > & rx_buffer_
 
Table< complex_float > & csi_buffer_
 
std::vector< SimdAlignCxFltVector > & equal_buffer_
 
std::vector< size_t > & non_null_sc_ind_
 
Table< complex_float > & fft_buffer_
 
PtrCube< kFrameWnd, kMaxSymbols, kMaxUEs, int8_t > & demod_buffer_
 
PtrCube< kFrameWnd, kMaxSymbols, kMaxUEs, int8_t > & decoded_buffer_
 
std::vector< std::vector< std::complex< float > > > & ue_pilot_vec_
 

Constructor & Destructor Documentation

◆ UeWorker()

UeWorker::UeWorker ( size_t  tid,
Config config,
Stats shared_stats,
PhyStats shared_phy_stats,
moodycamel::ConcurrentQueue< EventData > &  notify_queue,
moodycamel::ConcurrentQueue< EventData > &  work_queue,
moodycamel::ProducerToken work_producer,
Table< int8_t > &  ul_bits_buffer,
Table< int8_t > &  encoded_buffer,
Table< complex_float > &  modul_buffer,
Table< complex_float > &  ifft_buffer,
char *const  tx_buffer,
Table< char > &  rx_buffer,
Table< complex_float > &  csi_buffer,
std::vector< SimdAlignCxFltVector > &  equal_buffer,
std::vector< size_t > &  non_null_sc_ind,
Table< complex_float > &  fft_buffer,
PtrCube< kFrameWnd, kMaxSymbols, kMaxUEs, int8_t > &  demod_buffer,
PtrCube< kFrameWnd, kMaxSymbols, kMaxUEs, int8_t > &  decoded_buffer,
std::vector< std::vector< std::complex< float >>> &  ue_pilot_vec 
)
explicit
Here is the call graph for this function:

◆ ~UeWorker()

UeWorker::~UeWorker ( )
Here is the call graph for this function:

Member Function Documentation

◆ DoDecodeUe()

void UeWorker::DoDecodeUe ( DoDecodeClient decoder,
size_t  tag 
)
private
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoDemul()

void UeWorker::DoDemul ( size_t  tag)
private

Do demodulation task for a block of subcarriers (demul_block_size)

Parameters
offsetoffset of the first subcarrier in the block in ul_data_buffer_ Buffers: ul_data_buffer_, spm_buffer_, precoder_buffer_, equal_buffer_, demul_buffer_ Input buffer: ul_data_buffer_, precoder_buffer_ Output buffer: demul_buffer_ Intermediate buffer: spm_buffer, equal_buffer_ Offsets: ul_data_buffer_: dim1: frame index * # of data symbols per frame + data symbol index dim2: transpose block index * block size * # of antennas + antenna index * block size spm_buffer: dim1: task thread index dim2: antenna index precoder_buffer_: dim1: frame index * FFT size + subcarrier index in the current frame equal_buffer_, demul_buffer: dim1: frame index * # of data symbols per frame + data symbol index dim2: subcarrier index * # of users Event offset: offset Description:
  1. for each subcarrier in the block, block-wisely copy data from ul_data_buffer_ to spm_buffer_
  2. perform equalization with data and percoder matrixes
  3. perform demodulation on equalized data matrix
  4. add an event to the message queue to infrom main thread the completion of this task
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoEncodeUe()

void UeWorker::DoEncodeUe ( DoEncode encoder,
size_t  tag 
)
private

modulate data from nUEs and does spatial multiplexing by applying beamweights

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoFftData()

void UeWorker::DoFftData ( size_t  tag)
private
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoFftPilot()

void UeWorker::DoFftPilot ( size_t  tag)
private

Do FFT task for one OFDM symbol

Parameters
tidtask thread index, used for selecting muplans and task ptok
offsetoffset of the OFDM symbol in rx_buffer_ Buffers: rx_buffer_, fft_buffer_, csi_buffer_, ul_data_buffer_ Input buffer: rx_buffer_ Output buffer: csi_buffer_ if symbol is pilot ul_data_buffer_ if symbol is data Intermediate buffer: fft_buffer_ (FFT_inputs, FFT_outputs) Offsets: rx_buffer_: dim1: socket thread index: (offset / # of OFDM symbols per thread) dim2: OFDM symbol index in this socket thread (offset - # of symbols in previous threads) FFT_inputs, FFT_outputs: dim1: frame index
  • # of OFDM symbols per frame + symbol index * # of atennas + antenna index dim2: subcarrier index csi_buffer_: dim1: frame index * FFT size
  • subcarrier index in the current frame dim2: user index * # of antennas + antenna index ul_data_buffer_: dim1: frame index * # of data symbols per frame + data symbol index dim2: transpose block index * block size
  • # of antennas + antenna index * block size Event offset: frame index
  • # of symbol per frame + symbol index Description:
    1. copy received data (one OFDM symbol) from rx_buffer to fft_buffer_.FFT_inputs (remove CP)
    2. perform FFT on fft_buffer_.FFT_inputs and store results in fft_buffer_.FFT_outputs
    3. if symbol is pilot, do channel estimation from fft_buffer_.FFT_outputs to csi_buffer_ if symbol is data, copy data from fft_buffer_.FFT_outputs to ul_data_buffer_ and do block transpose
    4. add an event to the message queue to infrom main thread the completion of this task
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoIfft()

void UeWorker::DoIfft ( size_t  tag)
private
Here is the call graph for this function:
Here is the caller graph for this function:

◆ DoIfftUe()

void UeWorker::DoIfftUe ( DoIFFTClient iffter,
size_t  tag 
)
private
Here is the call graph for this function:

◆ DoModul()

void UeWorker::DoModul ( size_t  tag)
private
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Start()

void UeWorker::Start ( size_t  core_offset)
Here is the call graph for this function:

◆ Stop()

void UeWorker::Stop ( )

◆ TaskThread()

void UeWorker::TaskThread ( size_t  core_offset)
private
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ config_

Config& UeWorker::config_
private

◆ csi_buffer_

Table<complex_float>& UeWorker::csi_buffer_
private

◆ decoded_buffer_

PtrCube<kFrameWnd, kMaxSymbols, kMaxUEs, int8_t>& UeWorker::decoded_buffer_
private

◆ demod_buffer_

PtrCube<kFrameWnd, kMaxSymbols, kMaxUEs, int8_t>& UeWorker::demod_buffer_
private

◆ encoded_buffer_

Table<int8_t>& UeWorker::encoded_buffer_
private

◆ equal_buffer_

std::vector<SimdAlignCxFltVector>& UeWorker::equal_buffer_
private

◆ fft_buffer_

Table<complex_float>& UeWorker::fft_buffer_
private

◆ ifft_buffer_

Table<complex_float>& UeWorker::ifft_buffer_
private

◆ mkl_handle_

DFTI_DESCRIPTOR_HANDLE UeWorker::mkl_handle_
private

◆ modul_buffer_

Table<complex_float>& UeWorker::modul_buffer_
private

◆ non_null_sc_ind_

std::vector<size_t>& UeWorker::non_null_sc_ind_
private

◆ notify_queue_

moodycamel::ConcurrentQueue<EventData>& UeWorker::notify_queue_
private

◆ phy_stats_

PhyStats& UeWorker::phy_stats_
private

◆ ptok_

std::unique_ptr<moodycamel::ProducerToken> UeWorker::ptok_
private

◆ rx_buffer_

Table<char>& UeWorker::rx_buffer_
private

◆ rx_samps_tmp_

std::complex<float>* UeWorker::rx_samps_tmp_
private

◆ stats_

Stats& UeWorker::stats_
private

◆ thread_

std::thread UeWorker::thread_
private

◆ tid_

size_t UeWorker::tid_
private

◆ tx_buffer_

char* const UeWorker::tx_buffer_
private

◆ ue_pilot_vec_

std::vector<std::vector<std::complex<float> > >& UeWorker::ue_pilot_vec_
private

◆ ul_bits_buffer_

Table<int8_t>& UeWorker::ul_bits_buffer_
private

◆ work_producer_token_

moodycamel::ProducerToken& UeWorker::work_producer_token_
private

◆ work_queue_

moodycamel::ConcurrentQueue<EventData>& UeWorker::work_queue_
private

The documentation for this class was generated from the following files: