コード例 #1
0
                for m in range(numCandidate):
                    metrics = np.zeros(2)
                    observations = []
                    for j in range(2):
                        A = PDCCHGenerator.numInformationBits[j]
                        K = A + PDCCHGenerator.numCRCBits
                        cword = codewords[cword_offset + m + j * numCandidate]
                        cword = cword.astype(np.int)
                        bpsksymbols = 1 - 2 * cword
                        receive_symbols = bpsksymbols + np.random.normal(loc=0, scale=sigma, size=(1, len(cword)))
                        receive_symbols_llr = receive_symbols * (2 / sigma ** 2)
                        decoded_bits, metric = SCLOneDecoders[dec_offset + j].decode(receive_symbols_llr)

                        dec_information_bits = decoded_bits[:-PDCCHGenerator.numCRCBits]
                        dec_crc = decoded_bits[-PDCCHGenerator.numCRCBits:]
                        crcCheck = CRCEncoder.encode(dec_information_bits)[-PDCCHGenerator.numCRCBits:]
                        crcCheck[-PDCCHGenerator.numRNTIBits:] = crcCheck[-PDCCHGenerator.numRNTIBits:] ^ RNTI

                        metrics[j] = metric / (N - K)
                        observations.append(receive_symbols_llr)

                        if np.all(crcCheck == dec_crc):
                            crcPassedNoisyObservation.append(receive_symbols_llr)
                            crcPassedDecoderIdx.append(dec_offset + j)
                            crcPassedIdx.append(cword_offset + m + j * numCandidate)

                    # For each candidate, select the DCI format with smaller DM, this step reduce the number candidate by a half
                    argminDM = int(np.argmin(metrics))
                    DCIWinnerNoisyObservation.append(observations[argminDM])
                    DCIWinnerIdx.append(cword_offset + m + argminDM * numCandidate)
                    DCIWinnerDecoderIdx.append(dec_offset + argminDM)
frozenbitsPesedo, messagebitsPesedo, _, _ = codeConstructor.PW(N, PesodoK)
polarPesedoEncoder = PolarEnc(N, PesodoK, frozenbitsPesedo, messagebitsPesedo)

crcEnc = CRCEnc(crc_n=numCRC, crc_polynominal=crcPoly)

# Try Complete Noise / Random Codewords / Regular Polar Codes
numSimulation = 2 * 10**4
DMetricsAnother = []
DMetricsRegular = []
pbar = tqdm(range(numSimulation))
for _ in pbar:
    choice = np.random.randint(low=0, high=2)
    if choice == 0:
        # two mode: pure random codeword / polar encoded but with different information bit length
        msg = np.random.randint(low=0, high=2, size=pesedoA)
        msg_crc = crcEnc.encode(msg)
        cword = polarPesedoEncoder.encode(msg)
        cword = cword.astype(np.int)
        bpsksymbols = 1 - 2 * cword
    else:
        msg = np.random.randint(low=0, high=2, size=A)
        msg_crc = crcEnc.encode(msg)
        cword = polarEncoder.encode(msg_crc)
        cword = cword.astype(np.int)
        bpsksymbols = 1 - 2 * cword

    receive_symbols = bpsksymbols + np.random.normal(
        loc=0, scale=sigma, size=(1, N))
    receive_symbols_llr = receive_symbols * (2 / sigma**2)
    DMetric = DMetricCalculator.getDMetric(receive_symbols_llr)
    if choice == 0:
コード例 #3
0
class CandidateGenerator():
    def __init__(self):
        self.PWPath = os.path.join(os.getcwd(), "reliable_sequence.txt")
        self.numAggregationLevel = 3
        self.numCandidates = 44
        self.numRNTIBits = 16
        self.numCandidatePerAggregationLevel = np.array([6, 6, 10])
        self.codewordLengthPerAggregationLevel = np.array([128, 256, 512])
        self.maxInformationLength = 140
        self.numInformationBits = np.array([16, 57])
        self.numCRCBits = 24
        self.crcPoly = [24, 23, 21, 20, 17, 15, 13, 12, 8, 4, 2, 1, 0]
        self.polarEncoders = []
        self.codeConstructor = PolarCodeConstructor(QPath=self.PWPath)
        self.crcEncoder = CRCEnc(self.numCRCBits, self.crcPoly)
        self.initialize_encoders()

    def initialize_encoders(self):
        self.frozenbits_set = []
        self.messagebits_set = []
        self.frozenbits_indicator_set = []
        self.messagebits_indicator_set = []
        for i in range(self.numAggregationLevel):
            N = self.codewordLengthPerAggregationLevel[i]
            encoder = []
            frozenbits_set = []
            messagebits_set = []
            frozenbits_indicator_set = []
            messagebits_indicator_set = []
            for A in self.numInformationBits:
                K = A + self.numCRCBits
                frozenbits, messagebits, frozenbits_indicator, messagebits_indicator = self.codeConstructor.PW(
                    N, K)
                frozenbits_set.append(frozenbits)
                messagebits_set.append(messagebits)
                frozenbits_indicator_set.append(frozenbits_indicator)
                messagebits_indicator_set.append(messagebits_indicator)
                encoder.append(PolarEnc(N, K, frozenbits, messagebits))
            self.polarEncoders.append(encoder)
            self.frozenbits_set.append(frozenbits_set)
            self.messagebits_set.append(messagebits_set)
            self.frozenbits_indicator_set.append(frozenbits_indicator_set)
            self.messagebits_indicator_set.append(messagebits_indicator_set)

    def generate_candidates(self, isRNTI):
        codewords = []
        information_bits = []
        if isRNTI:
            RNTIIndex = np.random.randint(low=0, high=self.numCandidates)
        else:
            RNTIIndex = -1
        RNTI = np.random.randint(low=0,
                                 high=2,
                                 size=self.numRNTIBits,
                                 dtype=np.int)
        cnt = 0
        for i in range(self.numAggregationLevel):
            for m in range(2):
                A = self.numInformationBits[m]
                for j in range(self.numCandidatePerAggregationLevel[i]):
                    msg = np.random.randint(low=0, high=2, size=A)
                    msg_crc = self.crcEncoder.encode(msg)
                    if cnt == RNTIIndex:
                        msg_crc[-self.numRNTIBits:] = np.mod(
                            msg_crc[-self.numRNTIBits:] + RNTI, 2)
                    codeword = self.polarEncoders[i][m].encode(msg_crc)
                    codeword = codeword.astype(np.int)
                    codewords.append(codeword)
                    information_bits.append(msg)
                    cnt += 1
        return information_bits, codewords, RNTI, RNTIIndex