Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

mimo Namespace Reference


Classes

class  Multiply
 Base class for a general Multiply block. More...
class  MultiplyTM
 Matrix Multiply implementation block. More...
class  SquareTM
 Calculate the Product of a Matrix with itself. More...
class  MultiplyInvTM
 Matrix inversion and multiplication block, i.e. the solution of a linear equation system. More...
class  CalcCapacity
class  CalcSVDValues
class  CalcConditionNr
class  CalcRank
class  CalcMax
class  InvertTM
 Inversion of the input samples when sample are a matrix. More...
class  AwgnGenerator
class  CalcPCSValues
class  ChannelEstim
class  EstimSingleCarrier
class  EstimOFDM
class  Equalizer
class  EqualizerZF
 ZF Equalizer, i.e. Matrix inversion and multiplication block, i.e. the solution of a linear equation system. More...
class  EqualizerMMSE
 MMSE Equalizer, i.e. Matrix inversion and multiplication block, i.e. the solution of a linear equation system. More...
class  EqualizerMRC
 Maximum Ratio-Combining Equalizer,. More...
class  EqualizerMRCSwitch
 Maximum Ratio-Combining Equalizer with antenna selection on tx side. More...
class  FadingMIMOChannel
 DEPRECATED. MIMOChannel for statistical fading model. More...
class  CmplFadingMIMOChannel
 MIMOChannel with complex i.i.d. Gaussian fading. More...
class  FileFadingChannel
 Fading channel which reads fading coefficients from a file. More...
class  MSequenceBase
 Base class for implementing access to a sequence. More...
class  MSequence
 Base class for implementing access to a sequence. More...
class  MSequenceStorage
 Implementation of a sequence. More...
class  MSequenceAccess
 Implementation of a shallow copy of a sequence. More...
class  MSeqAttrT
class  MFreqSeqAttrT
class  MTimeSeqAttrT
class  VSeqAttrT
class  VTimeSeqAttrT
class  MaxEntropyChannel
class  MIMOChannel
class  PerfectMIMOChannel
class  AWGNMIMOChannel
class  AntennaArray
 Abstract base class that describes the geometry of the antenna array. More...
class  UniformLinearLambdaHalf
class  UniformCircularLambdaHalf
class  NonUniform
class  Decoder
 Abstract base class for a MIMO symbol decoder. More...
class  SpatialMuxDecZF
class  SpatialMuxDecMMSE
class  STBCAlamoutiDec
class  SVDDec
class  AntennaSelDec
class  RotAlamoutiDec
class  Encoder
 Abstract base class for a MIMO symbol encoder. More...
class  SpatialMuxEnc
class  STBCAlamoutiEnc
class  SVDEnc
class  AntennaSelEnc
class  RotAlamoutiEnc
class  LsdDecoder
class  LsdEncoder
class  PCSDecoder
class  PCSEncoder
class  Multiplexer
 Base class for a general Multiplexer/Demultiplexer. More...
class  MultiplexerT
 Multiplexer. More...
class  MultiplexerT< CMatrixSeq >
class  ToVector
class  FromVector
class  MultiplexFromVector
class  FromDiag
class  FromMat
class  Vectorize
class  PathParam
class  WSSUSChannel
class  WSSUSChannelJakesUniform
class  WSSUSChannelExpDelay
class  WSSUSChannelBU
class  WSSUSChannelHT
class  WSSUSChannelScattering
class  WSSUSChannelFreqTimeCorr
class  WSSUSChannelRA
 WSSUS channel for a rural area (COST). More...
class  WSSUSChannelTU
class  FileWssusChannel
class  WSSUSChannel2
class  WSSUSChannel2JakesUniform
class  WSSUSChannel2ExpDelay
class  WSSUSChannel2Scattering
class  WSSUSChannel2TU

Namespaces

namespace  Invert
namespace  MultiplexVector

Complex Matrix operations

int real_size (const CMatrix &, int complex_size)
const Complexc_assign (CMatrix &A, int i, int j, const Complex &c)
Complex c_access (const CMatrix &A, int i, int j)
std::ostream & c_print (std::ostream &s, const CMatrix &G)
int c_size (const CMatrix &A, int dim)
CMatrix c_eye (int i)
CMatrix c_zeros (int i, int j)
CMatrix c_ones (int i, int j)
const Complexc_add_s (CMatrix &A, int i, int j, const Complex &c)
simth::Complex c_det (const CMatrix &A)

