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