2. As you can see all MIMO-Channels that are already implemented in Simthetic are subclasses of basic class Device. If you click on the 'simth::Device' button you get an overview of the functions that are available in every sub class. You can use this functions in your own class but at the beginning you don't have to. If you do use them read the documantation carefully, especially if you want to overwrite one of this functions.
3. If you go back to 'mimo::MIMOChannel' search under "Public Methods" for the functions getTransfer(...) and transmit(..). Those are the functions that you have to implement in your new channel class (indicated by =0 at the end of the function). The function transmit() should define how the transmission of the symbol-sequence from the transmitting antennas (insym) to the receiving antennas (outsym) is done. transmit() does its operation in the time domain, because the function arguments (insym and outsym) are time signals. getTransfer() is used for a channel estimation at a certain time and should return the channel matrix (H-Matrix) in the frequency domain, because the function argument is a frequency signal.
4. You should open the mimochannel_cpp files (at this moment mimo-channel.cpp, wssuschannel.cpp, maxentropychannel.cpp) and take a look at the source code in the two functions. For the implementation of a mimo channel there normally several mathmatical operations from the linear algebra needed. You will see that the mimolibrary uses its own datatypes and routines to handle those operations. To get an idea of a datatype like VectorTimeSignal or MatrixFreqSignal you should browse the files matrix.h and matrixseq.h with doxygen or directly with an editor. To store complex values in a matrix or in a vector the pseudo-complex matrix/vector has been invented. Its description and some usefull functions and operations are definded in: mimolib/api-doc/html/namespacecs.html.
5. At the beginning you can easily build a perfect MIMO Channel (but only if you have the same number of transmitting and receiving antennas, check your .par file to be sure). In transmit() every sample from the incomming VectorTimeSignal insym is directly given to the outgoing VectorTimeSignal outsym:
// adjust the distance between two samples delta_t = insym.rAttributes().deltaT(); if(outsym.rAttributes().deltaT() != delta_t) outsym.wAttributes().setDeltaT(delta_t); // make sure that insym and outsym have the correct dimensions assert_vector_lengths(insym, outsym); // make sure that the insym and outsym sequence have the same length size_incomming = insym.size(); if(outsym.size() != size_incomming) outsym.resize(size_incomming); // the "transmission" for(size_t t_index; t_index != insym.size(); t_index++) outsym[t_index] = insym[t_index];
In getTransfer() the returned Matrix is (of course) the identity matrix:
// create a pseudo complex indentity matrix cs::CMatrix eye(cs::c_eye(nr_tx)); // the identity matrix is the channel matrix for every frequency for(size_t f_index = 0; f_index != trans.size(); trans++) trans[f_index] = eye;
You can copy and paste this code in your blank functions
6. Starting with this simple channel you can extend it step by step. You should always take a look at the work which is already done by others to avoid doing something twice. You can use std::cout in your source to print out single steps and check the results with a calculator or a mathematical program. This is definitely the most complicated part of the work and it will take a while till you get satisfying results.
7. After finishing the transmit() and the getTransfer() function you can reimplement some of the virtual functions that are defined in basic class simth::Device. For example refresh() to dice new transfer factors.
8. Don't forget to make a some comments in your source code so that others (e.g. your supervisor) can help you with your problems. Also take the time and write a class description in your headerfile so that doxygen generates a documentation about what your channel (with its functions) does.