Real-valued Matrix operations

Matrix eye (int i)
Matrix zeros (int i, int j)
Matrix ones (int i, int j)
double det (const Matrix &A)

Complex Vector operations

const Complexc_assign (CVector &A, int i, const Complex &c)
Complex c_access (const CVector &A, int i)
std::ostream & c_print (std::ostream &s, const CVector &G)
int c_size (const CVector &A)
const Complexc_add_s (CVector &a, int i, const Complex &c)
CVector c_ones (int i)
CVector c_zeros (int i)
Vector zeros (int i)

Blas routines

All of these are originally defined inside the Blas++ headers. But there, they are (of course) only defined for real-valued vectors. Here we add versions that can deal with our complex vectors and matrices and also Complex numbers.

void Blas_Add_Mult (CVector &dy, const Complex &c, const CVector &dx)
void Blas_Mult (CVector &dy, const Complex &c, const CVector &dx)
void Blas_Scale (const Complex &c, CVector &dx)
Complex Blas_Dot_Prod (const CVector &dx, const CVector &dy)
void Blas_R1_Update (CMatrix &A, const CVector &dx, const CVector &dy, const Complex &alpha)
double Blas_NormF (const CMatrix &A)
double Blas_NormF (const Matrix &A)
double Blas_Cond (const CMatrix &a, double threshold=0.0)
unsigned Blas_Rank (const CMatrix &a, double threshold=0.0)
double Blas_NormF_squared (const CMatrix &A)
void Mat_Add_Norm (Matrix &A, const CMatrix &B)

Typedefs

typedef LaComplex Complex
 We need a special complex type here. It has the necessary conversion operators to everything else.
typedef LaGenMatDouble Matrix
 Matrix of real double values.
typedef LaVectorDouble Vector
 Vector of real double values.
typedef LaGenMatComplex CMatrix
 Matrix of complex double values.
typedef LaVectorComplex CVector
 Vector of complex double values.
typedef MSequence< CMatrix,
MFreqSeqAttrT< CMatrix > > 
MatrixFreqSignal
typedef MSequence< CVector,
VSeqAttrT< CVector > > 
CVectorSeq
typedef MSequence< CVector,
VTimeSeqAttrT< CVector > > 
VectorTimeSignal
typedef MSequence< CMatrix,
MTimeSeqAttrT< CMatrix > > 
MatrixTimeSignal

Functions

std::ostream & operator<< (std::ostream &os, const MIMOChannel &cha)
std::ostream & operator<< (std::ostream &os, const Decoder &enc)
std::ostream & operator<< (std::ostream &os, const Encoder &enc)

Variables

class class class class class
class class typedef MSequence<
CMatrix, MSeqAttrT< CMatrix > > 
CMatrixSeq
const double DELAY_THRESHOLD = 0.001


Detailed Description

Namespace for mimo code. Notably, the matrix class is implemented here. In order for the type name 'Matrix' not to collide with someone else, this namespace was created.

The matrix and vector types appear for complex and real (double) values.

Historical note: Until 2004-01-14, we used a 'pseudo-complex matrix' which in fact was a real-valued matrix of double the size. This was the reason why we invented the c_access and c_assign functions.


Typedef Documentation

typedef LaComplex mimo::Complex
 

We need a special complex type here. It has the necessary conversion operators to everything else.

typedef LaGenMatDouble mimo::Matrix
 

Matrix of real double values.

typedef LaVectorDouble mimo::Vector
 

Vector of real double values.

typedef LaGenMatComplex mimo::CMatrix
 

Matrix of complex double values.

This is a matrix of complex (double) values. The row and column indices for accessing elements start from zero, different from what you would write in mathematical notation. This means you have

\[ A_{n\times m} = \left(\begin{array}{ccc} a_{11} & & a_{1m} \\ & \ddots & \\ a_{n1} & & a_{nm} \end{array}\right) \]

but for accessing the element $a_{11}$ you have to write A(0,0).

More (but sometimes outdated) documentation can be found in the Lapackpp header files.

Historical note: Until 2004-01-14, we used a 'pseudo-complex matrix' which in fact was a real-valued matrix of double the size. This was the reason why we invented the c_access and c_assign functions.

typedef LaVectorComplex mimo::CVector
 

Vector of complex double values.

This is a vector of complex (double) values. The element indices start from zero, different from what you would write in mathematical notation. This means you have

