|
- import numpy as np
- from py_matlab_tools.LFMgen import convert_matlablinspace2numpy
-
- def toeplitz(c, r): # 生成托普利茨矩阵
- c = np.array(c)
- r = np.array(r)
-
- # 将c与r的全部元素构成列向量
- m, n = c.shape
- y, z = r.shape
- temp1 = []
- temp2 = []
- for i in range(n):
- for temp in c:
- temp1.append(temp[i])
- for i in range(z):
- for temp in r:
- temp2.append(temp[i])
-
- c = temp1
- r = temp2
-
- p = len(r)
- m = len(c)
-
- x = list(r[p - 1:0:-1])
- for i in c:
- x.append(i)
-
- temp3 = np.arange(0, m)
- temp4 = np.arange(p - 1, -1, -1)
-
- temp3.shape = (m, 1)
- temp4.shape = (1, p)
-
- ij = temp3 + temp4
- t = np.array(x)[ij]
-
- return t
-
-
- def get_front_labels(label_file):
- res = []
- f = open(label_file, 'r')
- all_data = f.readlines()
- f.close()
- for item in all_data:
- res.append(int(item[:-1].strip()))
- return res
-
- def symbols_to_bpsk_signal(symbols, fs=128000):
- fc = 10000 # 载波频率
- symbol_rate = 1000
- num_bits = int(fs / symbol_rate) # 128 bits per symbol
- ts = convert_matlablinspace2numpy(0, 1, (num_bits-1))
- ts = ts / np.double(fs)
- symbols = -2 * symbols + 1 # 码元转换成双极性波0-->1 1-->-1
- result = np.zeros(len(symbols) * num_bits)
- for i, symb in enumerate(symbols):
- this_bpsk_signal = np.ones(num_bits) * symb * np.sin(2 * np.pi * fc * ts)
- result[i*num_bits: (i+1)*num_bits] = this_bpsk_signal
- return result
-
-
- def BPSKdemod(current_window_wav, decoding_window=20, fc=10000, fs=128000):
- current_window_wav = current_window_wav.reshape(-1)
- points_per_bit = 128
- # ts_demodul = np.arange(0, (points_per_bit * decoding_window) / fs, 1.00 / fs)
- ts_demodul = convert_matlablinspace2numpy(0, 1, (current_window_wav.shape[-1] - 1)) / fs
- data = 2 * current_window_wav * np.sin(2 * np.pi * fc * ts_demodul)
-
- data_rec = np.zeros(decoding_window)
- for i in range(decoding_window):
- start = i * points_per_bit + points_per_bit * 2 / 16
- end = (i + 1) * points_per_bit - points_per_bit * 2 / 16
- tmp = np.sum(data[int(start):int(end)])
- if (tmp == 0):
- start = i * points_per_bit + points_per_bit * 4 / 16
- end = (i + 1) * points_per_bit - points_per_bit * 4 / 16
- data_rec[i] = np.sign(np.sum(data[int(start):int(end)]))
- else:
- data_rec[i] = np.sign(tmp)
- data_rec = -1 / 2 * (data_rec - 1)
- return np.abs(data_rec)
-
-
- def MMSE_process(current_window_receive_data, channel_reponse):
- q = np.zeros(current_window_receive_data.shape[0])
-
- H = toeplitz(channel_reponse, q)
- H_inv = np.matmul(np.transpose(H), H) + 0.000000001 * np.eye(current_window_receive_data.shape[0])
-
- trans_matrix = np.matmul(np.linalg.inv(H_inv), np.transpose(H))
- MMSE_output = np.matmul(trans_matrix, current_window_receive_data)
- return MMSE_output
-
-
- def iter_demod(afterTR_signal, bpsk_signal, fs=128000):
- Nl = 20 # 前导码的长度
- Nb = 20 # 每段长度
- Ns = 10 # 滑动距离
- symbol_rate = 1000
- num_bits = int(fs / symbol_rate) # 128 bits per symbol
- len = Nb * num_bits
- Nb_num = Nb * num_bits # 每段采样点数
- Ns_num = Ns * num_bits # 滑动的点数
- N_symbol = 1000
- K = np.floor((N_symbol - Nb) / Ns) + 1 #迭代次数
- for i in range(K):
- r = afterTR_signal[i*Ns_num: i*Ns_num + Nb_num]
- if i == 0:
- DATAa = bpsk_signal[i*Ns_num: i*Ns_num + Nb_num]
- p = np.zeros(len)
- else:
- pass
-
-
-
- if __name__ == '__main__':
- # front_label_file = '../forUser_C/C榜前导/comm0929_20.txt'
- # front_labels = get_front_labels(front_label_file)
- # print(front_labels, len(front_labels))
- #
- # result_bpsk_signal = symbols_to_bpsk_signal(np.array(front_labels))
- # plt.plot(result_bpsk_signal[:256])
- # plt.show()
-
-
- # demod reconstruct_s for test, passed!
- import mat4py
- from dataset_tools.dataset_newer_1012 import normalization
- reconstruct_s_file = '../recon_test_s/comm929_20_slice0.mat'
- reconstruct_s = np.array(mat4py.loadmat(reconstruct_s_file)['s'])
- print(reconstruct_s)
-
- res = BPSKdemod(normalization(reconstruct_s))
- print(res)
|