别再死记硬背了!用Python+Matplotlib可视化理解5G CORESET的时频资源分配
用Python+Matplotlib动态解析5G CORESET资源分配机制
刚接触5G物理层概念时,那些密密麻麻的协议文档总让人望而生畏。特别是CORESET(Control Resource Set)这种核心概念,仅靠文字描述很难在脑海中形成具象认知。作为一名曾经被各种缩写折磨的通信工程师,我发现用Python可视化工具动态绘制资源分配图,是理解这些抽象概念的最佳捷径。
1. 环境准备与基础概念可视化
在开始绘制CORESET之前,我们需要先搭建Python环境并理解几个关键术语的实际含义。不同于传统学习方法直接啃协议文本,我们将通过代码逐步构建认知模型。
1.1 安装必要的Python库
pip install numpy matplotlib ipython
Matplotlib是我们主要的绘图工具,而NumPy将帮助处理矩阵运算。建议使用Jupyter Notebook或IPython环境进行交互式学习,这样可以实时看到每个步骤的图形输出。
1.2 CORESET的时空矩阵表示
CORESET本质上是一个时频资源网格,我们可以用二维矩阵来模拟:
import numpy as np
import matplotlib.pyplot as plt
# 创建一个基础的CORESET资源网格
def create_coreset_grid(rb_num=24, symbol_num=3):
return np.zeros((rb_num, symbol_num))
# 示例:6个RB和2个符号的CORESET
coreset = create_coreset_grid(6, 2)
plt.imshow(coreset, cmap='Blues', aspect='auto')
plt.xlabel('OFDM Symbols')
plt.ylabel('Resource Blocks')
plt.title('Basic CORESET Resource Grid')
plt.colorbar(label='Resource Utilization')
plt.show()
这段代码会生成一个6RB×2符号的空白资源网格,蓝色越深表示资源占用越高。这就是CORESET最基本的物理形态——无线资源控制区域中的一个矩形块。
1.3 REG与CCE的可视化拆解
*REG(Resource Element Group) 是CORESET的最小组成单位,而 CCE(Control Channel Element)*则是更高一级的结构:
def plot_reg_cce():
fig, ax = plt.subplots(figsize=(10,6))
# 绘制REG(每个小格子)
for rb in range(6):
for sym in range(2):
rect = plt.Rectangle((sym-0.5, rb-0.5), 1, 1,
fill=False, edgecolor='gray', linewidth=1)
ax.add_patch(rect)
plt.text(sym, rb, f'REG\n({rb},{sym})',
ha='center', va='center', fontsize=8)
# 用不同颜色标记CCE(每组6个REG)
cce_colors = ['#FF9999', '#99FF99']
for i, cce in enumerate([(0,0,1,0,2,0,3,0,4,0,5,0),
(0,1,1,1,2,1,3,1,4,1,5,1)]):
for rb, sym in zip(cce[::2], cce[1::2]):
rect = plt.Rectangle((sym-0.5, rb-0.5), 1, 1,
color=cce_colors[i], alpha=0.3)
ax.add_patch(rect)
plt.text(i+0.5, 2.5, f'CCE {i+1}',
ha='center', va='center', fontsize=12,
bbox=dict(facecolor=cce_colors[i], alpha=0.5))
ax.set_xlim(-0.5, 1.5)
ax.set_ylim(-0.5, 5.5)
ax.set_xticks([0,1])
ax.set_yticks(range(6))
ax.set_xlabel('OFDM Symbols')
ax.set_ylabel('Resource Blocks')
ax.set_title('REG and CCE Structure in CORESET')
plt.grid(True)
plt.show()
plot_reg_cce()
这个可视化清晰地展示了:
- 每个REG对应1个RB×1个符号的物理资源
- 6个REG组成1个CCE(图中用相同颜色标记)
- 不同CCE在时域或频域上的分布方式
2. CORESET配置参数动态演示
理解了基础结构后,我们需要模拟不同配置参数对CORESET形态的影响。这些参数通常在RRC信令中配置,决定了控制信道的资源分配方式。
2.1 时域符号数的影响
CORESET的时域跨度可以是1-3个OFDM符号,这个由 duration 参数控制:
def plot_duration_impact():
fig, axes = plt.subplots(1, 3, figsize=(15,5))
for i, duration in enumerate([1, 2, 3]):
grid = np.random.rand(24, duration) # 随机生成资源占用情况
axes[i].imshow(grid, cmap='OrRd', aspect='auto')
axes[i].set_title(f'duration={duration} symbol(s)')
axes[i].set_xlabel('OFDM Symbols')
if i == 0:
axes[i].set_ylabel('Resource Blocks')
plt.tight_layout()
plt.suptitle('Impact of CORESET Duration Parameter', y=1.05)
plt.show()
plot_duration_impact()
从输出图形可以直观看出:
- 符号数越多,时域资源越丰富
- 但实际系统中,符号数增加会减少数据传输资源
- 典型配置是2-3个符号,平衡控制与数据需求
2.2 频域RB的连续与非连续分配
CORESET在频域上可以配置连续或非连续的RB分配:
def plot_freq_allocation():
fig, axes = plt.subplots(1, 2, figsize=(12,6))
# 连续分配
cont_grid = np.zeros((24,2))
cont_grid[6:12,:] = 1 # 连续6个RB
axes[0].imshow(cont_grid, cmap='Greens', aspect='auto')
axes[0].set_title('Continuous RB Allocation')
# 非连续分配
noncont_grid = np.zeros((24,2))
noncont_grid[[1,3,5,7,9,11],:] = 1 # 间隔的RB
axes[1].imshow(noncont_grid, cmap='Purples', aspect='auto')
axes[1].set_title('Non-Continuous RB Allocation')
for ax in axes:
ax.set_xlabel('OFDM Symbols')
ax.set_ylabel('Resource Blocks')
plt.tight_layout()
plt.show()
plot_freq_allocation()
关键区别:
- 连续分配有利于信道估计和波束赋形
- 非连续分配提供更好的频率分集增益
- 实际系统会根据信道条件动态选择
3. 交织映射机制的可视化解析
CORESET中CCE到REG的映射方式直接影响PDCCH的性能特性。NR标准支持两种映射模式:交织和非交织。
3.1 非交织(本地化)映射
def plot_localized_mapping():
plt.figure(figsize=(10,6))
# 创建6个RB×3符号的CORESET
grid = np.zeros((6,3))
# 标记3个CCE(每个6个REG)
cce_pos = [
[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2)], # CCE 0
[(2,0),(2,1),(2,2),(3,0),(3,1),(3,2)], # CCE 1
[(4,0),(4,1),(4,2),(5,0),(5,1),(5,2)] # CCE 2
]
for i, positions in enumerate(cce_pos):
for rb, sym in positions:
grid[rb,sym] = i+1
plt.text(sym, rb, f'CCE{i}',
ha='center', va='center', fontsize=10)
plt.imshow(grid, cmap='tab20b', aspect='auto')
plt.xlabel('OFDM Symbols')
plt.ylabel('Resource Blocks')
plt.title('Localized (Non-Interleaved) CCE-to-REG Mapping')
plt.colorbar(ticks=[1,2,3], label='CCE Index')
plt.show()
plot_localized_mapping()
非交织映射的特点:
- 每个CCE的REG在频域连续
- 有利于波束赋形和信道估计
- 适合信道条件较好的场景
3.2 交织(分布式)映射
def plot_interleaved_mapping():
plt.figure(figsize=(10,6))
# 创建6个RB×3符号的CORESET
grid = np.zeros((6,3))
# 交织映射的CCE分布
cce_pos = [
[(0,0),(2,0),(4,0),(0,1),(2,1),(4,1)], # CCE 0
[(1,0),(3,0),(5,0),(1,1),(3,1),(5,1)], # CCE 1
[(0,2),(2,2),(4,2),(1,2),(3,2),(5,2)] # CCE 2
]
for i, positions in enumerate(cce_pos):
for rb, sym in positions:
grid[rb,sym] = i+1
plt.text(sym, rb, f'CCE{i}',
ha='center', va='center', fontsize=10)
plt.imshow(grid, cmap='tab20c', aspect='auto')
plt.xlabel('OFDM Symbols')
plt.ylabel('Resource Blocks')
plt.title('Interleaved CCE-to-REG Mapping')
plt.colorbar(ticks=[1,2,3], label='CCE Index')
plt.show()
plot_interleaved_mapping()
交织映射的优势:
- REG分散在更宽的频带
- 获得频率分集增益
- 适合多用户或信道条件较差的场景
实际系统中,基站会根据UE反馈的信道质量指示(CQI)动态选择映射方式。好的信道条件下使用本地化映射提高频谱效率,差的条件下使用交织映射增强鲁棒性。
4. 聚合等级与搜索空间实战模拟
聚合等级(Aggregation Level)和搜索空间(Search Space)是CORESET应用中的两个关键概念,直接影响PDCCH的检测性能。
4.1 聚合等级的可视化对比
聚合等级定义了单个PDCCH使用的CCE数量,直接影响控制信道的可靠性:
| 聚合等级 | CCE数量 | 适用场景 |
|---|---|---|
| 1 | 1 | 极好信道条件 |
| 2 | 2 | 好信道条件 |
| 4 | 4 | 一般信道条件 |
| 8 | 8 | 较差信道条件 |
| 16 | 16 | 极差信道条件 |
def plot_aggregation_levels():
fig, axes = plt.subplots(2, 3, figsize=(15,10))
levels = [1, 2, 4, 8, 16]
for i, al in enumerate(levels):
ax = axes[i//3, i%3]
grid = np.zeros((24,3))
# 随机选择起始CCE
start_cce = np.random.randint(0, 24//al)
for j in range(al):
cce_idx = start_cce + j
# 标记该CCE的所有REG
for rb in range(6):
for sym in range(3):
if (rb//2 + sym*3) == cce_idx:
grid[rb,sym] = 1
ax.imshow(grid, cmap='binary', aspect='auto')
ax.set_title(f'AL={al} ({al} CCEs)')
ax.set_xlabel('Symbols')
if i%3 == 0:
ax.set_ylabel('RBs')
# 隐藏多余的子图
axes[1,2].axis('off')
plt.tight_layout()
plt.suptitle('PDCCH Candidates with Different Aggregation Levels', y=1.02)
plt.show()
plot_aggregation_levels()
从可视化中可以观察到:
- 高聚合等级占用更多资源,但解码可靠性更高
- UE需要盲检不同聚合等级的PDCCH候选
- 实际系统会根据信道条件自适应选择
4.2 搜索空间动态生成
搜索空间定义了UE需要监测的PDCCH候选位置集合:
def generate_search_space(coreset_rbs=24, coreset_symbols=3, al=4):
total_cces = (coreset_rbs * coreset_symbols) // 6
num_candidates = total_cces // al
search_space = []
for i in range(num_candidates):
start_cce = i * al
candidate = list(range(start_cce, start_cce + al))
search_space.append(candidate)
return search_space
# 示例:生成AL=4的搜索空间
search_space = generate_search_space(al=4)
print(f"Search space candidates (AL=4): {search_space}")
典型输出:
Search space candidates (AL=4): [
[0,1,2,3], [4,5,6,7],
[8,9,10,11], [12,13,14,15]
]
结合可视化:
def plot_search_space():
ss = generate_search_space(al=4)
grid = np.zeros((24,3))
for i, candidate in enumerate(ss):
for cce in candidate:
# 标记该CCE的所有REG
for rb in range(24):
for sym in range(3):
if (rb//6 + sym*4) == cce:
grid[rb,sym] = i+1
plt.figure(figsize=(10,6))
plt.imshow(grid, cmap='tab20', aspect='auto')
plt.xlabel('OFDM Symbols')
plt.ylabel('Resource Blocks')
plt.title('Search Space with AL=4 (4 Candidates)')
plt.colorbar(label='PDCCH Candidate Index')
plt.show()
plot_search_space()
搜索空间的关键特性:
- 每个候选对应可能的PDCCH位置
- UE需要盲检所有候选
- 候选数量与聚合等级成反比
- 公共搜索空间(CSS)和UE专用搜索空间(USS)有不同的配置规则
5. 完整CORESET仿真系统搭建
现在我们将前面所有知识点整合,构建一个完整的CORESET仿真系统,可以动态配置各种参数并可视化结果。
5.1 CORESET配置类设计
class CORESET_Config:
def __init__(self, rb_num=24, symbol_num=3,
interleaved=False, aggregation_level=4):
self.rb_num = rb_num # 频域RB数量
self.symbol_num = symbol_num # 时域符号数量
self.interleaved = interleaved # 是否交织映射
self.aggregation_level = aggregation_level # 聚合等级
# 计算总CCE数量
self.total_reg = rb_num * symbol_num
self.total_cce = self.total_reg // 6
# 生成搜索空间
self.search_space = self._generate_search_space()
def _generate_search_space(self):
num_candidates = self.total_cce // self.aggregation_level
search_space = []
for i in range(num_candidates):
start_cce = i * self.aggregation_level
candidate = list(range(start_cce, start_cce + self.aggregation_level))
search_space.append(candidate)
return search_space
def plot_configuration(self):
fig, ax = plt.subplots(figsize=(10,6))
grid = np.zeros((self.rb_num, self.symbol_num))
# 标记REG和CCE
for cce_idx in range(self.total_cce):
reg_count = 0
for sym in range(self.symbol_num):
for rb in range(self.rb_num):
if self.interleaved:
# 交织映射计算
if (rb % (self.rb_num//self.total_cce) == cce_idx % (self.rb_num//self.total_cce)):
grid[rb,sym] = cce_idx + 1
else:
# 非交织映射
if (rb // (self.rb_num//self.total_cce)) == cce_idx:
grid[rb,sym] = cce_idx + 1
# 绘制搜索空间候选
for i, candidate in enumerate(self.search_space):
for cce in candidate:
for sym in range(self.symbol_num):
for rb in range(self.rb_num):
if grid[rb,sym] == cce + 1:
plt.text(sym, rb, f'C{i}',
ha='center', va='center', fontsize=8)
plt.imshow(grid, cmap='plasma', aspect='auto')
title = f"CORESET Configuration\n"
title += f"RBs: {self.rb_num}, Symbols: {self.symbol_num}, "
title += f"Mapping: {'Interleaved' if self.interleaved else 'Localized'}, "
title += f"AL: {self.aggregation_level}"
plt.title(title)
plt.xlabel('OFDM Symbols')
plt.ylabel('Resource Blocks')
plt.colorbar(label='CCE Index')
plt.show()
# 示例使用
config1 = CORESET_Config(rb_num=12, symbol_num=2,
interleaved=False, aggregation_level=2)
config1.plot_configuration()
config2 = CORESET_Config(rb_num=24, symbol_num=3,
interleaved=True, aggregation_level=4)
config2.plot_configuration()
5.2 动态参数调整界面
为了更直观地探索参数影响,我们可以创建交互式控件:
from ipywidgets import interact, IntSlider, Dropdown
def interactive_coreset(rb_num=24, symbol_num=3,
mapping_type='Localized',
aggregation_level=4):
config = CORESET_Config(
rb_num=rb_num,
symbol_num=symbol_num,
interleaved=(mapping_type == 'Interleaved'),
aggregation_level=aggregation_level
)
config.plot_configuration()
interact(
interactive_coreset,
rb_num=IntSlider(min=6, max=48, step=6, value=24),
symbol_num=IntSlider(min=1, max=3, step=1, value=2),
mapping_type=Dropdown(options=['Localized', 'Interleaved']),
aggregation_level=Dropdown(options=[1,2,4,8,16])
)
这个交互界面允许实时调整:
- 频域RB数量(6-48个,步长6)
- 时域符号数量(1-3个)
- 映射类型(本地化/交织)
- 聚合等级(1,2,4,8,16)
通过拖动滑块和选择下拉选项,可以立即看到CORESET结构的变化,这是理解参数相互关系的最有效方式。
更多推荐

所有评论(0)