Пример #1
0
class Satellite:
    def __init__(self):
        self.frequency = 0
        self.posX = 0
        self.posY = 0
        self.posZ = 0
        self.chooseEncryption = "Hamming"
        self.receiver = Receiver()
        self.noiseLevel = 0.05

    def sendPositionHamming(self, array):

        self.receiver.decodeHamming(self.Noise(array, self.noiseLevel))

    def sendPositionBCH(self, array):
        self.receiver.decodeBCH(self.Noise(array, self.noiseLevel))

    def Noise(self, array, noise):

        amountOfMistakes = len(array) * noise
        amountOfMistakes = round(amountOfMistakes)

        temp = []
        y = 0

        while y < amountOfMistakes:
            help = False
            r = random.randint(0, len(array) - 1)
            for z in range(len(temp)):
                if temp[z] is r:
                    help = True
                    break
            if help is False:
                temp.append(r)
                y += 1
        for l in temp:
            q = random.randint(0, 1)
            if q == 0:
                if array[l] is 1:
                    array[l] = 0

                else:
                    array[l] = 1
        return array

    def encryptHamming(self, list):

        self.receiver.analysis.setOriginal(list)

        czy_dopisac = 4 - ((len(list)) % 4)
        if czy_dopisac < 4:
            self.dopisz(czy_dopisac)

        whole_msg = np.array([], dtype=int)

        iterator = 0

        while iterator < len(list):
            msg = self.stworz_wiadomosc(iterator, list)
            iterator += 4

            kod = self.kod_hamming(msg)

            whole_msg = np.append(whole_msg, kod)
        print("Zakodowana wiadomość: ")
        print(whole_msg)
        return whole_msg

    def encryptBCH(selfself, array):
        polynomial = 8219
        t = 2
        bch = bchlib.BCH(polynomial, t)

        data = bytearray(array)

        code = bch.encode(data)
        result = data + code
        result = list(result)
        return result

    def generatePosition(self):
        while True:
            self.posX = random.uniform(-180.0, 180.0)
            self.posY = random.uniform(-90.0, 90.0)
            self.posZ = randint(10000, 11000)
            self.posX = round(self.posX, 6)
            self.posY = round(self.posY, 6)
            print("Pozycja X: ")
            print(self.posX)
            print("Pozycja Y: ")
            print(self.posY)
            print("Wysokość: ")

            print(self.posZ)
            print()

            self.posX = bitstring.BitArray(float=self.posX, length=64)
            self.receiver.analysis.setOriginal(self.posX)
            print("Pozycja X: ")
            #print(self.posX.bin)
            for x in self.posX.bin:
                print(x, end=' ')
            print('\n')
            if self.chooseEncryption == "Hamming":
                self.sendPositionHamming(self.encryptHamming(self.posX))
            elif self.chooseEncryption == "BCH":
                self.sendPositionBCH(self.encryptBCH(self.posX))
            self.posY = bitstring.BitArray(float=self.posY, length=64)
            self.receiver.analysis.setOriginal(self.posY)
            print()
            print("Pozycja Y: ")
            print(self.posY.bin)
            if self.chooseEncryption == "Hamming":
                self.sendPositionHamming(self.encryptHamming(self.posY))
            elif self.chooseEncryption == "BCH":
                self.sendPositionBCH(self.encryptBCH(self.posY))
            self.posZ = bitstring.BitArray(int=self.posZ, length=64)
            self.receiver.analysis.setOriginal(self.posZ)
            print()
            print("Wysokość: ")
            print(self.posZ.bin)
            if self.chooseEncryption == "Hamming":
                self.sendPositionHamming(self.encryptHamming(self.posZ))
            elif self.chooseEncryption == "BCH":
                self.sendPositionBCH(self.encryptBCH(self.posZ))

            time.sleep(self.frequency)

    def kod_hamming(self, msg=[]):
        G = np.array([  # macierz generująca
            [1, 1, 0, 1],
            [1, 0, 1, 1],
            [1, 0, 0, 0],
            [0, 1, 1, 1],
            [0, 1, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 1],
        ])

        kod = (G @ msg) % 2

        return kod

    def dopisz(self, dopisanie):
        for i in range(0, dopisanie, 1):
            list.append(0)

    def stworz_wiadomosc(self, i, list=[]):
        tab = []
        for x in range(i, i + 4, 1):
            tab.append(list[x])
        return tab