\[ w_{n} = \left(\begin{array}{c} w_1 \\ \vdots \\ w_n \end{array}\right) \]

but for accessing the element $w_1$ you have to write w(0).

More (but sometimes outdated) documentation can be found in the Lapackpp header files.

Historical note: Until 2004-01-14, we used a 'pseudo-complex vector' which in fact was a real-valued vector of double the size. This was the reason why we invented the c_access and c_assign functions.

typedef MSequence<CMatrix, MFreqSeqAttrT<CMatrix> > mimo::MatrixFreqSignal
 

Frequency sequence with matrices of scalar complex doubles ('complex values').

typedef MSequence<CVector, VSeqAttrT<CVector> > mimo::CVectorSeq
 

Sequence of vectors of scalar complex doubles ('complex values').

typedef MSequence<CVector, VTimeSeqAttrT<CVector> > mimo::VectorTimeSignal
 

Time sequence with vectors of scalar complex doubles ('complex values').

typedef MSequence<CMatrix, MTimeSeqAttrT<CMatrix> > mimo::MatrixTimeSignal
 

Time sequence with matrices of scalar complex doubles ('complex values').


Function Documentation

int real_size const CMatrix ,
int  complex_size
[inline]
 

DEPRECATED. Returns the actual storage size for any given complex_size of the complex Matrix type. This function has no effect any longer -- it simply returns its argument.

Historical note: This function used to be necessary until 2004-01-14, when 'pseudo-complex matrices' were used instead of native complex matrices. After that date, this project uses natively complex matrices and this function now is no longer necessary.

Parameters:
complex_size A size (i.e. any one of the matrix dimensions) that is used for the complex data type.
Returns:
The actual (i.e. any one of the matrix dimensions) size of the underlying real matrix.

const Complex& c_assign CMatrix A,
int  i,
int  j,
const Complex c
[inline]
 

Assigns a complex value to an element of the given complex matrix A.

Even though this function is not strictly necessary nowadays, it might still be useful in order to have the correct type conversions taking place.

Historical note: This function used to be necessary until 2004-01-14, when 'pseudo-complex matrices' were used instead of native complex matrices. After that date, this project uses natively complex matrices and this function now is no longer necessary.

Note:
If DEBUG is defined, i.e. you configured this package with --enable-debug, then every access is range-checked and any out of range access will result in a failed assertion in this file. However, if DEBUG is switched off, then any out of range access will probably result in very strange Lapack/Blas segmentation faults.
Parameters:
A The complex matrix where the element should be manipulated.
i Row index, starting at zero
j Column index, starting at zero
c The complex number that should be written into the complex matrix.
Returns:
A reference to the complex number that was just written into the matrix.
Note:
If DEBUG is defined, i.e. you configured this package with --enable-debug, then every access is range-checked and any out of range access will result in a failed assertion in this file. However, if DEBUG is switched off, then any out of range access will probably result in very strange Lapack/Blas segmentation faults.

Complex c_access const CMatrix A,
int  i,
int  j
[inline]
 

Returns a complex element of the complex matrix A.

Even though this function is not strictly necessary nowadays, it might still be useful in order to have the correct type conversions taking place.

Historical note: This function used to be necessary until 2004-01-14, when 'complex matrices' were used instead of native complex matrices. After that date, this project uses natively complex matrices and this function now is no longer necessary.

Parameters:
A The complex matrix from which the element should be returned.
i Row index, starting at zero
j Column index, starting at zero
Returns:
The complex value at the given position in the matrix.
Note:
If DEBUG is defined, i.e. you configured this package with --enable-debug, then every access is range-checked and any out of range access will result in a failed assertion in this file. However, if DEBUG is switched off, then any out of range access will probably result in very strange Lapack/Blas segmentation faults.

std::ostream& c_print std::ostream &  s,
const CMatrix G
 

DEPRECATED. Print the complex matrices.

int c_size const CMatrix A,
int  dim
[inline]
 

DEPRECATED. Returns the complex size of the complex matrix.

Historical note: This function used to be necessary until 2004-01-14, when 'pseudo-complex matrices' were used instead of native complex matrices. After that date, this project uses natively complex matrices and this function now is no longer necessary.

Parameters:
A The matrix of which the size should be returned.
dim The dimension whose size should be returned. In mathematical notation dim=0 are the rows and dim=1 are the columns.
Returns:
The size of the specified dimension. The indices for row and column run from zero to size-1.

