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

mimo::WSSUSChannel Class Reference

#include <wssuschannel.h>

Inheritance diagram for mimo::WSSUSChannel:

Inheritance graph
[legend]
List of all members.

Public Member Functions

 WSSUSChannel (int deviceID, DeviceSystemIntf *system, const simth::PropertyList &pl, double maxDelay)
virtual ~WSSUSChannel ()
 destructor
virtual void refresh ()
void getTransfer (int relative_time, MatrixFreqSignal &trans) const
void transmit (const VectorTimeSignal &insym, VectorTimeSignal &outsym)
void setRiceFactor (double rf)
void setRiceFactor_dB (double rf)
void setTimeNormalization (unsigned duration=0)
void setFreqNormalization (double freqDist, int numFreqs, unsigned duration=0)
virtual void startOfSimulation ()
virtual void print (std::ostream &os) const

Protected Types

typedef std::vector< PathParamPathContainer
 The type of the container that holds all path parameters.

Protected Member Functions

int roundTimeToSamples (double value) const
 function for rounding delay times into number of samples
virtual double diceNewDelay () const =0
virtual double diceNewPhase () const =0
virtual double diceNewAmpl () const
virtual double diceNewDopplerFreq () const =0
virtual double diceNewAoA () const
virtual double diceNewAoD () const
void getImpulseResponse (int relative_time, MatrixTimeSignal &t) const

Protected Attributes

unsigned num_paths
 number of independent propagation paths
double max_delay
 maximal delay time
PathContainer paths
 all paths
AntennaArrayarray_geometry
 Geometry of the antenna arrays.
double delta_t
 sampling time of the sequences to be transmitted
VectorTimeSignal::storage_type prevsym
 previously transmitted samples of one OFDM symbol
bool firstSequence
MatrixFreqSignal::storage_type cacheTransfer
int cacheTime
 Time for which the cached transfer function was valid.
bool isTransferCacheValid
bool timevariant

Related Functions

(Note that these are not member functions.)

 propertylist_WSSUSChannel (not_a_function)

Detailed Description

WSSUS Channel.

This is the abstract base class of statistical time-variant multipath MIMO channel models for mobile radio environments. The time-variant MIMO impulse response is modelled by $K$ independent paths which are determined according to given probability density functions (pdf).

For each propagation path $k$ the following parameters are randomly determined: delay $\tau_k$ (e.g. with a negative exponential pdf), Doppler frequency $f_{Dk}$ (e.g. with a Jakes pdf), initial phase $\theta_k$ (e.g. with a uniform pdf), and angle of arrival $\alpha_k$ and departure $\beta_k$ (e.g. with discrete set of uniformly distributed values).

Additionally, a geometry of the antenna array on transmitter and receiver side is chosen by WSSUSChannel::setArrayGeometry(). With the chosen array geometry, the phase shift at each individual transmitter antenna $m$ and receiver antenna $n$ can be calculated as a function of the angles of arrival $\phi_n(\alpha_k)$ and departure $\psi_m(\beta_k)$.

The impulse response of the channel from antenna $m$ to antenna $n$ is

\[ h_{nm}(\tau,t) = \frac{1}{\sqrt{K}} \sum_{k=1}^{K} e^{j(\theta_k +2\pi f_{Dk}t)} \cdot \delta(\tau - \tau_k) \cdot e^{j[\phi_n(\alpha_k)+\psi_m(\beta_k)]} \]

(LaTeX rules!)

The realizations of these parameters are chosen randomly in WSSUSChannel::refresh(). Each individial parameter is obtained independently from each other through the purely virtual functions diceNewDelay(), diceNewPhase(), and diceNewDopplerFreq(). These virtual functions are implemented in a derived class, which is responsible for choosing the PDFs of each parameter.

The angles of arrival and departure (functions diceNewAoA() and diceNewAoD()) are an exception. They are already implemented in WSSUSChannel class because otherwise the random number generators are not properly resetted upon refresh(). The probability distribution behind these variables is a bit tricky: The realizations for the angles are not uniformly distributed! Instead, for these random variables at each refresh() a small set of discrete angles is drawn from a uniform distribution. Then, each path angle is drawn from this small set of discrete angles. This means that many paths will have the same angle -- and this effect is desired in order to model the fact of a small number of "angles of arrival", which is commonly agreed upon in the MIMO community.

Various types of specialized channels can be supported by derived classes. These classes complement this general channel model (WSSUSChannel) with special pdf's (one example is given above).

