IA_CoMP
Interference Alignment and Coordinated Multipoint
IA1/IA1_super_realtime.cpp
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 }
 All Classes Functions Variables