45#define POWER_PRECISION_THRESHOLD (1e-14)
46#define EPSILON_TIME 0.000000000001
52 : TclClass(
"Module/UW/INTERFERENCEOFDM")
75 bind(
"inodeID_", (
int *)&
inodeID);
84 Tcl &tcl = Tcl::instance();
87 if (strcasecmp(argv[1],
"getInterfCarriers") == 0)
95 if (strcasecmp(argv[1],
"setInterfCarriers") == 0)
106 hdr_MPhy *ph = HDR_MPHY(p);
107 hdr_mac *mach = HDR_MAC(p);
109 std::vector<double> car_power;
110 int used_carriers = 0;
115 used_carriers += ofdmph->
carriers[i];
121 car_power.push_back(ph->Pr / used_carriers * ofdmph->
carriers[i]);
123 bool ctrl_pkt = (mach->ftype() == MF_CTS || mach->ftype() == MF_RTS || mach->ftype() == MF_ACK );
128 std::cout << NOW <<
" uwinterference::addToInterference() CTRL packet" << std::endl;
132 Scheduler::instance().schedule(
138 std::cout << NOW <<
" uwinterference::addToInterference() DATA packet" << std::endl;
142 Scheduler::instance().schedule(
149 std::vector<double> car_power;
150 int used_carriers = 0;
153 for (
int i = 0; i < carNum; i++)
155 used_carriers += carriers[i];
159 for (
int i = 0; i < carNum; i++)
161 car_power.push_back(pw / used_carriers * carriers[i]);
166 std::list<ListNodeOFDM>::iterator it;
169 if (it->time < NOW - maxinterval_) {
187 double power_temp =
power_list.back().sum_power;
190 std::vector<double> car_pwr_old =
power_list.back().carrier_power;
192 string carPwr =
"CarrierPower_Vector = [";
194 for (
int i = 0; i < car_pwr_old.size(); i++)
196 car_power.at(i) += car_pwr_old.at(i);
197 carPwr += (std::to_string(car_power.at(i)) +
", ");
202 std::cout << NOW <<
" uwinterference::addToInterference() " << carPwr << std::endl;
206 ListNodeOFDM pn(NOW, pw + power_temp, ctrl_temp + 1, data_temp, car_power);
209 ListNodeOFDM pn(NOW, pw + power_temp, ctrl_temp, data_temp + 1, car_power);
216 std::cout << NOW <<
" uwinterference::addToInterference, power: " << pw
217 <<
" ,total power: " <<
power_list.back().sum_power
218 <<
" ,ctrl_packet: " <<
power_list.back().ctrl_cnt
219 <<
" ,data packets: " <<
power_list.back().data_cnt
227 std::list<ListNodeOFDM>::iterator it;
231 if (it->time < NOW - maxinterval_) {
241 std::cerr <<
"uwinterference::removeFromInterference, "
242 <<
"some interference removed wrongly" << std::endl;
245 double power_temp =
power_list.back().sum_power;
248 std::vector<double> car_pwr_old =
power_list.back().carrier_power;
249 std::vector<double> car_pwr_new;
250 for (std::size_t i = 0; i < car_pwr_old.size(); ++i)
252 double tempPwr = car_pwr_old[i] - carPwr[i];
255 if (tempPwr < -0.001)
256 cerr << NOW <<
" NODE " <<
inodeID <<
" REMOVE FROM INTERFERENCE !!! result < 0 ("
257 << tempPwr <<
") car " << i << std::endl;
260 car_pwr_new.push_back(tempPwr);
269 data_temp, car_pwr_new);
278 data_temp - 1, car_pwr_new);
283 std::cout << NOW <<
" uwinterference::removeFromInterference, "
285 <<
" ,total power: " <<
power_list.back().sum_power
286 <<
" ,ctrl_packet: " <<
power_list.back().ctrl_cnt
287 <<
" ,data packets: " <<
power_list.back().data_cnt
291 double power_temp =
power_list.back().sum_power;
293 if (power_temp < -0.001) {
295 std::cout << NOW <<
" NODE " <<
inodeID <<
" Precision error, negative power: " << power_temp
298 cerr << NOW <<
" NODE " <<
inodeID <<
" Precision ERROR, negative power: " << power_temp
309 hdr_MPhy *ph = HDR_MPHY(p);
317 double power,
double starttime,
double duration,
int *carriers,
int ncarriers)
319 std::list<ListNodeOFDM>::reverse_iterator rit;
321 std::vector<double> car_pwr;
324 double car_integral = 0;
325 double car_power = 0;
326 double lasttime = NOW;
327 assert(starttime <= NOW);
328 assert(duration > 0);
333 if (starttime < rit->time)
335 integral += rit->sum_power * (lasttime - rit->time);
338 for (
int i = 0; i < rit->carrier_power.size(); i++)
340 car_power += carriers[i] * rit->carrier_power.at(i);
343 car_integral += car_power * (lasttime - rit->time);
344 lasttime = rit->time;
347 integral += rit->sum_power * (lasttime - starttime);
348 for (
int i = 0; i < rit->carrier_power.size(); i++)
350 car_power += carriers[i] * rit->carrier_power.at(i);
352 car_integral += car_power * (lasttime - starttime);
356 double interference = (integral / duration) - power;
357 double ofdminterference = (car_integral / duration) - power;
358 if(interference < (ofdminterference - 1))
359 std::cerr <<
"PROBLEM interference VS OFDM interference " << interference <<
" - " << ofdminterference << std::endl;
364 std::cout <<
"getInterferencePower() WARNING:"
365 <<
" interference=" << interference
366 <<
" POWER_PRECISION_THRESHOLD="
368 <<
". Precision error, interference set to 0"
373 if (interference < 0) {
375 std::cout <<
"getInterferencePower() WARNING:"
376 <<
" cancellation errors, interference set to 0"
377 <<
" previous value " << interference << endl;
382 std::cout <<
"transmission from " << starttime <<
" to "
383 << starttime + duration <<
" power " << power
384 <<
" gets interference " << interference << std::endl;
386 if (ofdminterference < 0) {
388 std::cout <<
"getInterferencePower() WARNING:"
389 <<
" cancellation errors, ofdminterference set to 0 "
390 <<
"previous value " << ofdminterference << endl;
392 ofdminterference = 0;
394 return ofdminterference;
412 return (
power_list.back().carrier_power.at(carrier));
419 hdr_MPhy *ph = HDR_MPHY(p);
426 std::list<ListNodeOFDM>::reverse_iterator rit;
429 double lasttime = NOW;
430 assert(starttime <= NOW);
431 assert(duration > 0);
435 if (starttime < rit->time) {
437 if (rit->ctrl_cnt > 1 || rit->data_cnt > 1) {
438 overlap += (lasttime - rit->time);
440 lasttime = rit->time;
442 if (rit->ctrl_cnt > 1 || rit->data_cnt > 1) {
443 overlap += (lasttime - starttime);
448 return overlap / duration;
454 hdr_MPhy *ph = HDR_MPHY(p);
455 hdr_mac *mach = HDR_MAC(p);
457 if (mach->ftype() == MF_CONTROL) {
468 std::list<ListNodeOFDM>::reverse_iterator rit;
473 assert(starttime <= NOW);
474 assert(duration > 0);
477 int last_ctrl_cnt = rit->ctrl_cnt;
478 int last_data_cnt = rit->data_cnt;
482 if (starttime < rit->time) {
483 if (last_ctrl_cnt - rit->ctrl_cnt >= 0) {
484 ctrl_pkts += last_ctrl_cnt - rit->ctrl_cnt;
486 if (last_data_cnt - rit->data_cnt >= 0) {
487 data_pkts += last_data_cnt - rit->data_cnt;
489 last_ctrl_cnt = rit->ctrl_cnt;
490 last_data_cnt = rit->data_cnt;
492 ctrl_pkts += rit->ctrl_cnt;
493 data_pkts += rit->data_cnt;
505 std::cout << NOW <<
" uwinterference::getCounters(), collisions"
506 <<
" with ctrl pkts: " << ctrl_pkts
507 <<
", collisions with data pkts: " << data_pkts << std::endl;
510 return counter(ctrl_pkts, data_pkts);
std::vector< double > carrier_power
uwinterferenceofdm * interference
virtual void handle(Event *e)
TclObject * create(int, const char *const *)
double use_maxinterval_
set to 1 to use maxinterval_.
virtual int command(int, const char *const *)
TCL command interpreter.
std::list< ListNodeOFDM > power_list
List with power and counters.
void setInterfCarriers(int sc)
Sets number of carriers used by the node.
virtual void removeFromInterference(double pw, PKT_TYPE tp, const std::vector< double > &carPwr)
Remove a packet to the interference calculation.
uwinterferenceofdm()
Constructor of the class uwinterference.
virtual ~uwinterferenceofdm()
Destructor of the class uwinterference.
virtual double getCurrentTotalPowerOnCarrier(int carrier)
Compute the total power on a carrier.
virtual counter getCounters(Packet *p)
Returns the counters of collisions.
EndInterfTimerOFDM end_timerOFDM
Timer for schedules end of interference for a transmission.
virtual void addToInterference(Packet *p)
Add a packet to the interference calculation.
virtual double getInterferencePower(Packet *p)
Compute the average interference power for the given packet.
virtual double getTimeOverlap(Packet *p)
Returns the percentage of overlap between current packet and interference packets.
virtual double getCurrentTotalPower()
Header of the OFDM message with fields to implement a multi carrier system.
int carriers[MAX_CARRIERS]
#define POWER_PRECISION_THRESHOLD
std::pair< int, int > counter
counter of collisions
Interf_FOverlap_Class class_interf_foverlap
Implementation of uwinterference class. Your can find the brief description of this module in the pap...
std::pair< int, int > counter
counter of collisions
#define HDR_OFDM(p)
alias defined to access the PROBE HEADER