There are two derived channel models which can be constructed for a given coherence time and coherence bandwidth and for a given maximal Doppler frequency and maximal delay, respectively. For the WSSUS channel there are functions which modify the channel's coherence time or bandwidth.

Furthermore, there are the following four COST channel models which can be selected with a different constructor: RA (rural area) -- $0.7\mu s$ maximal delay, TU (typical urban) -- $7\mu s$ max. delay, BU (bad urban) -- $10\mu s$ max. delay, HT (hilly terrain) -- $20\mu s$ max. delay

Author:
Christian Stimming <stimming@tuhh.de> but the non-%MIMO parts are heavily copied from Peter Haase and others.


Member Typedef Documentation

typedef std::vector<PathParam> mimo::WSSUSChannel::PathContainer [protected]
 

The type of the container that holds all path parameters.


Constructor & Destructor Documentation

mimo::WSSUSChannel::WSSUSChannel int  deviceID,
DeviceSystemIntf system,
const simth::PropertyList pl,
double  maxDelay
 

Constructor for given maximal delay and Doppler frequency. (FIXME: These are rather specified in the derived class, aren't they?)

Parameters:
deviceID Device ID
system The parent system
pl The list of properties this device has. It needs to have the properties "nr_tx", "nr_rx" set.
maxDelay Maximal delay of the channel. The negative exponential pdf of the delay is modified according to the given value so that longer delays do not occur.

virtual mimo::WSSUSChannel::~WSSUSChannel  )  [virtual]
 

destructor


Member Function Documentation

int mimo::WSSUSChannel::roundTimeToSamples double  value  )  const [inline, protected]
 

function for rounding delay times into number of samples

virtual double mimo::WSSUSChannel::diceNewDelay  )  const [protected, pure virtual]
 

Returns a new realization of the delay random variable. To be implemented by a derived class.

Implemented in mimo::WSSUSChannelExpDelay, mimo::WSSUSChannelBU, mimo::WSSUSChannelHT, and mimo::FileWssusChannel.

virtual double mimo::WSSUSChannel::diceNewPhase  )  const [protected, pure virtual]
 

Returns a new realization of the initial phase random variable. Well, this already kind of implies this random variable should follow a uniform distribution in $[0\ldots2\pi[$.

To be implemented by a derived class.

Implemented in mimo::WSSUSChannelJakesUniform, and mimo::FileWssusChannel.

virtual double mimo::WSSUSChannel::diceNewAmpl  )  const [protected, virtual]
 

Returns a new realization of the amplitudes of the phases. May or may not be implemented by a derived class. The default implementation returns one, or, if the property "path_ampl_random" is true, it returns a Rayleigh distributed random variate.

virtual double mimo::WSSUSChannel::diceNewDopplerFreq  )  const [protected, pure virtual]
 

Returns a new realization of the doppler frequency random variable. To be implemented by a derived class.

Implemented in mimo::WSSUSChannelJakesUniform, and mimo::FileWssusChannel.

virtual double mimo::WSSUSChannel::diceNewAoA  )  const [protected, virtual]
 

Returns a new realization of the angles of arrival random variable. We already have an implementation of this function here because otherwise the RNG is not properly resetted upon refresh().

virtual double mimo::WSSUSChannel::diceNewAoD  )  const [protected, virtual]
 

Returns a new realization of the angles of departure random variable. We already have an implementation of this function here because otherwise the RNG is not properly resetted upon refresh().

virtual void mimo::WSSUSChannel::refresh  )  [virtual]
 

Calculate new random paths.

For each propagation path $k$ the following parameters are randomly determined: delay $\tau_k$ (e.g. with a negative exponential pdf), Doppler frequency $f_{Dk}$ (e.g. with a Jakes pdf), initial phase $\theta_k$ (e.g. with a uniform pdf), and angle of arrival $\alpha_k$ and departure $\beta_k$. In other words, all parameters in the MIMO::PathParam class.

Additionally, a geometry of the antenna array on transmitter and receiver side is chosen by WSSUSChannel::setArrayGeometry(). With the chosen array geometry, the phase shift at each individual transmitter antenna $m$ and receiver antenna $n$ can be calculated as a function of the angles of arrival $\phi_n(\alpha_k)$ and departure $\psi_m(\beta_k)$.

Note: If you want new PDFs to be used, it is sufficient to create a derived class with different diceNewDelay(), diceNewPhase() (also for angles of arrival/departure), and diceNewDopplerFreq(). However, these functions all imply that the PDFs are independent of each other. If you want some joint PDFs, then of course you need to fully reimplement this function and no longer only the independent functions mentioned before.

