![]() |
IA_CoMP
Interference Alignment and Coordinated Multipoint
|
00001 // 00002 // Copyright 2012 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 #include <fstream> 00020 #include <uhd/utils/thread_priority.hpp> 00021 #include <uhd/utils/safe_main.hpp> 00022 #include <uhd/usrp/multi_usrp.hpp> 00023 #include <boost/program_options.hpp> 00024 #include <boost/format.hpp> 00025 #include <iostream> 00026 #include <uhd/types/clock_config.hpp> 00027 #include <itpp/itbase.h> 00028 #include <four_multi/get_usrp2_ip_addr.hpp> 00029 #include <itpp/stat/misc_stat.h> 00030 #include "IA1_node.hpp" 00031 #include <iostream> 00032 #include <four_multi/super_node.hpp> 00033 00034 00035 namespace po = boost::program_options; 00036 using namespace itpp; 00037 using namespace std; 00038 00039 00040 00041 00042 int UHD_SAFE_MAIN(int argc, char *argv[]){ 00043 00044 00045 std::vector<four_multi_node*> all_my_nodes1, all_my_nodes2; 00046 std::vector<four_multi_node*> all_my_nodes3, all_my_nodes4; 00047 00048 00049 #if 1 00050 if (!(uhd::set_thread_priority_safe(1,true))) { 00051 std::cout << "Problem setting thread priority" << std::endl; 00052 return 1; 00053 }; 00054 #endif 00055 00056 00057 00058 //variables to be set by po 00059 uint32_t super_node_ix, skip_ant; 00060 std::vector<string> IP_addresses; 00061 string IP_addresses_input_string; 00062 uint32_t start_time, no_runs; 00063 std::string dev_name, freq_str; 00064 itpp::vec freqs; 00065 std::string gains_str; 00066 itpp::vec gains; // IT++ class 00067 00068 //setup the program options 00069 po::options_description desc("Allowed options"); 00070 desc.add_options() 00071 ("help", "help message") 00072 ("super_node_ix", po::value<uint32_t>(&super_node_ix)->default_value(0), "node index") 00073 ("IP_addresses",po::value<string>(&IP_addresses_input_string)->default_value(""),"Backbone IP addresses of all nodes in order (space separated)") 00074 ("start_time",po::value<uint32_t>(&start_time)->default_value(0), "Start time (GPS ref) h*3600+m*60+s") 00075 ("dev_name",po::value<std::string>(&dev_name)->default_value("/dev/ttyUSB0"), "Name of GPS device") 00076 ("s",po::value<uint32_t>(&skip_ant)->default_value(0), "skip_ant") 00077 ("freq",po::value<std::string>(&freq_str)->default_value("70e6 70e6 70e6 70e6 70e6 70e6"), "frequencies of super_node_ix=1") 00078 ("no_runs",po::value<uint32_t>(&no_runs)->default_value(1), "number of runs") 00079 ("tx_gains",po::value<std::string>(&gains_str)->default_value("0 0 0 0 0 0"), 00080 "set the transmitter gains") 00081 ; 00082 00083 00084 00085 po::variables_map vm; 00086 po::store(po::parse_command_line(argc, argv, desc), vm); 00087 po::notify(vm); 00088 00089 if (vm.count("help")){ 00090 std::cout << boost::format("Ping pong %s") % desc << std::endl; 00091 return ~0; 00092 } 00093 00094 IP_addresses_input_string="130.237.43.227 130.237.43.227 130.237.43.227"; 00095 00096 std::istringstream iss(IP_addresses_input_string); 00097 for (uint32_t i1=0;i1<20;i1++) { 00098 std::string subs; 00099 iss >> subs; 00100 if (subs.length()==0) break; 00101 IP_addresses.push_back(subs); 00102 }; 00103 00104 gains=gains_str.c_str(); 00105 00106 double freq; 00107 std::vector<double> override_frequency; 00108 std::vector<double> override_gain_rx; 00109 std::vector<double> override_gain_tx; 00110 00111 if (super_node_ix==0) { 00112 freq=2490e6; 00113 for (int i1=0;i1<6;i1++) { 00114 override_frequency.push_back(freq); 00115 }; 00116 00117 } else { 00118 freq=70e6; 00119 freqs=freq_str.c_str(); 00120 override_frequency.push_back(freqs(0)); 00121 override_frequency.push_back(freqs(0)); 00122 override_frequency.push_back(freqs(1)); 00123 override_frequency.push_back(freqs(1)); 00124 override_frequency.push_back(freqs(2)); 00125 override_frequency.push_back(freqs(2)); 00126 00127 }; 00128 00129 for (int i1=0;i1<6;i1++) { 00130 override_gain_rx.push_back(0); 00131 override_gain_tx.push_back(gains(i1)); 00132 }; 00133 //std::cout << "override_gain_tx="; 00134 for (int i1=0;i1<6;i1++) { 00135 std::cout << override_gain_tx[i1] << ","; 00136 }; 00137 std::cout << std::endl; 00138 00139 00140 00141 00142 double offset_time=1.0; 00143 00144 if (super_node_ix==0) { 00145 00146 // scenario 1: IA 00147 IA1_node node0_IA(2,0,0,0,0,freq,true,IP_addresses,true,60,start_time, 00148 false,1); 00149 IA1_node node1_IA(2,0,0,0,1,freq,true,IP_addresses,true,60,start_time, 00150 false,1); 00151 IA1_node node2_IA(2,0,0,0,2,freq,true,IP_addresses,true,60,start_time, 00152 false,1); 00153 00154 00155 all_my_nodes1.push_back(&node0_IA); 00156 all_my_nodes1.push_back(&node1_IA); 00157 all_my_nodes1.push_back(&node2_IA); 00158 00159 // Scenario 2: CoMP 00160 00161 IA1_node node0_CoMP(6,0,0,0,0,freq,true,IP_addresses,true, 00162 60,start_time,false,2); 00163 node0_CoMP.offset_time=offset_time; 00164 all_my_nodes2.push_back(&node0_CoMP); 00165 00166 00167 // scenario 3: MIMO 00168 IA1_node node0_MIMO(2,0,0,0,0,freq,true,IP_addresses,true,60,start_time, 00169 false,3); 00170 IA1_node node1_MIMO(2,0,0,0,1,freq,true,IP_addresses,true,60,start_time, 00171 false,3); 00172 IA1_node node2_MIMO(2,0,0,0,2,freq,true,IP_addresses,true,60,start_time, 00173 false,3); 00174 00175 all_my_nodes3.push_back(&node0_MIMO); 00176 all_my_nodes3.push_back(&node1_MIMO); 00177 all_my_nodes3.push_back(&node2_MIMO); 00178 00179 00180 // First run is with IA 00181 00182 00183 super_node my_super_node(6,0,true,false,skip_ant, 00184 &all_my_nodes1, 00185 override_gain_rx, 00186 override_gain_tx, 00187 override_frequency); 00188 00189 usleep(0.1); 00190 my_super_node.wait_time_for_transmissions_to_finish=0.1; 00191 00192 00193 for (uint32_t run_ix=0;run_ix<no_runs;run_ix++) { 00194 00195 my_super_node.set_time_on_pps=true; 00196 my_super_node.set_nodes(&all_my_nodes1); 00197 my_super_node.run(dev_name.c_str(),start_time); 00198 00199 // Second run with CoMP 00200 my_super_node.set_nodes(&all_my_nodes2); 00201 my_super_node.set_time_on_pps=false; 00202 my_super_node.skip_hw_set_during_init=true; 00203 my_super_node.run(); 00204 00205 // Third run with MIMO1 00206 node0_MIMO.MIMO_all_active=false; 00207 node1_MIMO.MIMO_all_active=false; 00208 node2_MIMO.MIMO_all_active=false; 00209 node0_MIMO.MIMO_active_tx_node_tx=0; 00210 node1_MIMO.MIMO_active_tx_node_tx=0; 00211 node2_MIMO.MIMO_active_tx_node_tx=0; 00212 node0_MIMO.offset_time=2*offset_time; 00213 node1_MIMO.offset_time=2*offset_time; 00214 node2_MIMO.offset_time=2*offset_time; 00215 my_super_node.set_nodes(&all_my_nodes3); 00216 my_super_node.run(); 00217 00218 // Fourth run with MIMO2 00219 node0_MIMO.offset_time=3*offset_time; 00220 node1_MIMO.offset_time=3*offset_time; 00221 node2_MIMO.offset_time=3*offset_time; 00222 node0_MIMO.MIMO_active_tx_node_tx=1; 00223 node1_MIMO.MIMO_active_tx_node_tx=1; 00224 node2_MIMO.MIMO_active_tx_node_tx=1; 00225 my_super_node.run(); 00226 00227 // Fifth run with MIMO3 00228 node0_MIMO.offset_time=4*offset_time; 00229 node1_MIMO.offset_time=4*offset_time; 00230 node2_MIMO.offset_time=4*offset_time; 00231 node0_MIMO.MIMO_active_tx_node_tx=2; 00232 node1_MIMO.MIMO_active_tx_node_tx=2; 00233 node2_MIMO.MIMO_active_tx_node_tx=2; 00234 my_super_node.run(); 00235 00236 // Sixth run with MIMO4 00237 node0_MIMO.offset_time=5*offset_time; 00238 node1_MIMO.offset_time=5*offset_time; 00239 node2_MIMO.offset_time=5*offset_time; 00240 node0_MIMO.MIMO_all_active=true; 00241 node1_MIMO.MIMO_all_active=true; 00242 node2_MIMO.MIMO_all_active=true; 00243 my_super_node.run(); 00244 00245 start_time+=60; 00246 00247 }; 00248 00249 00250 }; 00251 if (super_node_ix==1) { 00252 00253 vec MIMO1_BER, MIMO2_BER, MIMO3_BER; 00254 00255 // Scenario 1: IA 00256 IA1_node node0_IA(2,0,0,0,3,freqs(0),true,IP_addresses,true,60,start_time, 00257 false,1); 00258 IA1_node node1_IA(2,0,0,0,4,freqs(1),true,IP_addresses,true,60,start_time, 00259 false,1); 00260 IA1_node node2_IA(2,0,0,0,5,freqs(2),true,IP_addresses,true,60,start_time, 00261 false,1); 00262 00263 00264 node0_IA.save_raw_input_on_file(5,"/usr/local/meas_data/IA_"); 00265 node1_IA.save_raw_input_on_file(5,"/usr/local/meas_data/IA_"); 00266 node2_IA.save_raw_input_on_file(5,"/usr/local/meas_data/IA_"); 00267 00268 all_my_nodes1.push_back(&node0_IA); 00269 all_my_nodes1.push_back(&node1_IA); 00270 all_my_nodes1.push_back(&node2_IA); 00271 00272 // Scenario 2: CoMP 00273 IA1_node node0_CoMP(2,0,0,0,1,freq,true,IP_addresses,true, 00274 60,start_time,false,2); 00275 IA1_node node1_CoMP(2,0,0,0,2,freq,true,IP_addresses,true, 00276 60,start_time,false,2); 00277 IA1_node node2_CoMP(2,0,0,0,3,freq,true,IP_addresses,true, 00278 60,start_time,false,2); 00279 node0_CoMP.offset_time=offset_time; 00280 node1_CoMP.offset_time=offset_time; 00281 node2_CoMP.offset_time=offset_time; 00282 00283 00284 node0_CoMP.save_raw_input_on_file(5,"/usr/local/meas_data/CoMP_"); 00285 node1_CoMP.save_raw_input_on_file(5,"/usr/local/meas_data/CoMP_"); 00286 node2_CoMP.save_raw_input_on_file(5,"/usr/local/meas_data/CoMP_"); 00287 00288 all_my_nodes2.push_back(&node0_CoMP); 00289 all_my_nodes2.push_back(&node1_CoMP); 00290 all_my_nodes2.push_back(&node2_CoMP); 00291 00292 00293 // Scenario 3: MIMO 00294 IA1_node node0_MIMO(2,0,0,0,3,freq,true,IP_addresses,true, 00295 60,start_time,false,3); 00296 IA1_node node1_MIMO(2,0,0,0,4,freq,true,IP_addresses,true, 00297 60,start_time,false,3); 00298 IA1_node node2_MIMO(2,0,0,0,5,freq,true,IP_addresses,true, 00299 60,start_time,false,3); 00300 00301 00302 all_my_nodes3.push_back(&node0_MIMO); 00303 all_my_nodes3.push_back(&node1_MIMO); 00304 all_my_nodes3.push_back(&node2_MIMO); 00305 00306 00307 // First run is with IA 00308 //super_node my_super_node(6,0,true,false,0,IP_addresses,0,&all_my_nodes1); 00309 00310 super_node my_super_node(6,0,true,false,0,&all_my_nodes1); 00311 00312 00313 my_super_node.wait_time_for_transmissions_to_finish=0.1; 00314 00315 00316 for (uint32_t run_ix=0;run_ix<no_runs;run_ix++) { 00317 00318 gps_wait_until(dev_name.c_str(),start_time); 00319 00320 my_super_node.set_nodes(&all_my_nodes1); 00321 my_super_node.set_time_on_pps=true; 00322 my_super_node.run(); 00323 00324 cout << "node0_IA.BER=" << node0_IA.BERraw << endl; 00325 cout << "node1_IA.BER=" << node1_IA.BERraw << endl; 00326 cout << "node2_IA.BER=" << node2_IA.BERraw << endl; 00327 00328 // Second run with CoMP 00329 my_super_node.set_nodes(&all_my_nodes2); 00330 my_super_node.set_time_on_pps=false; 00331 my_super_node.skip_hw_set_during_init=true; 00332 my_super_node.run(); 00333 00334 cout << "node0_CoMP.BER=" << node0_CoMP.BERraw << endl; 00335 cout << "node1_CoMP.BER=" << node1_CoMP.BERraw << endl; 00336 cout << "node2_CoMP.BER=" << node2_CoMP.BERraw << endl; 00337 00338 00339 // Third run with MIMO-1 00340 00341 node0_MIMO.offset_time=2*offset_time; 00342 node1_MIMO.offset_time=2*offset_time; 00343 node2_MIMO.offset_time=2*offset_time; 00344 node0_MIMO.MIMO_active_tx_node_tx=0; 00345 node1_MIMO.MIMO_active_tx_node_tx=0; 00346 node2_MIMO.MIMO_active_tx_node_tx=0; 00347 00348 node0_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO1_"); 00349 node1_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO1_"); 00350 node2_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO1_"); 00351 00352 00353 my_super_node.set_nodes(&all_my_nodes3); 00354 my_super_node.run(); 00355 00356 cout << "node0_MIMO.BER=" << node0_MIMO.BERraw << endl; 00357 cout << "node1_MIMO.BER=" << node1_MIMO.BERraw << endl; 00358 cout << "node2_MIMO.BER=" << node2_MIMO.BERraw << endl; 00359 00360 MIMO1_BER=node0_MIMO.BERraw; 00361 00362 // Fourth run with MIMO-2 00363 00364 node0_MIMO.offset_time=3*offset_time; 00365 node1_MIMO.offset_time=3*offset_time; 00366 node2_MIMO.offset_time=3*offset_time; 00367 node0_MIMO.MIMO_active_tx_node_tx=1; 00368 node1_MIMO.MIMO_active_tx_node_tx=1; 00369 node2_MIMO.MIMO_active_tx_node_tx=1; 00370 00371 node0_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO2_"); 00372 node1_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO2_"); 00373 node2_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO2_"); 00374 00375 my_super_node.run(); 00376 00377 cout << "node0_MIMO.BER=" << node0_MIMO.BERraw << endl; 00378 cout << "node1_MIMO.BER=" << node1_MIMO.BERraw << endl; 00379 cout << "node2_MIMO.BER=" << node2_MIMO.BERraw << endl; 00380 MIMO2_BER=node1_MIMO.BERraw; 00381 00382 // Fifth run with MIMO-3 00383 00384 node0_MIMO.offset_time=4*offset_time; 00385 node1_MIMO.offset_time=4*offset_time; 00386 node2_MIMO.offset_time=4*offset_time; 00387 node0_MIMO.MIMO_active_tx_node_tx=2; 00388 node1_MIMO.MIMO_active_tx_node_tx=2; 00389 node2_MIMO.MIMO_active_tx_node_tx=2; 00390 00391 node0_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO3_"); 00392 node1_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO3_"); 00393 node2_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO3_"); 00394 00395 my_super_node.run(); 00396 MIMO3_BER=node2_MIMO.BERraw; 00397 00398 // Sixth run with MIMO-4 00399 00400 node0_MIMO.offset_time=5*offset_time; 00401 node1_MIMO.offset_time=5*offset_time; 00402 node2_MIMO.offset_time=5*offset_time; 00403 node0_MIMO.MIMO_all_active=true; 00404 node1_MIMO.MIMO_all_active=true; 00405 node2_MIMO.MIMO_all_active=true; 00406 node0_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO4_"); 00407 node1_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO4_"); 00408 node2_MIMO.save_raw_input_on_file(5,"/usr/local/meas_data/MIMO4_"); 00409 00410 my_super_node.run(); 00411 00412 cout << "node0_MIMO.BER=" << MIMO1_BER.get(4,-1) << endl; 00413 cout << "node1_MIMO.BER=" << MIMO2_BER.get(4,-1) << endl; 00414 cout << "node2_MIMO.BER=" << MIMO3_BER.get(4,-1) << endl; 00415 cout << "node0_MIMO5.BER=" << node0_MIMO.BERraw.get(0,-1) << endl; 00416 00417 cout << "node0_IA.BER=" << node0_IA.BERraw.get(2,-1) << endl; 00418 cout << "node1_IA.BER=" << node1_IA.BERraw.get(2,-1) << endl; 00419 cout << "node2_IA.BER=" << node2_IA.BERraw.get(2,-1) << endl; 00420 00421 cout << "node0_CoMP.BER=" << node0_CoMP.BERraw.get(2,-1) << endl; 00422 cout << "node1_CoMP.BER=" << node1_CoMP.BERraw.get(2,-1) << endl; 00423 cout << "node2_CoMP.BER=" << node2_CoMP.BERraw.get(2,-1) << endl; 00424 00425 start_time+=60; 00426 00427 }; 00428 00429 00430 #if 0 00431 itpp::it_file d1; 00432 d1.open("const.it"); 00433 cvec c; 00434 c=(node0_CoMP.ai[0]).ConstellationStorage; 00435 d1<< itpp::Name("const0") << c; 00436 d1<< itpp::Name("w0") << node0_CoMP.waveform_rx; 00437 //d1<< itpp::Name("soft_bit0") << node0.soft_bit; 00438 00439 c=node1_CoMP.ai[0].ConstellationStorage; 00440 d1<< itpp::Name("const1") << c; 00441 d1<< itpp::Name("w1") << node1_CoMP.waveform_rx; 00442 //d1<<itpp::Name("transmitted1") << node1.transmitted; 00443 //d1<< itpp::Name("soft_bit1") << node1.soft_bit; 00444 00445 00446 c=node2_CoMP.ai[0].ConstellationStorage; 00447 d1<< itpp::Name("const2") << c; 00448 d1<< itpp::Name("w2") << node2_CoMP.waveform_rx; 00449 //d1<<itpp::Name("transmitted2") << node2.transmitted; 00450 //d1<< itpp::Name("soft_bit2") << node2.soft_bit; 00451 00452 // 00453 //d1<<itpp::Name("waveform_rx") << node0.waveform_rx; 00454 d1.close(); 00455 #endif 00456 00457 }; 00458 00459 00460 cout << "The end \n"; 00461 return 0; 00462 00463 00464 00465 }