Source code for simulator.radios.DtnCodedRadio

from fractions import Fraction
import numpy as np
from simulator.radios.DtnBasicRadio import DtnBasicRadio

[docs]class DtnCodedRadio(DtnBasicRadio): """ Simulate a radio with a given coding scheme. Note that in reality frames are not generated, only the equivalent BER to achieve the specified FER is calculated given the frame size, code rate and mesage size. This radio is only an approximation. If a message is very short (e.g. 10 bytes), a real radio would aggregate multiple messages into a frame prior to sending anything. This is not modeled in this case, the very short message is sent immediately as is. """
[docs] def initialize(self, rate=0, FER=0, frame_size=0, code_rate=0, J_bit=0, **kwargs): # Store configuration parameters self.datarate = float(rate) self.FER = float(FER) self.frame_size = float(frame_size) self.code_rate = float(Fraction(code_rate)) self.J_bit = float(J_bit) # Call grand-parent initializer super(DtnBasicRadio, self).initialize()
[docs] def send_through_connection(self, message, conn, peer, direction): # Compute the equivalent BER that yields this radio's FER BER = self.compute_equivalent_BER(message) # This is a non-blocking call since the bundle is out in transit conn.transmit(peer, message, BER, direction=direction)
def compute_equivalent_BER(self, message): # Compute total number of bits to send with coding num_bits = message.num_bits/self.code_rate # Compute the number of frames to send this message N = np.ceil(num_bits/self.frame_size) # Compute probability of tx the message ok prob_msg_ok = (1-self.FER)**N # Compute the equivalent BER return (1-(prob_msg_ok**(self.code_rate/message.num_bits)))