User Manual, Developers Guide and API Documentation

SignalAveragingStrategy.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002  * This file is part of openWNS (open Wireless Network Simulator)
00003  * _____________________________________________________________________________
00004  *
00005  * Copyright (C) 2004-2007
00006  * Chair of Communication Networks (ComNets)
00007  * Kopernikusstr. 5, D-52074 Aachen, Germany
00008  * phone: ++49-241-80-27910,
00009  * fax: ++49-241-80-22242
00010  * email: info@openwns.org
00011  * www: http://www.openwns.org
00012  * _____________________________________________________________________________
00013  *
00014  * openWNS is free software; you can redistribute it and/or modify it under the
00015  * terms of the GNU Lesser General Public License version 2 as published by the
00016  * Free Software Foundation;
00017  *
00018  * openWNS is distributed in the hope that it will be useful, but WITHOUT ANY
00019  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
00020  * A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
00021  * details.
00022  *
00023  * You should have received a copy of the GNU Lesser General Public License
00024  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00025  *
00026  ******************************************************************************/
00027 
00028 #include <RISE/receiver/SignalAveragingStrategy.hpp>
00029 
00030 using namespace rise;
00031 using namespace rise::receiver;
00032 
00033 NoTransmissionAveraging::NoTransmissionAveraging() :
00034     carrier(),
00035     interference(),
00036     calledEOT(),
00037     lastAveraging(-1.0)
00038 {}
00039 
00040 NoTransmissionAveraging::~NoTransmissionAveraging()
00041 {
00042     removeAll();
00043 }
00044 
00045 void NoTransmissionAveraging::signalLevelsChange()
00046 {
00047     if(lastAveraging < wns::simulator::getEventScheduler()->getTime()) {
00048         lastAveraging = wns::simulator::getEventScheduler()->getTime();
00049         CurrentSignalMap::iterator itrEnd;
00050         // update the carriers
00051         itrEnd = carrier.end();
00052         for(CurrentSignalMap::iterator itr = carrier.begin(); itr != itrEnd; ++itr) {
00053             // As long as transmission is active
00054             if(itr->second.first->getIsStart()) {
00055                 itr->second.second = getRxPower(itr->second.first);
00056             }
00057         }
00058 
00059         // update the interference
00060         itrEnd = interference.end();
00061         for(CurrentSignalMap::iterator itr = interference.begin(); itr != itrEnd; ++itr) {
00062             // As long as transmission is active
00063             if(itr->second.first->getIsStart()) {
00064                 itr->second.second = getInterference(itr->second.first);
00065             }
00066         }
00067     }
00068 }
00069 
00070 void NoTransmissionAveraging::endOfTransmission(const TransmissionObjectPtr& t)
00071 {
00072     assure(carrier.find(t->getBirthmark()) != carrier.end(), "Not in map carrier!");
00073     assure(interference.find(t->getBirthmark()) != interference.end(), "Not in map interference!");
00074     assure(calledEOT.find(t->getBirthmark()) != calledEOT.end(), "Not in map calledEOT!");
00075     assure(calledEOT[t->getBirthmark()].second = true, "Intentionally in assure statement!");
00076     carrier[t->getBirthmark()].second = getRxPower(t);
00077     interference[t->getBirthmark()].second = getInterference(t);
00078 }
00079 
00080 void NoTransmissionAveraging::add(const TransmissionObjectPtr& t)
00081 {
00082     assure(carrier.find(t->getBirthmark()) == carrier.end(), "Already added to carrier!");
00083     assure(interference.find(t->getBirthmark()) == interference.end(), "Already added to interference!");
00084     assure(calledEOT.find(t->getBirthmark()) == calledEOT.end(), "Already added to calledEOT!");
00085     assure((calledEOT[t->getBirthmark()].second = false) || true, "Intentionally in assure statement!");
00086     carrier[t->getBirthmark()].first = t;
00087     interference[t->getBirthmark()].first = t;
00088 }
00089 
00090 void NoTransmissionAveraging::remove(const TransmissionObjectPtr& t)
00091 {
00092     assure(carrier.find(t->getBirthmark()) != carrier.end(), "Not in map carrier!");
00093     assure(interference.find(t->getBirthmark()) != interference.end(), "Not in map interference!");
00094     assure(calledEOT.find(t->getBirthmark()) != calledEOT.end(), "Not in map calledEOT!");
00095     assure(calledEOT.erase(t->getBirthmark()), "Intentionally in assure statement!");
00096     carrier.erase(t->getBirthmark());
00097     interference.erase(t->getBirthmark());
00098 }
00099 
00100 void NoTransmissionAveraging::removeAll()
00101 {
00102     lastAveraging = -1.0;
00103 
00104     carrier.clear();
00105     interference.clear();
00106     calledEOT.clear();
00107 }
00108 
00109 wns::Power NoTransmissionAveraging::getAveragedRxPower(const TransmissionObjectPtr& t)
00110 {
00111     assure(carrier.find(t->getBirthmark()) != carrier.end(), "Not in map carrier!");
00112     assure(interference.find(t->getBirthmark()) != interference.end(), "Not in map interference!");
00113     assure(calledEOT.find(t->getBirthmark()) != calledEOT.end(), "Not in map calledEOT!");
00114     assure( t->getIsStart() || calledEOT[t->getBirthmark()].second, "Transmission is not active any longer, but endOfTransmission has not been called)");
00115 
00116     signalLevelsChange();
00117     return carrier[t->getBirthmark()].second;
00118 }
00119 
00120 wns::Power NoTransmissionAveraging::getAveragedInterference(const TransmissionObjectPtr& t)
00121 {
00122     assure(carrier.find(t->getBirthmark()) != carrier.end(), "Not in map carrier!");
00123     assure(interference.find(t->getBirthmark()) != interference.end(), "Not in map interference!");
00124     assure(calledEOT.find(t->getBirthmark()) != calledEOT.end(), "Not in map calledEOT!");
00125     assure( t->getIsStart() || calledEOT[t->getBirthmark()].second, "Transmission is not active any longer, but endOfTransmission has not been called)");
00126 
00127     signalLevelsChange();
00128     return interference[t->getBirthmark()].second;
00129 }
00130 
00131 wns::Ratio NoTransmissionAveraging::getAveragedCIR(const TransmissionObjectPtr& t)
00132 {
00133     return getAveragedRxPower(t)/getAveragedInterference(t);
00134 }
00135 
00136 TimeWeightedTransmissionAveraging::TimeWeightedTransmissionAveraging() :
00137     carrier(),
00138     interference(),
00139     calledEOT(),
00140     lastAveraging(-1.0)
00141 {
00142 }
00143 
00144 TimeWeightedTransmissionAveraging::~TimeWeightedTransmissionAveraging()
00145 {
00146     removeAll();
00147 }
00148 
00149 void TimeWeightedTransmissionAveraging::signalLevelsChange()
00150 {
00151     if(lastAveraging < wns::simulator::getEventScheduler()->getTime()) {
00152         lastAveraging = wns::simulator::getEventScheduler()->getTime();
00153         AveragedSignalMap::iterator itrEnd;
00154         // update the carriers
00155         itrEnd = carrier.end();
00156         for(AveragedSignalMap::iterator itr = carrier.begin(); itr != itrEnd; ++itr) {
00157             // As long as transmission is active
00158             if(itr->second.first->getIsStart()) {
00159                 itr->second.second.put(getRxPower(itr->second.first));
00160             }
00161         }
00162 
00163         // update the interference
00164         itrEnd = interference.end();
00165         for(AveragedSignalMap::iterator itr = interference.begin(); itr != itrEnd; ++itr) {
00166             // As long as transmission is active
00167             if(itr->second.first->getIsStart()) {
00168                 itr->second.second.put(getInterference(itr->second.first));
00169             }
00170         }
00171     }
00172 }
00173 
00174 void TimeWeightedTransmissionAveraging::endOfTransmission(const TransmissionObjectPtr& t)
00175 {
00176     assure(carrier.find(t->getBirthmark()) != carrier.end(), "Not in map carrier!");
00177     assure(interference.find(t->getBirthmark()) != interference.end(), "Not in map interference!");
00178     assure(calledEOT.find(t->getBirthmark()) != calledEOT.end(), "Not in map calledEOT!");
00179     assure(calledEOT[t->getBirthmark()].second = true, "Intentionally in assure statement!");
00180     carrier[t->getBirthmark()].second.put(getRxPower(t));
00181     interference[t->getBirthmark()].second.put(getInterference(t));
00182 }
00183 
00184 void TimeWeightedTransmissionAveraging::add(const TransmissionObjectPtr& t)
00185 {
00186     assure(carrier.find(t->getBirthmark()) == carrier.end(), "Already added to carrier!");
00187     assure(interference.find(t->getBirthmark()) == interference.end(), "Already added to interference!");
00188     assure(calledEOT.find(t->getBirthmark()) == calledEOT.end(), "Already added to calledEOT!");
00189     assure((calledEOT[t->getBirthmark()].second = false) || true, "Intentionally in assure statement!");
00190     carrier[t->getBirthmark()].first = t;
00191     interference[t->getBirthmark()].first = t;
00192     SignalAverage& c = carrier[t->getBirthmark()].second;
00193     SignalAverage& i = interference[t->getBirthmark()].second;
00194     c.setClock(wns::simulator::getEventScheduler());
00195     i.setClock(wns::simulator::getEventScheduler());
00196     c.reset();
00197     i.reset();
00198 }
00199 
00200 void TimeWeightedTransmissionAveraging::remove(const TransmissionObjectPtr& t)
00201 {
00202     assure(carrier.find(t->getBirthmark()) != carrier.end(), "Not in map carrier!");
00203     assure(interference.find(t->getBirthmark()) != interference.end(), "Not in map interference!");
00204     assure(calledEOT.find(t->getBirthmark()) != calledEOT.end(), "Not in map calledEOT!");
00205     assure(calledEOT.erase(t->getBirthmark()), "Intentionally in assure statement!");
00206     carrier.erase(t->getBirthmark());
00207     interference.erase(t->getBirthmark());
00208 }
00209 
00210 void TimeWeightedTransmissionAveraging::removeAll()
00211 {
00212     lastAveraging = -1.0;
00213 
00214     carrier.clear();
00215     interference.clear();
00216     calledEOT.clear();
00217 }
00218 
00219 wns::Power TimeWeightedTransmissionAveraging::getAveragedRxPower(const TransmissionObjectPtr& t)
00220 {
00221     assure(carrier.find(t->getBirthmark()) != carrier.end(), "Not in map carrier!");
00222     assure(interference.find(t->getBirthmark()) != interference.end(), "Not in map interference!");
00223     assure(calledEOT.find(t->getBirthmark()) != calledEOT.end(), "Not in map calledEOT!");
00224     assure( t->getIsStart() || calledEOT[t->getBirthmark()].second, 
00225         "Transmission is not active any longer, but endOfTransmission has not been called)");
00226 
00227     // Call to do last averaging
00228     signalLevelsChange();
00229 
00230     assure(carrier[t->getBirthmark()].second.get() != wns::Power(), "Signal is 0 mW. This probably means you've just added this transmission for averaging and no time is elapsed so far. Mathematically this is correct. If you need the signal level call getRxPower(t)");
00231 
00232     return carrier[t->getBirthmark()].second.get();
00233 }
00234 
00235 wns::Power TimeWeightedTransmissionAveraging::getAveragedInterference(const TransmissionObjectPtr& t)
00236 {
00237     assure(carrier.find(t->getBirthmark()) != carrier.end(), "Not in map carrier!");
00238     assure(interference.find(t->getBirthmark()) != interference.end(), "Not in map interference!");
00239     assure(calledEOT.find(t->getBirthmark()) != calledEOT.end(), "Not in map calledEOT!");
00240     assure( t->getIsStart() || calledEOT[t->getBirthmark()].second, 
00241         "Transmission is not active any longer, but endOfTransmission has not been called)");
00242 
00243     // Call to do last averaging
00244     signalLevelsChange();
00245 
00246     assure(interference[t->getBirthmark()].second.get() != wns::Power(), "Interference is 0 dBm. This probably means you've just added this transmission for averaging and no time is elapsed so far. Mathematically this is correct. If you need the interference level call getInterference(t)");
00247 
00248     return interference[t->getBirthmark()].second.get();
00249 }
00250 
00251 wns::Ratio TimeWeightedTransmissionAveraging::getAveragedCIR(const TransmissionObjectPtr& t)
00252 {
00253     return getAveragedRxPower(t)/getAveragedInterference(t);
00254 }
00255 
00256 
00257 

Generated on Fri May 25 03:31:58 2012 for openWNS by  doxygen 1.5.5