Reimplemented from simth::Device.

Reimplemented in mimo::FileWssusChannel.

void mimo::WSSUSChannel::getTransfer int  relative_time,
MatrixFreqSignal trans
const [virtual]
 

Determines channel transfer factors.

An ideal estimation of the channel transfer function is performed. This means, the exact values $H(f_i,t_0)$ are determined, where $t_0$ is ${\tt relative_time} * {\tt delta\_t}$ and $f_i = n\cdot \mbox{\tt delta\_f}, n=0, \dots, \mbox{\tt num\_f}-1$.

NOTE: The time argument is a relative time. time = 0 indicates the transmission time of the last sample transmitted, i.e. the sample that has "just been transmitted" over the channel. For example time = -numSamples would indicate the transmission time of the first sample of the last transmitted sequence.

Parameters:
relative_time The relative time at which the transfer function is calculated. This is relative to the last time sample that was transmitted over this channel!
trans The FreqSignal that receives the resulting transfer function. It needs to have a proper delta_f attribute set.

Implements mimo::MIMOChannel.

void mimo::WSSUSChannel::transmit const VectorTimeSignal insym,
VectorTimeSignal outsym
[virtual]
 

Transmits a symbol sequence.

The symbol sequence insym is transmitted over the channel with the result outsym. Inter-symbol interference of a previously transmitted sequence is considered.

Implements mimo::MIMOChannel.

void mimo::WSSUSChannel::setRiceFactor double  rf  ) 
 

Sets the Ricean factor of the channel, default is 0

void mimo::WSSUSChannel::setRiceFactor_dB double  rf  ) 
 

sets the Ricean factor of the channel (in dB), default is $-\infty$

void mimo::WSSUSChannel::setTimeNormalization unsigned  duration = 0  ) 
 

Sets the normalization mode to TIME.

void mimo::WSSUSChannel::setFreqNormalization double  freqDist,
int  numFreqs,
unsigned  duration = 0
 

Sets the normalization mode to FREQ. freqDist and numFreqs are used to specify the used frequency range (starts by zero).

virtual void mimo::WSSUSChannel::startOfSimulation  )  [virtual]
 

Called by the simulation system in the beginning of each simulation run.

Reimplemented from mimo::MIMOChannel.

Reimplemented in mimo::FileWssusChannel.

virtual void mimo::WSSUSChannel::print std::ostream &  os  )  const [virtual]
 

Reimplemented from mimo::MIMOChannel.

void mimo::WSSUSChannel::getImpulseResponse int  relative_time,
MatrixTimeSignal t
const [protected]
 


Friends And Related Function Documentation

propertylist_WSSUSChannel not_a_function   )  [related]
 

These are the properties of class WSSUSChannel . This list is auto-generated from the XML-Devicelist of this device by means of an XSLT transformation script.

Description of this device in the XML file: This MIMO channel uses the WSSUS channel model and extends it to the MIMO case by multiplying the path coefficients with the appropriate steering vectors.

Additionally, this Device calculates the actual transmission either in time domain or in frequency domain. This was added because the time-domain transmission gave some unexpected not-so-correct results, and the fully correct results were only obtained by the frequency-domain transmission.

By default, time-domain transmission is used. To use frequency-domain transmission, you need to specify the OFDM parameters according to the ones used by your transmitter and receiver. If any num_carrier greater than one is used, the frequency domain transmission is used. Otherwise the time domain transmission is used. In terms of computational time, surprisingly the frequency-domain transmission is faster than the other by about 30%.

Note that this class also has the Properties of its base classes. The direct base class is mimo::MIMOChannel ; direct link to its propertylist should be propertylist_MIMOChannel(). The list below usually includes the properties that have been inherited from the base classes; the properties which belong only to this class can be found at the end of this list.

snr
<string>, default "" -- The name of the snr loop variable in this simulation.

channel_refresh
<string>, default "" -- The name of the refresh loop variable in this simulation.

nr_tx
<unsigned>, default "" -- The number of transmit antennas

nr_rx
<unsigned>, default "" -- The number of receive antennas

diagonal
<bool>, default "false" -- If true, then this channel has a diagonal channel matrix i.e. it is not a MIMO channel. However, it is unclear whether the SNR is correct or whether the SNR might be offset by the matrix size. This property is probably only useful for initial testing of mimo algorithms.

