![]() |
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 <APPLICATIONS/session/server/Video.hpp> 00029 #include <math.h> 00030 #include <WNS/distribution/Norm.hpp> 00031 #include <WNS/distribution/LogNorm.hpp> 00032 00033 using namespace applications::session::server; 00034 00035 STATIC_FACTORY_REGISTER_WITH_CREATOR(applications::session::server::Video, 00036 applications::session::Session, 00037 "server.Video", wns::PyConfigViewCreator); 00038 00039 Video::Video(const wns::pyconfig::View& _pyco) : 00040 Session(_pyco), 00041 j(0), 00042 idx(0), 00043 limit(1000), 00044 00045 kI(1), 00046 pI(0.0), 00047 nI(0.0), 00048 dI(1.0), 00049 meanI(0.0), 00050 varianceI(1.0), 00051 logNormValueI(0.0), 00052 yI(0.0), 00053 mI(0.0), 00054 sqrValueI(0.0), 00055 autocorrI(NULL), 00056 phiInew(NULL), 00057 phiIold(NULL), 00058 00059 kB(1), 00060 pB(0.0), 00061 nB(0.0), 00062 dB(1.0), 00063 meanB(0.0), 00064 varianceB(1.0), 00065 logNormValueB(0.0), 00066 yB(0.0), 00067 mB(0.0), 00068 sqrValueB(0.0), 00069 autocorrB(NULL), 00070 phiBnew(NULL), 00071 phiBold(NULL), 00072 00073 kP(1), 00074 pP(0.0), 00075 nP(0.0), 00076 dP(1.0), 00077 meanP(0.0), 00078 varianceP(1.0), 00079 logNormValueP(0.0), 00080 yP(0.0), 00081 mP(0.0), 00082 sqrValueP(0.0), 00083 autocorrP(NULL), 00084 phiPnew(NULL), 00085 phiPold(NULL), 00086 00087 mean(0.0), 00088 n(0), 00089 logNormDis(NULL), 00090 logNormDisI(NULL), 00091 logNormDisB(NULL), 00092 logNormDisP(NULL), 00093 logNormValue(0.0), 00094 normMean(0.0), 00095 normStd(0.0), 00096 projection(0.0), 00097 logNormVariance(0.0), 00098 value(0.0), 00099 00100 bFrameCounter(1), 00101 gopCounter(1), 00102 newGOP(true) 00103 { 00104 frameGeneratingProcess = _pyco.get<std::string>("frameGeneratingProcess"); 00105 00106 settlingTime = _pyco.get<wns::simulator::Time>("settlingTime"); 00107 00108 byteFlag = _pyco.get<bool>("params.byteFlag"); 00109 videoFrameRate = _pyco.get<int>("params.frameRate"); 00110 videoPacketIat = 1 / double(videoFrameRate); 00111 00112 MESSAGE_BEGIN(NORMAL, logger, m, "APPL: Starting new session with "); 00113 m << "videoFrameRate = " << videoFrameRate; 00114 m << ", videoPacketIat = " << videoPacketIat; 00115 MESSAGE_END(); 00116 00117 logMeanI = _pyco.get<double>("params.meanI"); 00118 logStdI = _pyco.get<double>("params.stdI"); 00119 hurstI = _pyco.get<double>("params.hurstI"); 00120 phiI = _pyco.get<double>("params.phiI"); 00121 thetaI = _pyco.get<double>("params.thetaI"); 00122 00123 logMeanP = _pyco.get<double>("params.meanP"); 00124 logStdP = _pyco.get<double>("params.stdP"); 00125 hurstP = _pyco.get<double>("params.hurstP"); 00126 phiP = _pyco.get<double>("params.phiP"); 00127 thetaP = _pyco.get<double>("params.thetaP"); 00128 00129 logMeanB = _pyco.get<double>("params.meanB"); 00130 logStdB = _pyco.get<double>("params.stdB"); 00131 hurstB = _pyco.get<double>("params.hurstB"); 00132 phiB = _pyco.get<double>("params.phiB"); 00133 thetaB = _pyco.get<double>("params.thetaB"); 00134 00135 state = idle; 00136 00137 /* only for probing */ 00138 sessionType = video; 00139 00140 packetFrom = "server.Video"; 00141 } 00142 00143 Video::~Video() 00144 { 00145 autocorrI.clear(); 00146 phiInew.clear(); 00147 phiIold.clear(); 00148 xI.clear(); 00149 00150 autocorrB.clear(); 00151 phiBnew.clear(); 00152 phiBold.clear(); 00153 xB.clear(); 00154 00155 autocorrP.clear(); 00156 phiPnew.clear(); 00157 phiPold.clear(); 00158 xP.clear(); 00159 } 00160 00161 void 00162 Video::onData(const wns::osi::PDUPtr& _pdu) 00163 { 00164 /* Request received. */ 00165 state = running; 00166 00167 assureType(_pdu.getPtr(), applications::session::PDU*); 00168 00169 receivedPacketNumber = static_cast<applications::session::PDU*>(_pdu.getPtr())->getPacketNumber(); 00170 00171 MESSAGE_SINGLE(NORMAL, logger, "APPL: receivedPacketNumber = " << receivedPacketNumber << "."); 00172 00173 applications::session::Session::incomingProbesCalculation(_pdu); 00174 00175 calculateSLRangeDependency(); 00176 00177 onTimeout(frametimeout); 00178 } 00179 00180 void 00181 Video::onTimeout(const Timeout& _t) 00182 { 00183 if(_t == frametimeout) 00184 { 00185 if(newGOP == false) 00186 { 00187 if(bFrameCounter <= 2) 00188 { 00189 /* B-Frame */ 00190 MESSAGE_SINGLE(NORMAL, logger, "APPL: B-FRAME!"); 00191 00192 applications::session::Session::iatProbesCalculation(); 00193 00194 bFrameCounter += 1; 00195 00196 if(frameGeneratingProcess == "PDF") 00197 { 00198 logNormalPDF(logMeanB, logStdB); 00199 } 00200 else if(frameGeneratingProcess == "P-AR") 00201 { 00202 logNormalProjectedAR(yB, phiB, mB, sqrValueB, kB, logMeanB, logStdB); 00203 } 00204 else if(frameGeneratingProcess == "P-ARMA") 00205 { 00206 logNormalProjectedARMA(yB, phiB, thetaB, mB, sqrValueB, kB, logMeanB, logStdB); 00207 } 00208 else if(frameGeneratingProcess == "P-FARIMA") 00209 { 00210 logNormalProjectedFarima(xB, phiBold, yB, phiB, thetaB, mB, sqrValueB, 00211 varianceB, kB, logMeanB, logStdB); 00212 } 00213 else if(frameGeneratingProcess == "P-FDN") 00214 { 00215 logNormalProjectedFDN(xB, phiBold, yB, phiB, thetaB, mB, sqrValueB, 00216 varianceB, kB, logMeanB, logStdB); 00217 } 00218 else if(frameGeneratingProcess == "AR") 00219 { 00220 videoAR(yB, phiB, logMeanB, logStdB); 00221 } 00222 else if(frameGeneratingProcess == "FARIMA") 00223 { 00224 videoFARIMA(xB, phiBold, yB, phiB, thetaB, varianceB, kB, logMeanB, logStdB); 00225 } 00226 else if(frameGeneratingProcess == "FDN") 00227 { 00228 videoFDN(xB, phiBold, yB, varianceB, kB, logMeanB, logStdB); 00229 } 00230 else 00231 { 00232 MESSAGE_SINGLE(NORMAL, logger, "APPL: No video B-frame generator!"); 00233 } 00234 00235 setTimeout(frametimeout, videoPacketIat); 00236 } 00237 else 00238 { 00239 // P-Frame 00240 bFrameCounter = 1; 00241 00242 if(gopCounter < 4) 00243 { 00244 MESSAGE_SINGLE(NORMAL, logger, "APPL: P-FRAME!"); 00245 00246 applications::session::Session::iatProbesCalculation(); 00247 00248 gopCounter += 1; 00249 00250 if(frameGeneratingProcess == "PDF") 00251 { 00252 logNormalPDF(logMeanP, logStdP); 00253 } 00254 else if(frameGeneratingProcess == "P-AR") 00255 { 00256 logNormalProjectedAR(yP, phiP, mP, sqrValueP, kP, logMeanP, logStdP); 00257 } 00258 else if(frameGeneratingProcess == "P-ARMA") 00259 { 00260 logNormalProjectedARMA(yP, phiP, thetaP, mP, sqrValueP, kP, logMeanP, logStdP); 00261 } 00262 else if(frameGeneratingProcess == "P-FARIMA") 00263 { 00264 logNormalProjectedFarima(xP, phiPold, yP, phiP, thetaP, mP, sqrValueP, 00265 varianceP, kP, logMeanP, logStdP); 00266 } 00267 else if(frameGeneratingProcess == "P-FDN") 00268 { 00269 logNormalProjectedFDN(xP, phiPold, yP, phiP, thetaP, mP, sqrValueP, 00270 varianceP, kP, logMeanP, logStdP); 00271 } 00272 else if(frameGeneratingProcess == "AR") 00273 { 00274 videoAR(yP, phiP, logMeanP, logStdP); 00275 } 00276 else if(frameGeneratingProcess == "FARIMA") 00277 { 00278 videoFARIMA(xP, phiPold, yP, phiP, thetaP, varianceP, kP, logMeanP, logStdP); 00279 } 00280 else if(frameGeneratingProcess == "FDN") 00281 { 00282 videoFDN(xP, phiPold, yP, varianceP, kP, logMeanP, logStdP); 00283 } 00284 else 00285 { 00286 MESSAGE_SINGLE(NORMAL, logger, "APPL: No video P-frame generator!"); 00287 } 00288 00289 setTimeout(frametimeout, videoPacketIat); 00290 } 00291 else 00292 { 00293 gopCounter = 1; 00294 newGOP = true; 00295 onTimeout(frametimeout); 00296 } 00297 } 00298 } 00299 else 00300 { 00301 // I-Frame 00302 MESSAGE_SINGLE(NORMAL, logger, "I-FRAME!"); 00303 00304 applications::session::Session::iatProbesCalculation(); 00305 00306 if(frameGeneratingProcess == "PDF") 00307 { 00308 logNormalPDF(logMeanI, logStdI); 00309 } 00310 else if(frameGeneratingProcess == "P-AR") 00311 { 00312 logNormalProjectedAR(yI, phiI, mI, sqrValueI, kI, logMeanI, logStdI); 00313 } 00314 else if(frameGeneratingProcess == "P-ARMA") 00315 { 00316 logNormalProjectedARMA(yI, phiI, thetaI, mI, sqrValueI, kI, logMeanI, logStdI); 00317 } 00318 else if(frameGeneratingProcess == "P-FARIMA") 00319 { 00320 logNormalProjectedFarima(xI, phiIold, yI, phiI, thetaI, mI, sqrValueI, 00321 varianceI, kI, logMeanI, logStdI); 00322 } 00323 else if(frameGeneratingProcess == "P-FDN") 00324 { 00325 logNormalProjectedFDN(xI, phiIold, yI, phiI, thetaI, mI, sqrValueI, 00326 varianceI, kI, logMeanI, logStdI); 00327 } 00328 else if(frameGeneratingProcess == "AR") 00329 { 00330 videoAR(yI, phiI, logMeanI, logStdI); 00331 } 00332 else if(frameGeneratingProcess == "FARIMA") 00333 { 00334 videoFARIMA(xI, phiPold, yI, phiI, thetaI, varianceI, kI, logMeanI, logStdI); 00335 } 00336 else if(frameGeneratingProcess == "FDN") 00337 { 00338 videoFDN(xI, phiIold, yI, varianceI, kI, logMeanI, logStdI); 00339 } 00340 else 00341 { 00342 MESSAGE_SINGLE(NORMAL, logger, "APPL: No video I-frame generator!"); 00343 } 00344 00345 newGOP = false; 00346 00347 setTimeout(frametimeout, videoPacketIat); 00348 } 00349 } 00350 else if(_t == probetimeout) 00351 { 00352 applications::session::Session::onTimeout(_t); 00353 } 00354 else 00355 { 00356 assure(false, "APPL: Unknown timout type =" << _t); 00357 } 00358 } 00359 00360 00361 void 00362 Video::calculateSLRangeDependency() 00363 { 00364 /* Callculation of the short- and longrangedependencies. 00365 For detailed discription see diplomathesis of Cem Mengi 10.07.2006: 00366 "Conception and implementation of traffic Models for VoIP and Videotelephony". */ 00367 MESSAGE_SINGLE(NORMAL, logger, "APPL: Callculation of the short- and longrange dependencies!"); 00368 00369 fracI = hurstI - 0.5; 00370 fracP = hurstP - 0.5; 00371 fracB = hurstB - 0.5; 00372 00373 autocorrI.push_back(1.0); 00374 autocorrP.push_back(1.0); 00375 autocorrB.push_back(1.0); 00376 00377 /* This distribution is just used one time and deleted after that. 00378 Next time a new distribution is used.*/ 00379 logNormDisI = new wns::distribution::Norm(meanI, varianceI); 00380 logNormValueI = (*logNormDisI)(); 00381 xI.push_back(logNormValueI); 00382 00383 logNormDisP = new wns::distribution::Norm(meanP, varianceP); 00384 logNormValueP = (*logNormDisP)(); 00385 xP.push_back(logNormValueP); 00386 00387 logNormDisB = new wns::distribution::Norm(meanB, varianceB); 00388 logNormValueB = (*logNormDisB)(); 00389 xB.push_back(logNormValueB); 00390 00391 delete logNormDisI; 00392 logNormDisI = NULL; 00393 00394 delete logNormDisP; 00395 logNormDisP = NULL; 00396 00397 delete logNormDisB; 00398 logNormDisB = NULL; 00399 00400 for(i = 1; i < limit; i++) 00401 { 00402 autocorrI.push_back(autocorrI[i - 1] * ((static_cast<float>(i - 1) + fracI)/ (static_cast<float>(i) - fracI))); 00403 autocorrP.push_back(autocorrP[i - 1] * ((static_cast<float>(i - 1) + fracP)/ (static_cast<float>(i) - fracP))); 00404 autocorrB.push_back(autocorrB[i - 1] * ((static_cast<float>(i - 1) + fracB)/ (static_cast<float>(i) - fracB))); 00405 00406 pI = 0; 00407 pP = 0; 00408 pB = 0; 00409 00410 for(j = 1; j <= (i-1); j++) 00411 { 00412 pI = pI + phiIold[j - 1] * autocorrI[i - j]; 00413 pP = pP + phiPold[j - 1] * autocorrP[i - j]; 00414 pB = pB + phiBold[j - 1] * autocorrB[i - j]; 00415 } 00416 00417 dI = dI - ((nI * nI) / dI); 00418 nI = autocorrI[i] - pI; 00419 dP = dP - ((nP * nP) / dP); 00420 nP = autocorrP[i] - pP; 00421 dB = dB - ((nB * nB) / dB); 00422 nB = autocorrB[i] - pB; 00423 00424 phiInew.push_back(nI / dI); 00425 phiPnew.push_back(nP / dP); 00426 phiBnew.push_back(nB / dB); 00427 00428 idx = i; 00429 00430 meanI = phiInew[0] * xI[0]; 00431 meanP = phiPnew[0] * xP[0]; 00432 meanB = phiBnew[0] * xB[0]; 00433 00434 for(idx = i; idx > 1; idx--) 00435 { 00436 phiInew.push_front(phiIold[idx - 2] - (phiInew[i - idx] * phiIold[i - idx])); 00437 phiPnew.push_front(phiPold[idx - 2] - (phiPnew[i - idx] * phiPold[i - idx])); 00438 phiBnew.push_front(phiBold[idx - 2] - (phiBnew[i - idx] * phiBold[i - idx])); 00439 00440 meanI = meanI + (phiInew[0] * xI[i - idx + 1]); 00441 meanP = meanP + (phiPnew[0] * xP[i - idx + 1]); 00442 meanB = meanB + (phiBnew[0] * xB[i - idx + 1]); 00443 00444 } 00445 varianceI = (1 - pow(phiInew[i - 1], 2)) * varianceI; 00446 varianceP = (1 - pow(phiPnew[i - 1], 2)) * varianceP; 00447 varianceB = (1 - pow(phiBnew[i - 1], 2)) * varianceB; 00448 00449 /* This distribution is just used one time and deleted after that. 00450 Next time a new distribution is used.*/ 00451 logNormDisI = new wns::distribution::Norm(meanI, varianceI); 00452 logNormValueI = (*logNormDisI)(); 00453 xI.push_back(logNormValueI); 00454 00455 logNormDisP = new wns::distribution::Norm(meanP, varianceP); 00456 logNormValueP = (*logNormDisP)(); 00457 xP.push_back(logNormValueP); 00458 00459 logNormDisB = new wns::distribution::Norm(meanB, varianceB); 00460 logNormValueB = (*logNormDisB)(); 00461 xB.push_back(logNormValueB); 00462 00463 phiIold.clear(); 00464 phiPold.clear(); 00465 phiBold.clear(); 00466 00467 phiIold = phiInew; 00468 phiPold = phiPnew; 00469 phiBold = phiBnew; 00470 00471 phiInew.clear(); 00472 phiPnew.clear(); 00473 phiBnew.clear(); 00474 00475 delete logNormDisI; 00476 logNormDisI = NULL; 00477 00478 delete logNormDisP; 00479 logNormDisP = NULL; 00480 00481 delete logNormDisB; 00482 logNormDisB = NULL; 00483 } 00484 00485 xI.pop_front(); 00486 xP.pop_front(); 00487 xB.pop_front(); 00488 00489 autocorrI.clear(); 00490 autocorrP.clear(); 00491 autocorrB.clear(); 00492 } 00493 00494 void 00495 Video::logNormalProjectedFarima(std::deque<double> _x, std::deque<double> _phiold, double _y, 00496 double _phi, double _theta, double _m, double _sqrValue, 00497 double _variance, int _k, double _logMean, double _logStd) 00498 { 00499 mean = 0; 00500 n = 0; 00501 00502 while(n < limit - 1) 00503 { 00504 mean = mean + _x[n] * _phiold[limit - n - 2]; 00505 00506 n = n + 1; 00507 } 00508 00509 _variance = (1 - pow(_phiold[limit - 2], 2)) * _variance; 00510 00511 normDis = new wns::distribution::Norm(mean, _variance); 00512 normValue = (*normDis)(); 00513 _x.push_back(normValue); 00514 00515 _y = _phi * _y + _x[limit - 1] + _theta * _x[limit - 2]; 00516 00517 _m = _m + _y; 00518 00519 _sqrValue = _sqrValue + pow(_y, 2); 00520 00521 normMean = _m / static_cast<int>((float)(_k + 1)); 00522 00523 normStd = ( _sqrValue - (pow(_m,2) / static_cast<int>((float)(_k + 1)))) / static_cast<int>((float)(_k)); 00524 00525 projection = exp(_logMean + (_logStd * ((_y - normMean) / sqrt(normStd)))); 00526 00527 if(byteFlag == true) 00528 { 00529 packetSize = (projection * 8.0) + 4.0; 00530 } 00531 else 00532 { 00533 packetSize = projection + 4.0; 00534 } 00535 00536 _x.pop_front(); 00537 _k = _k + 1; 00538 00539 delete normDis; 00540 normDis = NULL; 00541 00542 applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco); 00543 applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime()); 00544 00545 if(firstPacketNumber == true) 00546 { 00547 packetNumber = 1; 00548 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00549 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00550 00551 firstPacketNumber = false; 00552 } 00553 else 00554 { 00555 ++packetNumber; 00556 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00557 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00558 } 00559 00560 wns::osi::PDUPtr pdu(applicationPDU); 00561 applications::session::Session::outgoingProbesCalculation(pdu); 00562 00563 connection->sendData(pdu); 00564 } 00565 00566 00567 void 00568 Video::logNormalPDF(double _logMean, double _logStd) 00569 { 00570 logNormVariance = pow(_logStd, 2); 00571 00572 logNormDis = new wns::distribution::LogNorm(_logMean, logNormVariance); 00573 logNormValue = (*logNormDis)(); 00574 00575 value = exp(logNormValue); 00576 00577 if(byteFlag == true) 00578 { 00579 packetSize = (value * 8.0) + 4.0; 00580 } 00581 else 00582 { 00583 packetSize = value + 4.0; 00584 } 00585 00586 applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco); 00587 applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime()); 00588 00589 if(firstPacketNumber == true) 00590 { 00591 packetNumber = 1; 00592 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00593 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00594 00595 firstPacketNumber = false; 00596 } 00597 else 00598 { 00599 ++packetNumber; 00600 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00601 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00602 } 00603 00604 wns::osi::PDUPtr pdu(applicationPDU); 00605 applications::session::Session::outgoingProbesCalculation(pdu); 00606 00607 connection->sendData(pdu); 00608 00609 delete logNormDis; 00610 logNormDis = NULL; 00611 } 00612 00613 00614 void 00615 Video::logNormalProjectedAR(double _y, double _phi, double _m, double _sqrValue, 00616 int _k, double _logMean, double _logStd) 00617 { 00618 normDis = new wns::distribution::Norm(0.0, 1.0); 00619 normValue = (*normDis)(); 00620 00621 _y = _phi * _y + normValue; 00622 00623 _m = _m + _y; 00624 00625 _sqrValue = _sqrValue + pow(_y, 2); 00626 00627 normMean = _m / static_cast<int>((float)(_k + 1)); 00628 00629 normStd = ( _sqrValue - (pow(_m,2) / static_cast<int>((float)(_k + 1)))) / static_cast<int>((float)(_k)); 00630 00631 projection = exp(_logMean + (_logStd * ((_y - normMean) / sqrt(normStd)))); 00632 00633 if(byteFlag == true) 00634 { 00635 packetSize = (projection * 8.0) + 4.0; 00636 } 00637 else 00638 { 00639 packetSize = projection + 4.0; 00640 } 00641 00642 applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco); 00643 applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime()); 00644 00645 if(firstPacketNumber == true) 00646 { 00647 packetNumber = 1; 00648 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00649 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00650 00651 firstPacketNumber = false; 00652 } 00653 else 00654 { 00655 ++packetNumber; 00656 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00657 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00658 } 00659 00660 wns::osi::PDUPtr pdu(applicationPDU); 00661 applications::session::Session::outgoingProbesCalculation(pdu); 00662 00663 connection->sendData(pdu); 00664 00665 delete normDis; 00666 normDis = NULL; 00667 00668 _k = _k + 1; 00669 } 00670 00671 00672 void 00673 Video::logNormalProjectedARMA(double _y, double _phi, double _theta, double _m, 00674 double _sqrValue, int _k, double _logMean, double _logStd) 00675 { 00676 normDis = new wns::distribution::Norm(0.0, 1.0); 00677 normValue = (*normDis)(); 00678 00679 _y = _phi * _y + _theta * normValue; 00680 00681 _m = _m + _y; 00682 00683 _sqrValue = _sqrValue + pow(_y, 2); 00684 00685 normMean = _m / static_cast<int>((float)(_k + 1)); 00686 00687 normStd = (_sqrValue - (pow(_m, 2) / static_cast<int>((float)(_k + 1)))) / static_cast<int>((float)(_k)); 00688 00689 projection = exp(_logMean + (_logStd * ((_y - normMean) / sqrt(normStd)))); 00690 00691 if(byteFlag == true) 00692 { 00693 packetSize = (projection * 8.0) + 4.0; 00694 } 00695 else 00696 { 00697 packetSize = projection + 4.0; 00698 } 00699 00700 applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco); 00701 applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime()); 00702 00703 if(firstPacketNumber == true) 00704 { 00705 packetNumber = 1; 00706 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00707 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00708 00709 firstPacketNumber = false; 00710 } 00711 else 00712 { 00713 ++packetNumber; 00714 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00715 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00716 } 00717 00718 wns::osi::PDUPtr pdu(applicationPDU); 00719 applications::session::Session::outgoingProbesCalculation(pdu); 00720 00721 connection->sendData(pdu); 00722 00723 delete normDis; 00724 normDis = NULL; 00725 _k = _k + 1; 00726 } 00727 00728 00729 void 00730 Video::logNormalProjectedFDN(std::deque<double> _x, std::deque<double> _phiold, double _y, 00731 double _phi, double _theta, double _m, double _sqrValue, 00732 double _variance, int _k, double _logMean, double _logStd) 00733 { 00734 mean = 0; 00735 n = 0; 00736 00737 while(n < limit - 1) 00738 { 00739 mean = mean + _x[n] * _phiold[limit - n - 2]; 00740 00741 n = n + 1; 00742 } 00743 00744 _variance = (1 - pow(_phiold[limit - 2], 2)) * _variance; 00745 00746 normDis = new wns::distribution::Norm(mean, _variance); 00747 normValue = (*normDis)(); 00748 00749 _x.push_back(normValue); 00750 00751 _y = _x[limit - 1]; 00752 00753 _m = _m + _y; 00754 00755 _sqrValue = _sqrValue + pow(_y, 2); 00756 00757 normMean = _m / static_cast<int>((float)(_k + 1)); 00758 00759 normStd = ( _sqrValue - (pow(_m, 2) / static_cast<int>((float)(_k + 1)))) / static_cast<int>((float)(_k)); 00760 00761 projection = exp(_logMean + (_logStd * ((_y - normMean) / sqrt(normStd)))); 00762 00763 if(byteFlag == true) 00764 { 00765 packetSize = (projection * 8.0) + 4.0; 00766 } 00767 else 00768 { 00769 packetSize = projection + 4.0; 00770 } 00771 00772 _x.pop_front(); 00773 _k = _k + 1; 00774 delete normDis; 00775 normDis = NULL; 00776 00777 applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco); 00778 applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime()); 00779 00780 if(firstPacketNumber == true) 00781 { 00782 packetNumber = 1; 00783 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00784 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00785 00786 firstPacketNumber = false; 00787 } 00788 else 00789 { 00790 ++packetNumber; 00791 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00792 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00793 } 00794 00795 wns::osi::PDUPtr pdu(applicationPDU); 00796 applications::session::Session::outgoingProbesCalculation(pdu); 00797 00798 connection->sendData(pdu); 00799 } 00800 00801 00802 void 00803 Video::videoAR(double _y, double _phi, double _logMean, double _logStd) 00804 { 00805 normDis = new wns::distribution::Norm(0.0, 1.0); 00806 normValue = (*normDis)(); 00807 00808 _y = _phi * _y + normValue; 00809 00810 // Mean of lognormal distribution is exp(mu+sigma^2/2) and variance is (exp(sigma^2)-1)*exp(2*mu+sigma^2) 00811 projection = exp(_logMean + _logStd * _logStd / 2) + 00812 sqrt((exp(_logStd * _logStd) - 1) * 00813 exp(2 * _logMean + _logStd * _logStd)) * _y; 00814 00815 if(byteFlag == true) 00816 { 00817 packetSize = (projection * 8.0) + 4.0; 00818 } 00819 else 00820 { 00821 packetSize = projection + 4.0; 00822 } 00823 00824 applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco); 00825 applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime()); 00826 00827 if(firstPacketNumber == true) 00828 { 00829 packetNumber = 1; 00830 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00831 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00832 00833 firstPacketNumber = false; 00834 } 00835 else 00836 { 00837 ++packetNumber; 00838 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00839 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00840 } 00841 00842 wns::osi::PDUPtr pdu(applicationPDU); 00843 applications::session::Session::outgoingProbesCalculation(pdu); 00844 00845 connection->sendData(pdu); 00846 00847 delete normDis; 00848 normDis = NULL; 00849 } 00850 00851 00852 void 00853 Video::videoFARIMA(std::deque<double> _x, std::deque<double> _phiold, double _y, double _phi, 00854 double _theta, double _variance, int _k, double _logMean, double _logStd) 00855 { 00856 mean = 0; 00857 n = 0; 00858 00859 while(n < limit - 1) 00860 { 00861 mean = mean + _x[n] * _phiold[limit - n - 2]; 00862 00863 n = n + 1; 00864 } 00865 _variance = (1 - pow(_phiold[limit - 2], 2)) * _variance; 00866 00867 normDis = new wns::distribution::Norm(mean, _variance); 00868 normValue = (*normDis)(); 00869 _x.push_back(normValue); 00870 00871 _y = _phi * _y + _x[limit - 1] + _theta * _x[limit - 2]; 00872 00873 projection = exp(_logMean + _logStd * _logStd / 2) + 00874 sqrt((exp(_logStd * _logStd) - 1) * 00875 exp(2 * _logMean + _logStd * _logStd)) * _y; 00876 00877 if(byteFlag == true) 00878 { 00879 packetSize = (projection * 8.0) + 4.0; 00880 } 00881 else 00882 { 00883 packetSize = projection + 4.0; 00884 } 00885 00886 applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco); 00887 applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime()); 00888 00889 if(firstPacketNumber == true) 00890 { 00891 packetNumber = 1; 00892 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00893 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00894 00895 firstPacketNumber = false; 00896 } 00897 else 00898 { 00899 ++packetNumber; 00900 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00901 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00902 } 00903 00904 wns::osi::PDUPtr pdu(applicationPDU); 00905 applications::session::Session::outgoingProbesCalculation(pdu); 00906 00907 connection->sendData(pdu); 00908 00909 _x.pop_front(); 00910 _k = _k + 1; 00911 delete normDis; 00912 normDis = NULL; 00913 } 00914 00915 00916 void 00917 Video::videoFDN(std::deque<double> _x, std::deque<double> _phiold, double _y, 00918 double _variance, int _k, double _logMean, double _logStd) 00919 { 00920 mean = 0; 00921 n = 0; 00922 00923 while( n < limit - 1) 00924 { 00925 mean = mean + _x[n] * _phiold[limit - n - 2]; 00926 00927 n = n + 1; 00928 } 00929 _variance = (1 - pow(_phiold[limit - 2], 2)) * _variance; 00930 00931 normDis = new wns::distribution::Norm(mean, _variance); 00932 normValue = (*normDis)(); 00933 _x.push_back(normValue); 00934 00935 _y = _x[limit - 1]; 00936 00937 projection = exp(_logMean + _logStd * _logStd / 2) + 00938 sqrt((exp(_logStd * _logStd) - 1) * 00939 exp(2 * _logMean + _logStd * _logStd)) * _y; 00940 00941 if(byteFlag == true) 00942 { 00943 packetSize = (projection * 8.0) + 4.0; 00944 } 00945 else 00946 { 00947 packetSize = projection + 4.0; 00948 } 00949 00950 applications::session::PDU* applicationPDU = new applications::session::PDU(Bit(packetSize), pyco); 00951 applicationPDU->setCreationTime(wns::simulator::getEventScheduler()->getTime()); 00952 00953 if(firstPacketNumber == true) 00954 { 00955 packetNumber = 1; 00956 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00957 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00958 00959 firstPacketNumber = false; 00960 } 00961 else 00962 { 00963 ++packetNumber; 00964 applicationPDU->setPacketNumber(packetNumber, packetFrom); 00965 MESSAGE_SINGLE(NORMAL, logger, "APPL: PacketNumber = " << packetNumber << "."); 00966 } 00967 00968 wns::osi::PDUPtr pdu(applicationPDU); 00969 applications::session::Session::outgoingProbesCalculation(pdu); 00970 00971 connection->sendData(pdu); 00972 00973 _x.pop_front(); 00974 _k = _k + 1; 00975 delete normDis; 00976 normDis = NULL; 00977 } 00978
1.5.5