00001
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef EQUALIZER_H
00030 #define EQUALIZER_H
00031
00032 #include <basicdevice.h>
00033 #include <phbib.h>
00034 #include <signals.h>
00035 #include "matrixseq.h"
00036 #include "arith.h"
00037
00038 namespace mimo {
00039
00050 class Equalizer : public simth::Device
00051 {
00052 protected:
00053 Equalizer(int deviceID, DeviceSystemIntf* system,
00054 const simth::PropertyList& pl,
00055 size_t dim_in_, size_t dim_out_);
00056 const size_t dim_in;
00057 const size_t dim_out;
00058 const size_t iports;
00059
00060
00061 void assert_connections() const;
00062 void assert_vector_dim_out(const cs::CVector &testvec,
00063 const std::string& which = "output vector")
00064 const;
00065 public:
00066 virtual void updateInputLengths();
00067 virtual void updateOutputLengths();
00068
00069 void print(std::ostream &os) const;
00070
00071 static void init(const std::string& fileName,
00072 Device** dev,
00073 DeviceSystemIntf* sysPtr,
00074 int ID,
00075 const std::string& regionQualifier);
00076 };
00077
00099 class EqualizerZF : public Equalizer
00100 {
00101 public:
00102 EqualizerZF(int deviceID, DeviceSystemIntf* system,
00103 const simth::PropertyList& pl,
00104 size_t dim_in, size_t dim_out);
00105
00106 void process();
00107
00111 static void calcZF(const CVectorSeq& received_signal,
00112 const MatrixFreqSignal& channelestim,
00113 CVectorSeq & equalized_signal,
00114 CVectorSeq *softout_information);
00115 };
00116
00117
00139 class EqualizerMMSE : public Equalizer
00140 {
00141 private:
00142 double noise;
00143
00144 public:
00145 EqualizerMMSE(int deviceID, DeviceSystemIntf* system,
00146 const simth::PropertyList& pl,
00147 size_t dim_in, size_t dim_out);
00148
00152 void setSNR(double snr);
00153 void setNoisePower(double n);
00154
00155 void process();
00156 static void calcMMSE(const CVectorSeq& received_signal,
00157 const MatrixFreqSignal& channelestim,
00158 CVectorSeq & equalized_signal,
00159 double noise_power,
00160 CVectorSeq *softout_information);
00161 };
00162
00183 class EqualizerMRC : public Equalizer
00184 {
00185 public:
00186 EqualizerMRC(int deviceID, DeviceSystemIntf* system,
00187 const simth::PropertyList& pl,
00188 size_t dim_in, size_t dim_out);
00189
00190 void process();
00191 };
00192
00193
00204 class EqualizerMRCSwitch : public Equalizer
00205 {
00206 public:
00207 EqualizerMRCSwitch(int deviceID, DeviceSystemIntf* system,
00208 const simth::PropertyList& pl,
00209 size_t dim_in, size_t dim_out);
00210
00211 void process();
00212 };
00213
00214 }
00215
00216 #endif