![]() |
User Manual, Developers Guide and API Documentation |
![]() |
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
1.5.5