Пример #2
0
class WirelessSystem:
    def __init__(self, numOfInputs):
        self.transmitter = Transmitter()
        self.receiver = Receiver()
        self.wirelessChannel = WirelessChannel(0.1)
        self.numOfInputs = numOfInputs
        self.sigmaValues = [10, 1, 0.1]
        self.reveivedPoints = []
        self.colors = ['purple', 'yellow', 'orange']
        self.hammingProbs = []
        self.qpskProbs = []
    
    def runForScatterPlot(self):
        u = Utils() 
        probabilities = []
        for i in range(len(self.sigmaValues)):
            self.reveivedPoints = []
            input = open("input.txt", "r")
            numOfCorrectOutputs = 0
            AWGNsigma = self.sigmaValues[i]
            self.wirelessChannel.setSigma(1/AWGNsigma)
            for line in input:
                data = line.rstrip()
                point = self.transmitter.modulate(data)
                (hI, hQ) = self.wirelessChannel.applyChannelGain(point)
                self.wirelessChannel.applyAWGN(point)
                self.reveivedPoints.append(point)

            u.showScatterPlot(self.reveivedPoints ,AWGNsigma, self.colors[i])
            input.close()


    def runForScatterPlot16(self):
        u = Utils() 
        probabilities = []
        for i in range(len(self.sigmaValues)):
            self.reveivedPoints = []
            input = open("input.txt", "r")
            numOfCorrectOutputs = 0
            AWGNsigma = self.sigmaValues[i]
            self.wirelessChannel.setSigma(1/AWGNsigma)
            cntr = 0
            for line in input:
                if(cntr == 0):
                    data = line.rstrip()
                    cntr += 1
                    continue
                else:
                    data += line.rstrip()
                    cntr = 0
                    point = self.transmitter.modulate16QAM(data)
                    (hI, hQ) = self.wirelessChannel.applyChannelGain(point)
                    self.wirelessChannel.applyAWGN(point)
                    self.reveivedPoints.append(point)

            u.showScatterPlotQAM(self.reveivedPoints ,AWGNsigma, self.colors[i])
            input.close()
               
    def runForLinePlot(self):
        u = Utils() 
        probabilities = []
        for i in range(1, 100, 1):
            input = open("input.txt", "r")
            numOfCorrectOutputs = 0
            SNR = i / 10
            print('i=', i, 'for AWGNSgima =', 1/SNR)
            self.wirelessChannel.setSigma(1/SNR)
            for line in input:
                data = line.rstrip()
                point = self.transmitter.modulate(data)
                (hI, hQ) = self.wirelessChannel.applyChannelGain(point)
                self.wirelessChannel.applyAWGN(point)
                self.receiver.removeChannelImpact(point, hI, hQ)
                receiverOut = self.receiver.demodulate2(point)
                if(data == receiverOut):
                    numOfCorrectOutputs += 1
            probabilities.append(1 - (numOfCorrectOutputs/self.numOfInputs))
            input.close()

        print(probabilities)
        self.qpskProbs = probabilities
        u.probVsSNR([(i/10.0) for i in range(1, 100, 1)], probabilities)


    def runForLinePlot16(self):
        u = Utils() 
        probabilities = []
        for i in range(1, 100, 1):
            input = open("input.txt", "r")
            numOfCorrectOutputs = 0
            SNR = i / 10
            print('i=', i, 'for AWGNSgima =', 1/SNR)
            self.wirelessChannel.setSigma(1/SNR)
            cntr = 0
            for line in input:
                if(cntr == 0):
                    data = line.rstrip()
                    cntr += 1
                    continue
                else :
                    cntr = 0
                    data += line.rstrip()
                    point = self.transmitter.modulate16QAM(data)
                    (hI, hQ) = self.wirelessChannel.applyChannelGain(point)
                    self.wirelessChannel.applyAWGN(point)
                    self.receiver.removeChannelImpact(point, hI, hQ)
                    receiverOut = self.receiver.demodulate16(point)
                    if(data == receiverOut):
                        numOfCorrectOutputs += 1
            probabilities.append(1 - (numOfCorrectOutputs/(self.numOfInputs/2)))
            input.close()

        u.probVsSNR([i/10.0 for i in range(1, 100, 1)], probabilities)
    
    def runWithHammingCode(self):
        u = Utils() 
        probabilities = []
        self.encodeAllWithHamming()
        for i in range(1, 100, 1):
            allDemodulated = open('demodulated.txt', 'w')
            SNR = i / 10.0
            print('for AWGNSgima =', 1/SNR)
            self.wirelessChannel.setSigma(1/SNR)
            content_file = open('encoded.txt', 'r')
            content = content_file.read()
            for data in [content[i:i+2] for i in range(0, len(content), 2)] :
                point = self.transmitter.modulate(data)
                (hI, hQ) = self.wirelessChannel.applyChannelGain(point)
                self.wirelessChannel.applyAWGN(point)
                self.receiver.removeChannelImpact(point, hI, hQ)
                receiverOut = self.receiver.demodulate2(point)
                allDemodulated.write(receiverOut)
            allDemodulated.close()

            self.decodeAll()
            numOfCorrectOutputs = self.reconstructAndCalcCorrectOutputs()
            probabilities.append(1 - (numOfCorrectOutputs/(self.numOfInputs)))

        self.hammingProbs = probabilities
        u.probVsSNR([i/10.0 for i in range(1, 100, 1)], probabilities)
        #plt.plot([i/10.0 for i in range(1, 100, 1)], probabilities,  color='green')
        #plt.plot([i/10.0 for i in range(1, 100, 1)], self.qpskProbs)
        #plt.show()

    def runForScatterPlotHamming(self):
        u = Utils() 
        probabilities = []
        self.receivedPoints = []
        for i in range(len(self.sigmaValues)):
            AWGNsigma = self.sigmaValues[i]
            self.wirelessChannel.setSigma(1/AWGNsigma)
            content_file = open('encoded.txt', 'r')
            content = content_file.read()
            for data in [content[x:x+2] for x in range(0, len(content), 2)] :
                point = self.transmitter.modulate(data)
                (hI, hQ) = self.wirelessChannel.applyChannelGain(point)
                self.wirelessChannel.applyAWGN(point)
                self.reveivedPoints.append(point)

            u.showScatterPlot(self.reveivedPoints , AWGNsigma, self.colors[i])
        content_file.close()


    def encodeAllWithHamming(self):
        input = open("input.txt", "r") 
        output = open("encoded.txt", "w")
        cntr = 0
        for line in input: 
            if(cntr == 0):
                data = line.rstrip()
                cntr +=1
                continue
            else:
                data += line.rstrip()
                cntr = 0
                encoded = self.transmitter.encodeHamming(map(int, data))
                mystring = ""
                for bit in encoded:
                    mystring += str(bit)
                output.write(mystring)
        input.close()
        output.close()
    
    def decodeAll(self):
        demod = open('demodulated.txt', 'r')
        decodedFile = open("decoded.txt", "w")
        lines = demod.read()
        for data in [lines[i:i+7] for i in range(0, len(lines), 7)] :
            decoded = self.receiver.decodeHamming(map(int, data))
            actualData = data[0:4]
            mystring = ""
            for bit in decoded:
                mystring += str(bit)
            decodedFile.write(actualData + mystring)
                    
        decodedFile.close()
        demod.close()
    
    def reconstructAndCalcCorrectOutputs(self):
        numOfCorrects = 0
        counter = 0
        decodedFile = open('decoded.txt', 'r')
        lines = tuple(open('input.txt', 'r'))
        content = decodedFile.read()
        for line in [content[i:i+7] for i in range(0, len(content), 7)] :
            actualData = line[0 : 4]
            syndromes = line[4:7]
            inputLine1 = lines[counter].rstrip() 
            inputLine2 = lines[counter + 1].rstrip()
            correctedOutput = self.receiver.findAndCorrectError(syndromes, actualData)
            if(correctedOutput[0 : 2] == inputLine1):
                numOfCorrects += 1
            if(correctedOutput[2 : 4] == inputLine2):
                numOfCorrects += 1
            counter += 2

        return numOfCorrects