Esempio n. 1
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