![]() |
four_multi
Multi-Antenna,Multi-Node,Multi-Band,Multi-Cell
|
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