CMatrix c_eye int  i  ) 
 

Returns a newly created identity matrix, with complex size i x i.

CMatrix c_zeros int  i,
int  j
 

Returns a newly created matrix of zeros, with complex size i x j.

CMatrix c_ones int  i,
int  j
 

Returns a newly created matrix of ones, with complex size i x j.

const Complex& c_add_s CMatrix A,
int  i,
int  j,
const Complex c
[inline]
 

Add a complex scalar to a matrix component.

Even though this function is not strictly necessary nowadays, it might still be useful in order to have the correct type conversions taking place.

Historical note: This function used to be necessary until 2004-01-14, when 'pseudo-complex matrices' were used instead of native complex matrices. After that date, this project uses natively complex matrices and this function now is no longer necessary.

Parameters:
A The complex matrix where the element should be manipulated.
i Row index, starting at zero
j Column index, starting at zero
c The complex number that should be added to the specified element of the complex matrix.
Returns:
A reference to the complex number that was just added to the matrix element.
Note:
If DEBUG is defined, i.e. you configured this package with --enable-debug, then every access is range-checked and any out of range access will result in a failed assertion in this file. However, if DEBUG is switched off, then any out of range access will probably result in very strange Lapack/Blas segmentation faults.

simth::Complex c_det const CMatrix A  ) 
 

Returns the complex determinant of the complex square matrix A. This algorithm calculated the LU factorization and multiplies its diagonal.

Matrix eye int  i  ) 
 

Returns a newly created identity matrix (square), with size i x i

Matrix zeros int  i,
int  j
 

Returns a newly created matrix of zeros, with size i x j.

Matrix ones int  i,
int  j
 

Returns a newly created matrix of ones, with size i x j.

double det const Matrix A  ) 
 

Returns the determinant of the square matrix A. This algorithm calculated the LU factorization and multiplies its diagonal.

const Complex& c_assign CVector A,
int  i,
const Complex c
[inline]
 

Assigns a complex value to an element of the given complex vector A

Even though this function is not strictly necessary nowadays, it might still be useful in order to have the correct type conversions taking place.

Historical note: This function used to be necessary until 2004-01-14, when 'pseudo-complex matrices' were used instead of native complex matrices. After that date, this project uses natively complex matrices and this function now is no longer necessary.

Parameters:
A The complex vector where the element should be manipulated.
i Position index, starting at zero
c The complex number that should be written into the complex vector.
Returns:
A reference to the complex number that was just written into the vector.
Note:
If DEBUG is defined, i.e. you configured this package with --enable-debug, then every access is range-checked and any out of range access will result in a failed assertion in this file. However, if DEBUG is switched off, then any out of range access will probably result in very strange Lapack/Blas segmentation faults.

Complex c_access const CVector A,
int  i
[inline]
 

Returns a complex element of the complex vector A.

Even though this function is not strictly necessary nowadays, it might still be useful in order to have the correct type conversions taking place.

Historical note: This function used to be necessary until 2004-01-14, when 'pseudo-complex matrices' were used instead of native complex matrices. After that date, this project uses natively complex matrices and this function now is no longer necessary.

Parameters:
A The complex vector from which the element should be returned.
i Position index, starting at zero
Returns:
The complex value at the given position in the vector.
Note:
If DEBUG is defined, i.e. you configured this package with --enable-debug, then every access is range-checked and any out of range access will result in a failed assertion in this file. However, if DEBUG is switched off, then any out of range access will probably result in very strange Lapack/Blas segmentation faults.

std::ostream& c_print std::ostream &  s,
const CVector G
 

DEPRECATED. Print the complex vector.

int c_size const CVector A  )  [inline]
 

DEPRECATED. Returns the complex size of the complex vector.

const Complex& c_add_s CVector a,
int  i,
const Complex c
[inline]
 

Add a complex scalar to a vector component.

Even though this function is not strictly necessary nowadays, it might still be useful in order to have the correct type conversions taking place.

Historical note: This function used to be necessary until 2004-01-14, when 'pseudo-complex matrices' were used instead of native complex matrices. After that date, this project uses natively complex matrices and this function now is no longer necessary.

