1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
| from openpyxl import load_workbook import math
class N_PRB: """ 由给定参数获得分配给PDSCH的PRB(Physical resource block,物理资源块)数量 """
def __init__(self, file_path, scs, bw): """ 创建PRB查询对象 :param file_path: PRB表的路径(该表可由scs和bw查PRB值) :param scs: sub carrier spacing,子载波间隔(kHz) :param bw: bandwidth,载波带宽(MHz) """ self.table = load_workbook(file_path) self.sheet = self.table['Sheet1'] self.scs = scs self.bw = bw
def calculate_N_prb(self): """ 通过参数scs和bw查表得到PRB(Physical resource block,物理资源块)数量 :return:PRB(Physical resource block,物理资源块)数量 """ try: for line in range(3, 6): if self.scs == int(self.sheet['A' + str(line)].value): for column in range(66, 78): if self.bw == int(self.sheet[chr(column) + '1'].value): N_prb = int(self.sheet[chr(column) + str(line)].value) print("scs=%dkHz,bw=%dMHz ===> PRB数量=%d" % (self.scs, self.bw, N_prb)) return N_prb except ValueError: print("calculate_N_prb运行失败,scs=%dkHz,bw=%dMHz无对应PRB值" % (self.scs, self.bw))
class TBS: """ 通过给定参数获得TBS(Transport Block Size,传输块大小)数值 """
def __init__(self, N_prb, file_path, Imcs): """ 创建Imcs表对象,相关参数赋值 :param N_prb:PRB(Physical resource block,物理资源块)数量 :param file_path:Imcs表的路径,该表可由Imcs(Modulation and Coding Scheme index,调制与编码策略索引)值 查对应qm(调制阶数)和R(码率) :param Imcs:Imcs(Modulation and Coding Scheme index,调制与编码策略索引) """ self.N_prb = N_prb self.table = load_workbook(file_path) self.sheet = self.table['Sheet1'] self.N_rb_sc = 12 self.N_sh_symb = 13 self.N_prb_oh = 0 self.N_prb_dmrs = 12 self.Imcs = Imcs
def calculate_N_re(self): """ 计算给定带宽中一个时隙内分配给PDSCH的RE(Resource Element,资源元素)数量 :return: RE(Resource Element,资源元素)数量 """ try: N_re_t = min(156, self.N_rb_sc * self.N_sh_symb - self.N_prb_dmrs - self.N_prb_oh) N_re = int(N_re_t * self.N_prb) print("在包含%d个RB的带宽中,一个时隙内分配给PDSCH的RE数量=%d" % (self.N_prb, N_re)) return N_re except TypeError: print("Calculate_N_re运行失败,重新设置scs与bw的值,以获取可用PRB数量值")
def calculate_N_info(self): """ 计算信息比特数 :return:信息比特数 """ try: Nre = self.calculate_N_re() v = 1 for line in range(2, 34): if self.Imcs == int(self.sheet['A' + str(line)].value): qm = int(self.sheet['B' + str(line)].value) R = float(self.sheet['c' + str(line)].value) / 1024 N_info = Nre * qm * v * R print("MAC层向物理层传输的一个TB中的信息比特数=%d bits" % N_info) return N_info except TypeError: print("calculate_N_info运行失败,重新设置scs与bw的值,以获取可用PRB数量值")
def calculate_q_N_info(self): """ 计算信息比特数的量化中间数 :return:信息比特数的量化中间数 """ try: Ninfo = self.calculate_N_info() if Ninfo > 3824: n = int(math.log((Ninfo - 24), 2) - 5) q_N_info = max(3840, math.pow(2, n) * round((Ninfo - 24) / math.pow(2, n))) else: n = max(3, int(math.log(Ninfo, 2) - 6)) q_N_info = max(24, math.pow(2, n) * round(Ninfo / math.pow(2, n))) print("信息比特数的量化中间值=%d bits" % q_N_info) return q_N_info except TypeError: print("calculate_q_N_info运行失败,重新设置scs与bw的值,以获取可用PRB数量值")
def calculate_TBS(self): """ 计算TBS(Transport Block Size,传输块大小) :return: TBS(Transport Block Size,传输块大小) """ try: qNinfo = self.calculate_q_N_info() for line in range(2, 34): if self.Imcs == int(self.sheet['A' + str(line)].value): R = float(self.sheet['c' + str(line)].value) / 1024 if R < 0.25: C = math.ceil(float(qNinfo + 24) / 3816) TBS = 8 * C * math.ceil((qNinfo + 24) / (8 * C)) - 24 else: C = math.ceil(float(qNinfo + 24) / 8424) if qNinfo > 8424: TBS = 8 * C * math.ceil((qNinfo + 24) / (8 * C)) - 24 else: TBS = 8 * math.ceil((qNinfo + 24) / (8 * C)) - 24 print('TBS = %d bits' % TBS) return TBS except TypeError: print("calculate_TBS运行失败,重新设置scs与bw的值,以获取可用PRB数量值")
class N_bits: """ 计算在给定参数下,一个RB所含的比特数、一个OFDM符号所含比特数 """
def __init__(self, file_path, xQAM, scs, bw): """ :param file_path: PRB表的路径(该表可由scs和bw查PRB值) :param xQAM: 调制方式,16QAM, 64QAM and 256QAM :param scs: sub carrier spacing,子载波间隔(kHz) :param bw: bandwidth,载波带宽(MHz) """ self.table = load_workbook(file_path) self.sheet = self.table['Sheet1'] self.xQAM = xQAM self.scs = scs self.bw = bw
def calculate_N_RPB_bits(self): """ :return: 一个RB所含的比特数 """ N_prb_bits = math.log(self.xQAM, 2) * 12 print("选用%dQAM调制,一个RB所含比特数=%d bits" % (self.xQAM, N_prb_bits)) return N_prb_bits
def calculate_N_symb_bits(self): """ :return: 一个OFDM符号所含的比特数 """ try: for line in range(3, 6): if self.scs == int(self.sheet['A' + str(line)].value): for column in range(66, 78): if self.bw == int(self.sheet[chr(column) + '1'].value): N_prb = int(self.sheet[chr(column) + str(line)].value) N_symb_bits = N_prb * math.log(self.xQAM, 2) * 12 print("scs=%dkHZ,bw=%dMHz,选用%dQAM调制,一个OFDM符号所含比特数=%d bits" % (self.scs, self.bw, self.xQAM, N_symb_bits)) except ValueError: print("calculate_N_symb_bits运行失败,scs=%dkHz,bw=%dMHz无对应PRB值" % (self.scs, self.bw))
if __name__ == '__main__': n = N_PRB('maximum_transmission_bandwidth_configuration_Nrb.xlsx', 15, 20) print("/---------------------------------------------------------------\\") Nprb = n.calculate_N_prb() print("\\---------------------------------------------------------------/")
TBS1 = TBS(Nprb, 'MCS index table 2 for PDSCH.xlsx', 26) print("/---------------------------------------------------------------\\") TBS1.calculate_TBS() print("\\---------------------------------------------------------------/")
xQAM_RB = N_bits('maximum_transmission_bandwidth_configuration_Nrb.xlsx', 64, 30, 20) print("/---------------------------------------------------------------\\") xQAM_RB.calculate_N_RPB_bits() xQAM_RB.calculate_N_symb_bits() print("\\---------------------------------------------------------------/")
|