Beispiel #1
0
def get_mi_estimate(K, m, n, r, l, SNR, H, A, filename):

    TxNet, RxNet, Normalize, V, U, R = ae_load_model(K, filename, m, n, r, l,
                                                     SNR, H, A)
    L1 = 10
    L2 = 1000

    X_data = np.zeros((L1 * L2, K))
    Y_data = np.zeros((L1 * L2, K))

    MI = np.zeros(K)

    for j in range(L1):
        _, SignalIn, _, Noise = prepare_data(K, m, n, r, V, U, R, SNR, L2)
        _, Rx = get_output(TxNet, RxNet, Normalize, K, SignalIn, Noise, H)

        for k in range(K):

            for t1 in range(L2):
                X_data[1000 * j + t1, k] = np.array(SignalIn[k])[t1, 0]
                Y_data[1000 * j + t1, k] = np.array(Rx[k])[t1, 0]

    for k in range(K):

        X = X_data[:, k].reshape(-1, 1)
        Y = np.squeeze(Y_data[:, k])
        M = mutual_info_regression(X, Y)
        MI[k] = M

    return MI
Beispiel #2
0
def train_save_model(
    K,
    filename,
    filename1,
    m,
    n,
    r,
    l,
    SNR,
    H,
    A,
    n1,
    n2,
    n3,
    save=False,
    check=True,
):

    TxNet, RxNet, Normalize, V, U, R = ae_load_model(K, filename1, m, n, r, l,
                                                     SNR, H, A)

    snr = 10**(np.array(SNR) / 10)
    snr = n * snr

    b_s = 1000

    _, SignalIn, TxOut, Noise = prepare_data(K, m, n, r, V, U, R, SNR, b_s)

    MSE = []
    for _ in range(n1):
        TxNet, Normalize, mse = update_weights_encoder(TxNet, Normalize, K,
                                                       SignalIn, TxOut, 0.005)
        print(mse)
        MSE.append(mse)

    for _ in range(n2):

        RxNet, mse = update_weights_decoder(TxNet, Normalize, RxNet, K,
                                            SignalIn, H, Noise, 0.001)
        # RxNet, mse = update_weights_decoder(
        #     RxNet, K, SignalIn, H, Noise, 0.001, V, R, SNR
        # )
        print(mse)
        MSE.append(mse)

    for _ in range(n3):
        TxNet, RxNet, Normalize, mse = update_weights_end(
            TxNet, RxNet, Normalize, K, SignalIn, H, Noise, 0.001)
        print(mse)
        MSE.append(mse)

    if save:
        save_weights(K, filename, TxNet, RxNet, Normalize, U, V, R, MSE, check)
Beispiel #3
0
def get_mse_ber(K, m, n, r, l, SNR, H, A, filename):

    TxNet, RxNet, Normalize, V, U, R = ae_load_model(K, filename, m, n, r, l,
                                                     SNR, H, A)
    L1 = 10
    L2 = 1000

    if m == "Gaussian":
        MSE = np.zeros((L1, K))
    else:
        MSE = np.zeros((L1, K))
        BER = np.zeros((L1, K))
        SER = np.zeros((L1, K))

    for j in range(L1):
        MessageIn, SignalIn, _, Noise = prepare_data(K, m, n, r, V, U, R, SNR,
                                                     L2)
        # _, Rx = get_output(TxNet, RxNet, Normalize, K, SignalIn, Noise, H, V, U, R, SNR)
        _, Rx = get_output(TxNet, RxNet, Normalize, K, SignalIn, Noise, H)

        for k in range(K):
            if m == "Gaussian":
                MSE[j, k] = np.mean((Rx[k] - SignalIn[k])**2)
            else:
                MSE[j, k] = np.mean((Rx[k] - SignalIn[k])**2)
                msg_det = PAMDemod(np.array(Rx[k]), m, 1).astype(int)
                # SER

                SER[j, k] = np.sum((msg_det != MessageIn[k]).astype(int)) / L2

                # BER

                Mc = np.array([
                    tuple(int(c) for c in "{:02b}".format(i))
                    for i in MessageIn[k]
                ])
                M1 = np.array([
                    tuple(int(c) for c in "{:02b}".format(i)) for i in msg_det
                ])
                BER[j, k] = np.sum(abs(M1 - Mc)) / (m * L2)

    if m == "Gaussian":
        return np.squeeze(np.mean(MSE, axis=0))
    else:
        return (
            np.squeeze(np.mean(MSE, axis=0)),
            np.squeeze(np.mean(BER, axis=0)),
            np.squeeze(np.mean(SER, axis=0)),
        )
Beispiel #4
0
def check_noise_dist(K, m, n, r, l, SNR, H, A, filename):

    TxNet, RxNet, Normalize, V, U, R = ae_load_model(K, filename, m, n, r, l,
                                                     SNR, H, A)
    L1 = 10
    L2 = 1000

    filt_noise = np.zeros(L1 * L2)
    t = 0
    for _ in range(L1):
        _, SignalIn, _, Noise = prepare_data(K, m, n, r, V, U, R, SNR, L2)
        _, Rx = get_output(TxNet, RxNet, Normalize, K, SignalIn, Noise, H)
        for t1 in range(1000):
            filt_noise[t] = np.array(Rx[0] - SignalIn[0])[t1, 0]
            t += 1
    return filt_noise
Beispiel #5
0
def ae_load_model(K, filename, m, n, r, l, SNR, H, A):

    snr = 10**(np.array(SNR) / 10)
    snr = n * snr

    n_b = 1
    b_s = 1000

    try:
        Network = pickle.load(open(filename, "rb"))
        V = Network["V"]
        U = Network["U"]
        Rp = Network["R"]
    except:
        Vp, Up, Rp = generate_beamvectors(K, A, n, SNR)
        V = np.transpose(np.array(Vp))[0, :, :]
        U = np.transpose(np.array(Up))[0, :, :]

    _, SignalIn, TxOut, Noise = prepare_data(K, m, n, r, V, U, Rp, SNR, b_s)

    TxNet, RxNet, Normalize = model_init(
        K,
        m,
        n,
        l,
        r,
        n_b,
        b_s,
        H,
        SignalIn,
        Noise,
        TxOut,
        snr,
    )
    try:
        Network = pickle.load(open(filename, "rb"))
        for k in range(K):
            TxNet[k].set_weights(Network["TX"][k])
            RxNet[k].set_weights(Network["RX"][k])
            Normalize[k].set_weights(Network["NORM"][k])
    except:
        print("Untrained Model Loaded")
        pass

    return TxNet, RxNet, Normalize, V, U, Rp