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
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