5 properties in this class. The above properties have been inherited from the base class mimo::MIMOChannel .

num_path
<unsigned>, default "30" -- Important WSSUS parameter: The number of scattering paths in the WSSUS channel model. This number should be at least 30 or larger. If you choose this number smaller, you should consider setting the property path_ampl_random to true.

num_angles
<unsigned>, default "" -- Important MIMO parameter in WSSUS model: Number of distinct transmission and receive angles. These are drawn from a set of this specified size instead of taking it from a continuous random variable since it is commonly agreed that a continuous random variable would give a too optimistic result.

array_geometry
<enum>, default "linear" -- Geometry of the antenna array

path_ampl_random
<bool>, default "false" -- If true, then the amplitudes of the paths are random according to a Rayleigh distribution. Otherwise they are fixed (unity).

rice_factor_db
<double>, default "-1e6" -- The rice factor of this channel in dB. If unset (minus infinity), then there is no line of sight. The dB property overrides the scalar one.

rice_factor
<double>, default "0.0" -- The rice factor of this channel as a scalar. If unset (zero), then there is no line of sight.

normalization_mode
<enum>, default "standard" -- The normalization mode in this channel: standard, time, or freq. Additionally the channel will be normalized by the number of transmit antennas.

normalization_duration
<unsigned>, default "0" -- Only for normalization mode 'time' or 'frequency': If this is greater than one, then for normalization calculate the norm over several timesteps (= OFDM symbols) instead of the whole duration of the simulation. For a time-variant channel, this will result in some kind of time-variant normalization. Usually this is unused (and for time-invariant channels it doesnt make a difference anyway), but in highly time-variant channels you have to think about your normalization much more carefully.

freq_dist
<double>, default "312500" -- Only for normalization mode 'frequency': Distance of frequence samples when calculating the normalization factor in frequency normalization mode

num_freqs
<unsigned>, default "64" -- Only for normalization mode 'frequency': Number of frequency points/samples when calculating the normalization factor in frequency normalization mode

oversampling
<unsigned>, default "1" -- Only for frequency-domain transmission mode, or for calculating the correct delta_t: The oversampling rate used by the IDFT (IFFT)

num_carrier
<unsigned>, default "1" -- Only for frequency-domain transmission mode, or for calculating the correct delta_t: The number of subcarriers where the transfer function is calculated. If this is zero or one, the time-domain transmission will be used instead.

carrier_dist
<double>, default "0.0" -- Only for frequency-domain transmission mode, or for calculating the correct delta_t: The subcarrier distance on which the transfer function is calculated.

guard_time
<double>, default "0.0" -- Only for frequency-domain transmission mode, or for calculating the correct delta_t: The time duration of your guard interval in seconds.

antenna_coupling_ampl
<double>, default "0.0" -- For MIMO antenna coupling: The amplitude of antenna coupling as a scalar (not in dB). If zero, then this is unused.

coupling_phase_random
<bool>, default "false" -- For MIMO antenna coupling: If the antenna_coupling_ampl is greater than zero, then this property determines whether the phases of the coupling coefficients are zero or are random.

16 properties in this class.


Member Data Documentation

unsigned mimo::WSSUSChannel::num_paths [protected]
 

number of independent propagation paths

double mimo::WSSUSChannel::max_delay [protected]
 

maximal delay time

PathContainer mimo::WSSUSChannel::paths [protected]
 

all paths

AntennaArray* mimo::WSSUSChannel::array_geometry [protected]
 

Geometry of the antenna arrays.

double mimo::WSSUSChannel::delta_t [protected]
 

sampling time of the sequences to be transmitted

VectorTimeSignal::storage_type mimo::WSSUSChannel::prevsym [protected]
 

previously transmitted samples of one OFDM symbol

bool mimo::WSSUSChannel::firstSequence [protected]
 

Is true after initialization or refresh() and is set to false as soon as the first time signal samples are transmitted through this channel. I.e., this is true if and only if there are no previous signal samples stored in WSSUSChannel::prevsym.

MatrixFreqSignal::storage_type mimo::WSSUSChannel::cacheTransfer [mutable, protected]
 

int mimo::WSSUSChannel::cacheTime [mutable, protected]
 

Time for which the cached transfer function was valid.

bool mimo::WSSUSChannel::isTransferCacheValid [mutable, protected]
 

bool mimo::WSSUSChannel::timevariant [protected]
 


Generated on Tue Aug 9 14:44:22 2005 for mimolib by  doxygen 1.4.1