four_multi
Multi-Antenna,Multi-Node,Multi-Band,Multi-Cell
core/simulator.hpp
00001 //
00002 // Copyright 2011-2013, Per Zetterberg, KTH Royal Institute of Technology
00003 //
00004 // This program is free software: you can redistribute it and/or modify
00005 // it under the terms of the GNU General Public License as published by
00006 // the Free Software Foundation, either version 3 of the License, or
00007 // (at your option) any later version.
00008 //
00009 // This program is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 // GNU General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 
00018 
00019 #ifndef SIMULATOR_HPP
00020 #define SIMULATOR_HPP
00021  
00022 #include <fstream> 
00023 #include <uhd/device.hpp>
00024 #include <uhd/utils/thread_priority.hpp>
00025 #include <uhd/utils/safe_main.hpp>
00026 #include <uhd/usrp/multi_usrp.hpp>
00027 #include <boost/program_options.hpp>
00028 #include <boost/format.hpp>
00029 #include <iostream>
00030 #include <complex>
00031 #include <uhd/types/clock_config.hpp>
00032 #include "gps.hpp"
00033 #include <itpp/itbase.h>
00034 
00035 using namespace itpp;
00036 
00038 class channel_model {
00039    public:
00054    virtual void sub_channel(uint32_t from_node_ix,uint32_t to_node_ix, 
00055                                  uint32_t from_antenna_ix, 
00056                             uint32_t to_antenna_ix, double freq_tx,
00057                             double freq_rx,
00058 double time, double gain_tx, double gain_rx, 
00059                                  std::complex<short int> const* signal_in, std::  complex<short int>* signal_out,  uint32_t number_of_samples)=0;
00065   virtual void add_noise(double gain_rx, 
00066         std::complex<short int>* signal, 
00067                          uint32_t number_of_samples)=0;
00068 };
00069 
00070 
00071 
00077 class from_file : public channel_model {
00078    public:  
00090    from_file(std::string directory_name="/usr/local/meas_data/");
00091   
00092    virtual void sub_channel(uint32_t from_node_ix,uint32_t to_node_ix, 
00093                          uint32_t from_antenna_ix, uint32_t to_antenna_ix,
00094         double freq_tx, double freq_rx,                  
00095                                  double time, double gain_tx, double gain_rx, 
00096                   std::complex<short int> const* signal_in, std::complex<short int>* signal_out,uint32_t number_of_samples);
00097   
00098   virtual void add_noise(double gain_rx, 
00099                          std::complex<short int>* signal, uint32_t number_of_samples){};
00100 
00101   static const int unsigned max_num_nodes=10;
00102   std::string raw_data_dir;
00103   static const int unsigned max_num_ant=20;
00104   itpp::mat old_time[max_num_nodes][max_num_nodes];
00105   itpp::imat frame_ix[max_num_nodes][max_num_nodes];
00106 
00107 };
00108 
00109 
00116 class OFDM_channel_from_file : public channel_model {
00117    public:  
00133    OFDM_channel_from_file(std::string filename,
00134                           ivec num_ant,int Nfft,int Nc, 
00135                           ivec ix_all ,int tx_start_sample, int rx_start_sample,
00136                           double signal_scaling, double EVM=0, double EVM_RX=0,
00137                           double CPE=0);
00138   
00139   void reset(void);
00140 
00141   virtual void sub_channel(uint32_t from_node_ix,uint32_t to_node_ix, 
00142                          uint32_t from_antenna_ix, uint32_t to_antenna_ix,
00143         double freq_tx, double freq_rx,                  
00144                                  double time, double gain_tx, double gain_rx, 
00145                   std::complex<short int> const* signal_in, std::complex<short int>* signal_out,uint32_t number_of_samples);
00146   
00147   virtual void add_noise(double gain_rx, 
00148                          std::complex<short int>* signal, uint32_t number_of_samples);
00149 
00150 
00151   private:
00152   std::string d_filename;
00153   ivec d_num_ant;
00154   int d_num_nodes;
00155   int d_Nfft;
00156   int d_Nc;
00157   int d_tx_start_sample;
00158   int d_rx_start_sample;
00159   ivec d_ix_all;
00160   double d_signal_scaling;
00161   double d_EVM, d_CPE, d_EVM_RX;
00162   static const int max_num_nodes=10;
00163   static const int unsigned max_num_ant=20;
00164   int counter;
00165   mat rand_cpe;//(max_num_ant,max_num_nodes);
00166 
00167   int d_frame_ix;
00168   double t_old;
00169   void load_file(std::string filename);
00170 
00171   public:
00172   cmat H[max_num_nodes][max_num_nodes][max_num_ant];
00173   double scaling_noise;
00174 };
00175 
00176 
00177 
00178 
00179 
00195 class block_fading : public channel_model {
00196    public:
00197 
00198    block_fading(void);
00199   
00200    virtual void sub_channel(uint32_t from_node_ix,uint32_t to_node_ix, 
00201                          uint32_t from_antenna_ix, uint32_t to_antenna_ix,
00202                             double freq_tx,double freq_rx, 
00203                                  double time, double gain_tx, double gain_rx, 
00204                   std::complex<short int> const* signal_in, std::complex<short int>* signal_out,uint32_t number_of_samples);
00205   
00206   virtual void add_noise(double gain_rx, 
00207         std::complex<short int>* signal, uint32_t number_of_samples);
00208 
00209   virtual void reset(void);
00210 
00211   static const int unsigned max_num_ant=20;
00212   static const int unsigned max_num_nodes=10;
00213   static const int unsigned max_num_taps=10;
00214 
00215   itpp::cmat old_h[max_num_nodes][max_num_nodes][max_num_taps];
00216   itpp::mat old_time[max_num_nodes][max_num_nodes];
00217 
00218 
00219   // Additional parameters that can be tuned by the user
00223   double scaling_signal;
00227   double path_gain[max_num_nodes][max_num_nodes];
00229   double scaling_noise;
00234   double forgetting_factor;
00237   bool is_awgn;
00240   bool is_diagonal;
00245   uint32_t num_of_taps;
00248   unsigned int seed;
00249 };
00250 
00251 
00252 
00253 #endif
 All Classes Functions Variables