Esempio n. 1
0
    def demodulate_ofdm_dft(self, y, h_s, h_s_len):
        Hc = ofdm.circulant_channel(h_s.T, h_s_len, self.subcarrier)
        D = self.dft_mat @ Hc @ self.idft_mat
        D_1 = np.linalg.inv(D)

        one_block = self.subcarrier_CP
        y_p = y.reshape((one_block, -1), order='F')
        y_removed_cp = np.matmul(self.cp_zero, y_p)
        y_dft = np.matmul(self.dft_mat, y_removed_cp)
        s_s = np.matmul(D_1, y_dft)
        s_s = s_s.flatten(order='F')
        return s_s
Esempio n. 2
0
    def demodulate_ofdm_dft_mmse(self, y, h_s, h_s_len, sigma):
        Hc = ofdm.circulant_channel(h_s.T, h_s_len, self.subcarrier)
        D = self.dft_mat @ Hc @ self.idft_mat
        MMSE = D.conj().T / (D * D.conj().T + sigma**2)
        D_1 = MMSE

        one_block = self.subcarrier_CP
        y_p = y.reshape((one_block, -1), order='F')
        y_removed_cp = np.matmul(self.cp_zero, y_p)
        y_dft = np.matmul(self.dft_mat, y_removed_cp)
        s_s = np.matmul(D_1, y_dft)
        s_s = s_s.flatten(order='F')
        return s_s
Esempio n. 3
0
ofdm_zero = np.hstack((np.zeros((params["subcarrier"], params["CP"])), np.eye(params["subcarrier"])))

F = dft(params['subcarrier'], "sqrtn")
FH = F.conj().T

snrs_db = m.snr_db(params['SNR_MIN'], params['SNR_MAX'], params['SNR_NUM'])
sigmas = m.sigmas(snrs_db)
errors = np.zeros((params['SNR_NUM'], params['SNR_AVERAGE']))
q_errors = np.zeros((params['SNR_NUM'], params['SNR_AVERAGE']))

for trials_index in range(params['SNR_AVERAGE']):
    h_si = m.channel(1, params['chanel_len'])
    H = ofdm.toeplitz_channel(h_si.T, params['chanel_len'], params['subcarrier'], params['CP'])
    z_H = np.hstack((np.zeros((H.shape[0], params["subcarrier"] + params["CP"] - 3)), H))
    Hc = ofdm.circulant_channel(h_si.T, params['chanel_len'], params['subcarrier'])

    D = F @ Hc @ FH
    D_1 = np.linalg.inv(D)

    for sigma_index, sigma in enumerate(sigmas):
        d = np.random.choice([0, 1], (params['subcarrier'] * 2 * params['block'], 1))
        s_n = m.modulate_qpsk(d)
        s = s_n.reshape(params['subcarrier'], params['block'])
        x = np.matmul(FH, s)
        x_cp = ofdm.add_cp(x, params['CP'])

        x_receive = x_cp
        if params["chanel_len"] > 1:
            x_receive = np.zeros((params['chanel_len'] - 1 + x_cp.shape[0], x_cp.shape[1]), dtype=complex)
            x_receive[:(params["chanel_len"] - 1), 1:] = x_cp[-(params["chanel_len"] - 1):, :-1]