Python计算TBS程序

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 # 一个RB中的子载波个数
self.N_sh_symb = 13 # 一个时隙中分配给PDSCH的符号数
self.N_prb_oh = 0 # 由高层参数决定
self.N_prb_dmrs = 12 # 一个时隙中一个PRB宽度中DMRS占用的子载波,DMRS tpye1和DMRS type2两种类型
self.Imcs = Imcs # Imcs(Modulation and Coding Scheme index,调制与编码策略索引)

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_PRB对象,参数scs=30,bw=100
n = N_PRB('maximum_transmission_bandwidth_configuration_Nrb.xlsx', 15, 20)
# 查询PRB数量
print("/---------------------------------------------------------------\\")
Nprb = n.calculate_N_prb()
print("\\---------------------------------------------------------------/")

# 创建TBS对象
TBS1 = TBS(Nprb, 'MCS index table 2 for PDSCH.xlsx', 26)
# TBS1.calculate_N_re()
# TBS1.calculate_N_info()
# TBS1.calculate_q_N_info()
print("/---------------------------------------------------------------\\")
TBS1.calculate_TBS()
print("\\---------------------------------------------------------------/")

# 创建N_bits对象
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("\\---------------------------------------------------------------/")