Agora  1.2.0
Agora project
DoFFT Class Reference

#include <dofft.h>

Inheritance diagram for DoFFT:
Collaboration diagram for DoFFT:

Public Member Functions

 DoFFT (Config *config, size_t tid, Table< complex_float > &data_buffer, PtrGrid< kFrameWnd, kMaxUEs, complex_float > &csi_buffers, Table< complex_float > &calib_dl_buffer, Table< complex_float > &calib_ul_buffer, PhyStats *in_phy_stats, Stats *stats_manager)
 
 ~DoFFT () override
 
EventData Launch (size_t tag) override
 
void PartialTranspose (complex_float *out_buf, size_t ant_id, SymbolType symbol_type) const
 
- Public Member Functions inherited from Doer
virtual bool TryLaunch (moodycamel::ConcurrentQueue< EventData > &task_queue, moodycamel::ConcurrentQueue< EventData > &complete_task_queue, moodycamel::ProducerToken *worker_ptok)
 
virtual EventData Launch (size_t tag, EventType event_type)
 

Private Attributes

Table< complex_float > & data_buffer_
 
PtrGrid< kFrameWnd, kMaxUEs, complex_float > & csi_buffers_
 
Table< complex_float > & calib_dl_buffer_
 
Table< complex_float > & calib_ul_buffer_
 
DFTI_DESCRIPTOR_HANDLE mkl_handle_
 
complex_floatfft_inout_
 
complex_floatfft_shift_tmp_
 
uint16_t * temp_16bits_iq_
 
std::complex< float > * rx_samps_tmp_
 
DurationStatduration_stat_fft_
 
DurationStatduration_stat_csi_
 
PhyStatsphy_stats_
 

Additional Inherited Members

- Protected Member Functions inherited from Doer
 Doer (Config *in_config, int in_tid)
 
virtual ~Doer ()=default
 
- Protected Attributes inherited from Doer
Configcfg_
 
int tid_
 

Constructor & Destructor Documentation

◆ DoFFT()

DoFFT::DoFFT ( Config config,
size_t  tid,
Table< complex_float > &  data_buffer,
PtrGrid< kFrameWnd, kMaxUEs, complex_float > &  csi_buffers,
Table< complex_float > &  calib_dl_buffer,
Table< complex_float > &  calib_ul_buffer,
PhyStats in_phy_stats,
Stats stats_manager 
)
Here is the call graph for this function:

◆ ~DoFFT()

DoFFT::~DoFFT ( )
override

Member Function Documentation

◆ Launch()

EventData DoFFT::Launch ( size_t  tag)
overridevirtual

Do FFT task for one OFDM symbol

Parameters
tagis an event data tag of type fft_req_tag_t

Buffers: socket_buffer_, fft_buffer_, csi_buffer_, data_buffer_ Input buffer: socket_buffer_ Output buffer: csi_buffer_ if symbol is pilot data_buffer_ if symbol is data Intermediate buffer: fft_buffer_ (FFT_inputs, FFT_outputs) Offsets: socket_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 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 socket_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 data_buffer_ and do block transpose
    4. add an event to the message queue to infrom main thread the completion of this task

Reimplemented from Doer.

Here is the call graph for this function:

◆ PartialTranspose()

void DoFFT::PartialTranspose ( complex_float out_buf,
size_t  ant_id,
SymbolType  symbol_type 
) const

Fill-in the partial transpose of the computed FFT for this antenna into out_buf.

The fully-transposed matrix after FFT is a subcarriers x antennas matrix that should look like so (using the notation subcarrier/antenna, and assuming kTransposeBlockSize = 16)

0/0, 0/1, ........................................................., 0/63 1/0, 0/1, ........................................................ , 1/63 ... 15/0, 15/1, ......................................................, 15/63 ... 1199/0, 1199/1, ............................................... , 1199/63

The partially-tranposed matrix looks like so: 0/0 1/0 ... 15/0 0/1 1/1 ... 15/1 .................... 0/3 1/3 .... 15/3 0/4 1/4 ... 15/4 0/5 1/5 ... 15/5 .................... 0/7 1/5 .... 15/7 ... ...........................................................0/63 ... 15/63 <end of partial transpose block> 16/0 17/0 ... 31/0 ....................................16/3 17/3 ... 31/3 16/4 17/4 ... 31/4 ....................................16/7 17/7 ... 31/7

Each partially-transposed block is identical to the corresponding block of the fully-transposed matrix, but laid out in memory in column-major order.

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

Member Data Documentation

◆ calib_dl_buffer_

Table<complex_float>& DoFFT::calib_dl_buffer_
private

◆ calib_ul_buffer_

Table<complex_float>& DoFFT::calib_ul_buffer_
private

◆ csi_buffers_

PtrGrid<kFrameWnd, kMaxUEs, complex_float>& DoFFT::csi_buffers_
private

◆ data_buffer_

Table<complex_float>& DoFFT::data_buffer_
private

◆ duration_stat_csi_

DurationStat* DoFFT::duration_stat_csi_
private

◆ duration_stat_fft_

DurationStat* DoFFT::duration_stat_fft_
private

◆ fft_inout_

complex_float* DoFFT::fft_inout_
private

◆ fft_shift_tmp_

complex_float* DoFFT::fft_shift_tmp_
private

◆ mkl_handle_

DFTI_DESCRIPTOR_HANDLE DoFFT::mkl_handle_
private

◆ phy_stats_

PhyStats* DoFFT::phy_stats_
private

◆ rx_samps_tmp_

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

◆ temp_16bits_iq_

uint16_t* DoFFT::temp_16bits_iq_
private

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