def test_002_frozen_bit_positions(self): for snr in np.arange(-1.5, 3.5, .25): for inv_coderate in np.array([8, 6, 5, 4, 3, 2, 1.5, 1.2]): for n in range(6, 11): N = 2**n K = int(N / inv_coderate) # print(N, K, inv_coderate) cf = pypolar.frozen_bits(N, K, snr) eta = design_snr_to_bec_eta(snr, 1. * K / N) polar_capacities = calculate_bec_channel_capacities(eta, N) pf = get_frozenBitPositions(polar_capacities, N - K) pf = np.sort(pf) decoder = pypolar.PolarDecoder(N, 1, cf, "mixed") pd = decoder.frozenBits() self.assertListEqual(cf, pd) self.assertListEqual(cf, list(pf))
def search_code_weights(N, K, design_snr_db): f = pypolar.frozen_bits(N, K, design_snr_db) p = pypolar.PolarEncoder(N, f) numInfoWords = 2**K weights = {} for i in range(numInfoWords): b = np.binary_repr(i, K) u = np.array([int(l) for l in b], dtype=np.uint8) nbp = np.packbits(u) cw = p.encode_vector(nbp) c = np.unpackbits(cw) weight = np.sum(c) if weight in weights: weights[weight] += 1 else: weights[weight] = 1 weights.pop(0) print(weights) return weights
def _generate_frozen_bit_positions(self): return np.array( frozen_bits(self._block_length, self._info_length, self._dSNR))
def calculate_code_properties(N, K, design_snr_db): eta = design_snr_to_bec_eta(design_snr_db, 1.0 * K / N) polar_capacities = calculate_bec_channel_capacities(eta, N) frozenBitMap = get_frozenBitMap(polar_capacities, N - K) f = pypolar.frozen_bits(N, K, design_snr_db) p = pypolar.PolarEncoder(N, f) Gp = get_polar_generator_matrix(int(np.log2(N))) print(Gp) assert np.all(np.where(frozenBitMap > -1) == f) numInfoWords = 2 ** K n_prepend_bits = int(8 * np.ceil(K / 8.) - K) print(n_prepend_bits) weights = {} for i in range(numInfoWords): # b = np.binary_repr(i, K + n_prepend_bits) b = np.binary_repr(i, K) u = np.array([int(l) for l in b], dtype=np.uint8) # nb = np.concatenate((np.zeros(n_prepend_bits, dtype=nb.dtype), nb)) nbp = np.packbits(u) cw = p.encode_vector(nbp) # xm = encode_systematic_matrix(u, N, frozenBitMap) c = np.unpackbits(cw) # assert np.all(xm == c) weight = np.sum(c) if weight in weights: weights[weight] += 1 else: weights[weight] = 1 # nb = bin(i) # print(i, b, u, nbp, c) print(f) print(frozenBitMap) # print(n_prepend_bits) weights.pop(0) print(weights) dmin_ext_search = np.min(weights.keys()) print(dmin_ext_search) # validate_systematic_matrix(N, f, frozenBitMap) Gs = get_polar_encoder_matrix_systematic(N, f) P = Gs[:, f] # print(P) G = np.hstack((np.identity(K, dtype=Gs.dtype), P)) H = np.hstack((P.T, np.identity(N - K, dtype=Gs.dtype))) # print(P) print(H) # print(G.dot(H.T) % 2) # # print(Gs.dot(Gs.T) % 2) print(np.linalg.matrix_rank(H)) dmin_H = np.min(np.sum(H, axis=1)) dmin_P = 1 + np.min(np.sum(P, axis=1)) print(np.sum(H, axis=1)) print(np.sum(P, axis=1)) print('search {} vs {} H, P{}'.format(dmin_ext_search, dmin_H, dmin_P)) assert dmin_ext_search == dmin_P