Parameters:
a The complex vector where the element should be manipulated.
i Position index, starting at zero
c The complex number that should be added to the specified element of the complex vector.
Returns:
A reference to the complex number that was just added into the vector.
Note:
If DEBUG is defined, i.e. you configured this package with --enable-debug, then every access is range-checked and any out of range access will result in a failed assertion in this file. However, if DEBUG is switched off, then any out of range access will probably result in very strange Lapack/Blas segmentation faults.

CVector c_ones int  i  ) 
 

Returns a newly created vector of ones, with complex size i x j.

CVector c_zeros int  i  ) 
 

Returns a newly created vector of zeros, with complex size i x j.

Vector zeros int  i  ) 
 

Returns a newly created vector of zeros, with size i x j.

void Blas_Add_Mult CVector dy,
const Complex c,
const CVector dx
[inline]
 

Combined vector scaling and addition: dy = dy + c * dx

void Blas_Mult CVector dy,
const Complex c,
const CVector dx
[inline]
 

Combined vector scaling: dy = c * dx

void Blas_Scale const Complex c,
CVector dx
[inline]
 

Vector scaling: dx = c * dx

Complex Blas_Dot_Prod const CVector dx,
const CVector dy
[inline]
 

Returns the dot product of two vectors x and y, which is x'*y. Note: For complex vectors this is no longer commutative, but rather complex conjugate commutative.

void Blas_R1_Update CMatrix A,
const CVector dx,
const CVector dy,
const Complex alpha
[inline]
 

Perform the rank 1 operation A := alpha*dx*dy' + A Note: the vector dy' is the _conjugate_ transposed of dy.

double Blas_NormF const CMatrix A  ) 
 

Returns the Frobenius-Norm of matrix A (also called the Schur- or Euclidean norm): $||A||_F=\sqrt{\sum_{i,j}|a_{ij}|^2}$, i.e. the square root of the sum of the absolute squares of its elements.

See also:
Eric W. Weisstein. "Matrix Norm." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/MatrixNorm.html

double Blas_NormF const Matrix A  ) 
 

Returns the Frobenius-Norm of matrix A (also called the Schur- or Euclidean norm): $||A||_F=\sqrt{\sum_{i,j}|a_{ij}|^2}$, i.e. the square root of the sum of the absolute squares of its elements.

See also:
Eric W. Weisstein. "Matrix Norm." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/MatrixNorm.html

double Blas_Cond const CMatrix a,
double  threshold = 0.0
 

Calculates the condition number of a matrix. This is calculated by calculating the singular values first, which means this operation is probably rather expensive.

Since we are at numerics here, the threshold for considering a value equal to zero can be given as a second argument. Potential values are DBL_EPSILON, 10*DBL_EPSILON, DBL_MIN from <float.h>

See also:
http://mathworld.wolfram.com/ConditionNumber.html

unsigned Blas_Rank const CMatrix a,
double  threshold = 0.0
 

Calculates the rank of a matrix, which is the number of nonzero singular values. This is calculated by calculating the singular values first, which means this operation is probably rather expensive.

The returned value is the number of singular values that are truly greater than the threshold value.

Since we are at numerics here, the threshold for considering a value equal to zero can be given as a second argument. Potential values are DBL_EPSILON, 10*DBL_EPSILON, DBL_MIN from <float.h>

See also:
http://mathworld.wolfram.com/MatrixRank.html

double Blas_NormF_squared const CMatrix A  ) 
 

DEPRECATED. Returns the squared (!) Frobenius-Norm of matrix A: sum |h_ij|^2 over all i,j. This function is deprecated. Please try to use Blas_Norm2 instead, which will give you the square root of this value.

void Mat_Add_Norm Matrix A,
const CMatrix B
 

Calculate the std::norm of each element of B and add it to the respective element of the matrix A. B is a *complex* matrix, whereas A is a real-valued (nonnegative) matrix.

class std::ostream& operator<< std::ostream &  os,
const MIMOChannel &  cha
 

class std::ostream& operator<< std::ostream &  os,
const Decoder &  enc
 

class std::ostream& operator<< std::ostream &  os,
const Encoder &  enc
 


Variable Documentation

class class class class class class class class typedef MSequence<CMatrix, MSeqAttrT<CMatrix> > mimo::CMatrixSeq
 

Sequence of matrices of scalar complex doubles ('complex values').

const double mimo::DELAY_THRESHOLD = 0.001
 


Generated on Tue Aug 9 14:43:12 2005 for mimolib by  doxygen 1.4.1