def hard_decode(cls, uber, dfree): """Calculate bit-error probability for hard decision decoded RCPC. :param uber: Probability of bit-error for uncoded system. :param dfree: Free distance of convolutional code. :return: BER for hard decision decoded RCPC coded system. """ pd, p = 0, uber dmin = int(ceil((dfree+1.0)/2) ) q = 1 - p for k in range(dmin, dfree+1): pd += nchoosek(dfree,k)*(p**k)*(q**(dfree-k) ) if (int(dfree)%2<1): pd += 0.5*nchoosek(dfree,int(dfree/2))*(p**(dfree/2))*(q**(dfree/2)) return pd
def per(self, p, ber): """Calculate packet-error rate (PER). :param p: Packet (packet length in bytes) to compute PER for. :param ber: BER of uncoded system. :return: Packet-error rate (PER) in [0,1]. :note: If `ber` is a `numpy` array, this method will return an array of values corresponding to the specified parameters. """ n, k = self.blocklength, self.messagelength m, t = self.bitspersymbol, self.ncorrectable plen = p if isinstance(p, Packet): plen = len(p) # calculate uncorrectable error rate for symbols ser = 1 - (1 - ber)**m # calculate uncorrectable error rate s = 0 for b in range(t+1): s +=nchoosek(n,b)*(ser**b)*((1-ser)**(n-b)) uer = 1 - s # calculate PER nblocks = int(ceil(plen/k) ) per = 1 - (1-uer)**nblocks return per