UCI on PUSCH 协议角度解析
协议角度解析38.212 6.2.7 Data and control multiplexing
NR Rel-15/16学习笔记
UCI on PUSCH
参考文献:
38.213 v15.10.0 9.3 UCI reporting in PUSCH
38.212 v15.10.0 6.3.2.4 Rate matching
38.212 v15.10.0 6.2.7 Data and control multiplexing
Introduction
之前写过一篇计算UCI on PUSCH相关的文章,主要介绍了6.3.2.4的内容,即如何计算UCI所需要的物理资源,并且按照Matlab官网给出的UCI on PUSCH的函数,举了两个例子。本文主要介绍6.2.7,如何将UCI编码后的比特与UL-SCH的编码后比特进行复用,其实也是上篇文章所举例子的协议对应部分。
Background
其实无论是UL-SCH信息,UCI信息,大致流程都包含生成原始比特,生成编码后比特,速率匹配,生成调制符号,映射进入RE。
举个简单的例子,假如一个UL-SCH的TB原始比特大小是32,生成的编码后比特是416,调制方式采用QPSK,有144个RE可用于UL-SCH的传输,那么就需要拿出144*2=288个UL-SCH编码后比特进行速率匹配,然后经过QPSK生成144个调制符号,再分别放入144个RE中。
对于UCI来说,也是同样的道理。但是当在同一个slot上同时传输UL-SCH,UCI时,就需要一些新的规则,让UL-SCH/UCI同时完成生成原始比特到映射进入RE的流程,所以就有了6.2.7节。
需要说明的是,UCI on PUSCH时,UCI与UL-SCH使用相同的调制阶数,该调制阶数由计算UL-SCH TB大小时的MCS决定。
6.2.7节主要采用伪码的表达形式,不易阅读。本篇文章也是学习过程的一个记录。
Relationship with other sections
简要说明6.2.7节与其他节的一些关系。
在6.3.2.4 Rate Matching(6.3 Uplink control information),针对UCI的速率匹配,给出了 Q A C K ′ Q_{ACK}^{'} QACK′, Q C S I − 1 ′ Q_{CSI-1}^{'} QCSI−1′, Q C S I − 2 ′ Q_{CSI-2}^{'} QCSI−2′的计算方法,这三个参数,就是计算某种类型的UCI占据的RE数目的方法。根据某种UCI类型占据的RE数目以及UL-SCH的调制阶数,就可以知道UCI速率匹配需要拿多少编码后比特。ACK,CSI-part 1, CSI-Part 2的速率匹配也是独立进行的。
在6.2.5 Rate Matching (6.2 Uplink Shared Channel),给出了如何对UL-SCH进行速率匹配的过程。这里需要特别强调的一个点,对于HARQ-ACK原始比特>2 bits或者传输CSI的情况,UCI on PUSCH的过程会影响到UL-SCH的速率匹配。这是协议没有特别说明的一个问题,也很容易让人误解。其历史可追溯到2017年10月份的RAN-1 AH1709会议,R1-171692的6.3.2.3,达成的agreement。
Agreements:
Confirm the working assumption:
For slot-based scheduling, for HARQ-ACK with more than 2 bits, PUSCH is rate-matched.
For slot-based scheduling, for HARQ-ACK with up to 2 bits, PUSCH is punctured.
举个例子:
假设一个slot内可以传输288个编码后比特,只有HARQ-ACK与UL-SCH在该slot上传输。
若HARQ-ACK编码前比特大于2(=3 bits),取
β
o
f
f
s
e
t
P
U
S
C
H
\beta_{offset}^{PUSCH}
βoffsetPUSCH=5,编码,速率匹配后有54个比特,那么UL-SCH进行速率匹配时只有288-54=234个比特。
若HARQ-ACK编码前比特等于2(=2 bits),取
β
o
f
f
s
e
t
P
U
S
C
H
\beta_{offset}^{PUSCH}
βoffsetPUSCH=5,编码,速率匹配后有36个比特,那么UL-SCH进行速率匹配时仍有288个比特。
Assumption for this article
为了方便后文说明问题,前文后文的举例假设均如下。
一次调度一个slot内的14个OFDM符号,1个RB,DMRS配置为1+1单列配置,DMRS在第2个以及第11个OFDM符号上,MCS=4 (QPSK, Target code rate=308/1024, Table 6.1.4.1-1: MCS index table for PUSCH with transform precoding and 64QAM,q=2), TBS=32 bits,不使能跳频,单层传输。
共有(14-2)*12=144 RE用于传输,可传输
144
∗
2
=
288
144*2=288
144∗2=288 个编码后比特。
Case 1: HARQ-ACK<=2 bits, HARQ-ACK=2, β o f f s e t H A R Q − A C K \beta_{offset}^{HARQ-ACK} βoffsetHARQ−ACK=5, 对HARQ进行编码,速率匹配后有36个比特.
Case 2: HARQ-ACK>2 bits, HARQ-ACK=3, β o f f s e t H A R Q − A C K \beta_{offset}^{HARQ-ACK} βoffsetHARQ−ACK=5, 对HARQ进行编码,速率匹配后有54个比特.
Case 1和Case 2中均有:
CSI-Part 1=5, β o f f s e t C S I − P a r t 1 \beta_{offset}^{CSI-Part 1} βoffsetCSI−Part1=1.375, 对CSI-Part 1进行编码,速率匹配后,有26个比特;
CSI-Part 2=6, β o f f s e t C S I − P a r t 2 \beta_{offset}^{CSI-Part 2} βoffsetCSI−Part2=1.375, 对CSI-Part 2进行编码,速率匹配后,有30个比特.
6.2.7 Data and control multiplexing
Input sequence
g 0 U L − S C H , g 1 U L − S C H , . . . , g G U L − S C H − 1 U L − S C H g_{0}^{UL-SCH}, g_{1}^{UL-SCH},...,g_{G^{UL-SCH}-1}^{UL-SCH} g0UL−SCH,g1UL−SCH,...,gGUL−SCH−1UL−SCH :UL-SCH速率匹配后的序列
g 0 A C K , g 1 A C K , . . . , g G A C K − 1 A C K g_{0}^{ACK}, g_{1}^{ACK},...,g_{G^{ACK}-1}^{ACK} g0ACK,g1ACK,...,gGACK−1ACK :HARQ-ACK速率匹配后的序列
g 0 C S I − P a r t 1 , g 1 C S I − P a r t 1 , . . . , g G C S I − P a r t 1 − 1 C S I − P a r t 1 g_{0}^{CSI-Part 1}, g_{1}^{CSI-Part 1},...,g_{G^{CSI-Part 1}-1}^{CSI-Part 1} g0CSI−Part1,g1CSI−Part1,...,gGCSI−Part1−1CSI−Part1 :CSI-Part 1速率匹配后的序列
g 0 C S I − P a r t 2 , g 1 C S I − P a r t 2 , . . . , g G C S I − P a r t 2 − 1 C S I − P a r t 2 g_{0}^{CSI-Part 2}, g_{1}^{CSI-Part 2},...,g_{G^{CSI-Part 2}-1}^{CSI-Part 2} g0CSI−Part2,g1CSI−Part2,...,gGCSI−Part2−1CSI−Part2 :CSI-Part 2速率匹配后的序列
g 0 , g 1 , . . . , g G − 1 g_0,g_1, ..., g_{G-1} g0,g1,...,gG−1 :UCI与UL-SCH 混合后的序列
举例
Case 1:
G
U
L
−
S
C
H
G^{UL-SCH}
GUL−SCH=288-26-30=232,
G
A
C
K
G^{ACK}
GACK=36,
G
C
S
I
−
P
a
r
t
1
G^{CSI-Part 1}
GCSI−Part1=26,
G
C
S
I
−
P
a
r
t
2
G^{CSI-Part 2}
GCSI−Part2=30,
G
=
288
G=288
G=288
Case 1:
G
U
L
−
S
C
H
G^{UL-SCH}
GUL−SCH=288-54-26-30=178,
G
A
C
K
G^{ACK}
GACK=54,
G
C
S
I
−
P
a
r
t
1
G^{CSI-Part 1}
GCSI−Part1=26,
G
C
S
I
−
P
a
r
t
2
G^{CSI-Part 2}
GCSI−Part2=30,
G
=
288
G=288
G=288.
Notation Before Step 1-6
l
l
l: OFDM Symbols (OS) index, 包含全部的OS。举例:Case1&2,
l
=
0
,
1
,
2
,
.
.
.
,
13.
l=0,1,2,...,13.
l=0,1,2,...,13.
k
k
k: Subcarrier (SC) index, 包含某个RB内的全部子载波。举例:Case1&2,
k
=
0
,
1
,
2
,
.
.
.
,
11.
k=0,1,2,...,11.
k=0,1,2,...,11.
Φ l U L − S C H \Phi_{l}^{UL-SCH} ΦlUL−SCH: 可用于传输数据的,第 l l l个OS符号包含的全部RE集合,集合按照SC升序排列,其中 l = 0 , 1 , 2 , . . . , 13 l=0,1,2,...,13 l=0,1,2,...,13
M s c U L − S C H ( l ) M_{sc}^{UL-SCH}(l) MscUL−SCH(l): 第 l l l个OS符号包含的全部RE集合中包含的元素数目,其中 l = 0 , 1 , 2 , . . . , 13 l=0,1,2,...,13 l=0,1,2,...,13
Φ l U L − S C H ( j ) \Phi_{l}^{UL-SCH}(j) ΦlUL−SCH(j): 集合 Φ l U L − S C H \Phi_{l}^{UL-SCH} ΦlUL−SCH中第 j j j个元素。
Φ l U C I \Phi_{l}^{UCI} ΦlUCI: 可用于传输UCI的,第 l l l个OS符号包含的全部RE集合,集合按照SC升序排列,其中 l = 0 , 1 , 2 , . . . , 13 l=0,1,2,...,13 l=0,1,2,...,13
M S C U C I ( l ) M_{SC}^{UCI}(l) MSCUCI(l): 第 l l l个OS符号包含的全部RE集合中包含的元素数目,其中 l = 0 , 1 , 2 , . . . , 13 l=0,1,2,...,13 l=0,1,2,...,13
Φ l U C I ( j ) \Phi_{l}^{UCI}(j) ΦlUCI(j): 集合 Φ l U C I \Phi_{l}^{UCI} ΦlUCI中第 j j j个元素。
当在第l个符号放置了DMRS,则
Φ
l
U
C
I
=
∅
\Phi_{l}^{UCI}=\empty
ΦlUCI=∅。
当第l个符号未放置DMRS,则
Φ
l
U
C
I
=
Φ
l
U
L
−
S
C
H
\Phi_{l}^{UCI}=\Phi_{l}^{UL-SCH}
ΦlUCI=ΦlUL−SCH。
一些理解:
- Φ l U L − S C H \Phi_{l}^{UL-SCH} ΦlUL−SCH与 Φ l U C I \Phi_{l}^{UCI} ΦlUCI并不是最后真正传输UL-SCH或者UCI的资源集合,只是可能的/潜在的集合。决定UL-SCH或UCI的传输资源集合,需要Step1-6来确定。 后续也会根据这两个集合进行一系列操作。
- 如果一个OS符号上传输了DMRS,则一定不可以用来传输UCI,即 Φ l U C I = ∅ \Phi_{l}^{UCI}=\empty ΦlUCI=∅。
Frequency Hopping Configured or not
若UCI on PUSCH时,同时配置了Intra-slot FH,则需要逐个Hop去进行映射;本文的举例只讨论不配置Intra-slot的情况。
先从Notation的物理意义开始。
N h o p P U S C H N_{hop}^{PUSCH} NhopPUSCH:跳频位置数目。使能跳频, N h o p P U S C H N_{hop}^{PUSCH} NhopPUSCH=2;不使能跳频, N h o p P U S C H N_{hop}^{PUSCH} NhopPUSCH=1.
l ( 1 ) l^{(1)} l(1), l ( 2 ) l^{(2)} l(2):第一/第二跳上,可以放置HARQ信息的OS index, 从第一个DMRS之后的OS开始。举例:不使能跳频,DMRS在第二个OS上,则 l ( 1 ) = 3 , 4 , 5 , . . . , 13. l^{(1)}=3,4,5,...,13. l(1)=3,4,5,...,13.
l C S I ( 1 ) l_{CSI}^{(1)} lCSI(1), l C S I ( 2 ) l_{CSI}^{(2)} lCSI(2) :第一/第二跳上,可以放置CSI信息的OS index, 从第一个DMRS之后的OS开始。举例:DMRS在第二个OS上,则 l ( 1 ) = 0 , 1 , 2 , . . . , 13. l^{(1)}=0,1,2,...,13. l(1)=0,1,2,...,13.
M
1
M_1
M1:第一跳上,潜在用于传输UCI的RE数目
M
2
M_2
M2:第二跳上,潜在用于传输UCI的RE数目
M
3
M_3
M3:第一跳上,潜在用于传输HARQ的RE数目
N s y m b , h o p P U S C H ( 1 ) N_{symb,hop}^{PUSCH}(1) Nsymb,hopPUSCH(1), N s y m b , h o p P U S C H ( 2 ) N_{symb,hop}^{PUSCH}(2) Nsymb,hopPUSCH(2):第一跳和第二跳的OS符号数目。不使能跳频时, N s y m b , h o p P U S C H ( 1 ) = N s y m b , a l l P U S C H N_{symb,hop}^{PUSCH}(1)=N_{symb,all}^{PUSCH} Nsymb,hopPUSCH(1)=Nsymb,allPUSCH, 第一跳OS符号数目等于OS符号总长度。
G A C K G^{ACK} GACK, G ( 1 ) A C K G_{(1)}^{ACK} G(1)ACK, G ( 2 ) A C K G_{(2)}^{ACK} G(2)ACK: 速率匹配后,HARQ的总比特数目;第一跳传输的HARQ比特数目;第二跳传输的HARQ比特数目。
G C S I − P a r t 1 G^{CSI-Part 1} GCSI−Part1, G ( 1 ) C S I − P a r t 1 G_{(1)}^{CSI-Part 1} G(1)CSI−Part1, G ( 2 ) C S I − P a r t 1 G_{(2)}^{CSI-Part 1} G(2)CSI−Part1: 速率匹配后,CSI-Part 1的总比特数目;第一跳传输的CSI-Part 1比特数目;第二跳传输的CSI-Part 1比特数目。
G C S I − P a r t 2 G^{CSI-Part 2} GCSI−Part2, G ( 1 ) C S I − P a r t 2 G_{(1)}^{CSI-Part 2} G(1)CSI−Part2, G ( 2 ) C S I − P a r t 2 G_{(2)}^{CSI-Part 2} G(2)CSI−Part2: 速率匹配后,CSI-Part 2的总比特数目;第一跳传输的CSI-Part 2比特数目;第二跳传输的CSI-Part 2比特数目。
N L N_{L} NL:传输层数。举例: N L N_{L} NL=1 for this article.
一些理解:
- 本部分最重要的是对于 l 1 l^{1} l1和 l C S I 1 l^{1}_{CSI} lCSI1的理解。HARQ与CSI能够放置的起始OS符号不同的。HARQ的每一跳都从DMRS之后的符号开始,CSI则是从第一个不携带DMRS的OS符号开始。
Introduction for Step 1-Step 6
简单介绍Step 1到6分别为了什么:
Step 1: 适用于HARQ小于等于2 bits的情况,寻找此时HARQ 映射的RE。
Step 2: 适用于HARQ大于2 bits的情况,寻找此时HARQ映射对应的RE,并把 g 0 A C K , g 1 A C K , . . . , g G A C K − 1 A C K g_{0}^{ACK}, g_{1}^{ACK},...,g_{G^{ACK}-1}^{ACK} g0ACK,g1ACK,...,gGACK−1ACK序列赋值给新的序列 g ‾ l , k , v {\overline{g}}_{l,k,v} gl,k,v,并把HARQ(>2 bit)已经占据的RE从 Φ l U L − S C H \Phi_{l}^{UL-SCH} ΦlUL−SCH以及 Φ l U C I \Phi_{l}^{UCI} ΦlUCI排除出去。
Step 3: 针对CSI,寻找此时CSI映射对应的RE,并把 g 0 C S I − P a r t 1 , g 1 C S I − P a r t 1 , . . . , g G C S I − P a r t 1 − 1 C S I − P a r t 1 g_{0}^{CSI-Part 1}, g_{1}^{CSI-Part 1},...,g_{G^{CSI-Part 1}-1}^{CSI-Part 1} g0CSI−Part1,g1CSI−Part1,...,gGCSI−Part1−1CSI−Part1,以及 g 0 C S I − P a r t 2 , g 1 C S I − P a r t 2 , . . . , g G C S I − P a r t 2 − 1 C S I − P a r t 2 g_{0}^{CSI-Part 2}, g_{1}^{CSI-Part 2},...,g_{G^{CSI-Part 2}-1}^{CSI-Part 2} g0CSI−Part2,g1CSI−Part2,...,gGCSI−Part2−1CSI−Part2序列赋值给新的序列 g ‾ l , k , v {\overline{g}}_{l,k,v} gl,k,v,并将CSI-Part 1和CSI-Part 2已经占据的RE从 Φ l U L − S C H \Phi_{l}^{UL-SCH} ΦlUL−SCH以及 Φ l U C I \Phi_{l}^{UCI} ΦlUCI排除出去。
Step 4: 针对UL-SCH,将 g 0 U L − S C H , g 1 U L − S C H , . . . , g G U L − S C H − 1 U L − S C H g_{0}^{UL-SCH}, g_{1}^{UL-SCH},...,g_{G^{UL-SCH}-1}^{UL-SCH} g0UL−SCH,g1UL−SCH,...,gGUL−SCH−1UL−SCH赋值给新的序列 g ‾ l , k , v {\overline{g}}_{l,k,v} gl,k,v
Step 5: 适用于HARQ小于等于2 bits的情况,把 g 0 A C K , g 1 A C K , . . . , g G A C K − 1 A C K g_{0}^{ACK}, g_{1}^{ACK},...,g_{G^{ACK}-1}^{ACK} g0ACK,g1ACK,...,gGACK−1ACK序列赋值给新的序列 g ‾ l , k , v {\overline{g}}_{l,k,v} gl,k,v。
Step 6: 对新序列 g ‾ l , k , v {\overline{g}}_{l,k,v} gl,k,v重新排序,得到序列 g 0 , g 1 , . . . , g G − 1 g_0,g_1, ..., g_{G-1} g0,g1,...,gG−1
Step 1
Step1的第一步,是重新定义了两个RE集合,
Φ
‾
l
U
L
−
S
C
H
{\overline{\Phi}}_{l}^{UL-SCH}
ΦlUL−SCH,
Φ
‾
l
U
C
I
{\overline{\Phi}}_{l}^{UCI}
ΦlUCI,并计算了集合中包含的元素个数。
这步操作,是为了方便标记Step 1-Step5的找对应RE资源的过程,从Step2开始,每找到一些资源,就会从 Φ ‾ l U L − S C H {\overline{\Phi}}_{l}^{UL-SCH} ΦlUL−SCH, Φ ‾ l U C I {\overline{\Phi}}_{l}^{UCI} ΦlUCI中除去一些元素。等到Step6,会重新用 Φ l U L − S C H \Phi_{l}^{UL-SCH} ΦlUL−SCH对 g ‾ l , k , v {\overline{g}}_{l,k,v} gl,k,v进行排序,Step6要求对所有RE进行遍历。
特别说明,Step 1只适用于HARQ小于等于2bits的情况。在HARQ小于等于2bits前提下,计算
Q
A
C
K
′
Q^{'}_{ACK}
QACK′时,将
o
A
C
K
o_{ACK}
oACK设置为2;
G
r
v
d
A
C
K
G^{ACK}_{rvd}
GrvdACK是速率匹配后,能够传输的HARQ-ACK大小;如果配置了跳频,就将
G
r
v
d
A
C
K
G^{ACK}_{rvd}
GrvdACK一分为二,每一半的coded bits of HARQ记作
G
r
v
d
A
C
K
(
1
)
G^{ACK}_{rvd}(1)
GrvdACK(1),
G
r
v
d
A
C
K
(
2
)
G^{ACK}_{rvd}(2)
GrvdACK(2);如果没有配置跳频,就不用分了。
这里引入了计数器
m
c
o
u
n
t
A
C
K
m_{count}^{ACK}
mcountACK,以及
Φ
‾
l
r
v
d
{\overline{\Phi}}_{l}^{rvd}
Φlrvd集合。通过计数器表明是否已经完成了对
g
0
A
C
K
,
g
1
A
C
K
,
.
.
.
,
g
G
A
C
K
−
1
A
C
K
g_{0}^{ACK}, g_{1}^{ACK},...,g_{G^{ACK}-1}^{ACK}
g0ACK,g1ACK,...,gGACK−1ACK的操作。
Φ
‾
l
r
v
d
{\overline{\Phi}}_{l}^{rvd}
Φlrvd初始设置为空集,后续通过不断的并入其他元素,并入给这部分HARQ预留的RE。
这组for循环中,包含了两个if以及一个for。分别来看一下对应的物理含义。
最外层for循环是为了跳频设定的,当不配置跳频时,只循环一次就可以了。
l
=
l
i
l=l^{i}
l=li这句保证了HARQ的资源是从第一个携带DMRS的OS符号的后一个OS符号开始映射的。
while循环的判断条件是,计数器中的number of coded bits for HARQ是否超过了num of coded bits for HARQ的总量。
两个if的判断条件:判断剩余的number of coded bits for HARQ是否超过了当前OS符号能够承载的最大coded bits。
- 如果剩余的coded bits 超过了当前符号能够承载的最大coded bits,就令 d = 1 d=1 d=1,并统计此时用的RE数目 m c o u n t R E m_{count}^{RE} mcountRE。 d d d是此轮寻找RE的间隔,后面会对 d d d进行进一步说明。当 d = 1 d=1 d=1,RE是无间隔的。
- 如果剩余的coded bits 没超过当前符号能够承载的最大coded bits,说明在该OS符号上就能结束HARQ coded bits的映射。此时,寻找RE是插空式的。插空间隔是d,并统计此时用的RE数目 m c o u n t R E m_{count}^{RE} mcountRE。
外层for循环中包含的for是用来找到这部分HARQ对应的RE的,并且把此轮已经完成放置的HARQ coded bits加到计数器内。
l
=
l
+
1
l=l+1
l=l+1意味着开始在下一个OS符号上寻找RE。
将本文的Case 1,按照上述伪码运行一遍。
l
=
3
l=3
l=3,在第三个OS上,有12个RE。
此时,
m
c
o
u
n
t
A
C
K
=
0
m_{count}^{ACK}=0
mcountACK=0,
G
r
v
d
A
C
K
=
36
G_{rvd}^{ACK}=36
GrvdACK=36,第一次进入while循环;
M
‾
s
c
U
C
I
(
3
)
=
12
{\overline{M}}_{sc}^{UCI}(3)=12
MscUCI(3)=12,进入第一个if;
N
L
=
1
N_{L}=1
NL=1,
Q
m
=
2
Q_{m}=2
Qm=2,
36
−
0
>
12
∗
1
∗
2
36-0>12*1*2
36−0>12∗1∗2,进入第二个if,d=1,
m
c
o
u
n
t
R
E
=
12
m_{count}^{RE}=12
mcountRE=12;跳过第三个if,进入内层for循环,j从0到11,d=1,循环12次后,第三个OS的第0到11个RE全部被并入
Φ
‾
l
r
v
d
{\overline{\Phi}}_{l}^{rvd}
Φlrvd,计数器
m
c
o
u
n
t
A
C
K
=
24
m_{count}^{ACK}=24
mcountACK=24,
l
=
l
+
1
=
4
l=l+1=4
l=l+1=4。
此时, m c o u n t A C K = 24 m_{count}^{ACK}=24 mcountACK=24, G r v d A C K = 36 G_{rvd}^{ACK}=36 GrvdACK=36,第二次进入while循环; M ‾ s c U C I ( 4 ) = 12 {\overline{M}}_{sc}^{UCI}(4)=12 MscUCI(4)=12,进入第一个if; N L = 1 N_{L}=1 NL=1, Q m = 2 Q_{m}=2 Qm=2, 36 − 24 < 12 ∗ 1 ∗ 2 36-24<12*1*2 36−24<12∗1∗2,跳过第二个if,进入第三个if, d = 24 / 12 = 2 d=24/12=2 d=24/12=2, m c o u n t R E = ( 36 − 24 ) / 2 = 6 m_{count}^{RE}=(36-24)/2=6 mcountRE=(36−24)/2=6;跳进入内层for循环,j从0到5,d=2,循环6次后,第四个OS的第0/2/4/6/8/10个RE全部被并入 Φ ‾ l r v d {\overline{\Phi}}_{l}^{rvd} Φlrvd,计数器 m c o u n t A C K = 36 m_{count}^{ACK}=36 mcountACK=36,结束while循环。
如果HARQ大于2bit,就不用上述的操作了,直接将
Φ
‾
l
r
v
d
{\overline{\Phi}}_{l}^{rvd}
Φlrvd记作空集,最后记录
Φ
‾
l
r
v
d
{\overline{\Phi}}_{l}^{rvd}
Φlrvd集合中包含的元素数目
M
‾
{\overline{M}}
M.
Step 2
适用于HARQ大于2bit的情况。这步与Step1类似的步骤就不赘述了。
第一个for循环内:有一个从
Φ
‾
l
U
C
I
{\overline{\Phi}}_{l}^{UCI}
ΦlUCI中命名k的操作,个人认为,这步记作
k
=
j
∗
d
k=j*d
k=j∗d更合理,因为k是一个数值,
Φ
‾
l
U
C
I
{\overline{\Phi}}_{l}^{UCI}
ΦlUCI是一个集合。该层循环变量是每个RE。
第二个for循环内,出现新的序列,记法是
g
‾
l
,
k
,
v
{\overline{g}}_{l,k,v}
gl,k,v,物理含义:第l个符号上,第k个子载波,第v层,传输的coded bits。等号右边,从
g
0
A
C
K
,
g
1
A
C
K
,
.
.
.
,
g
G
A
C
K
−
1
A
C
K
g_{0}^{ACK}, g_{1}^{ACK},...,g_{G^{ACK}-1}^{ACK}
g0ACK,g1ACK,...,gGACK−1ACK 依次取。总计数器加1,该跳的计数器加1。该层循环变量是每层传输的每个coded bits。
上述步骤主要是为了在Step 2-5的操作中,除去已经被HARQ(>2 bits)占据的RE。变量
Φ
‾
l
,
t
m
p
U
C
I
{\overline{\Phi}}_{l, tmp}^{UCI}
Φl,tmpUCI是在Step2步骤时,占据的RE。先将
Φ
‾
l
,
t
m
p
U
C
I
{\overline{\Phi}}_{l, tmp}^{UCI}
Φl,tmpUCI设置为空集,然后,按照
j
∗
d
j*d
j∗d从
Φ
‾
l
U
C
I
{\overline{\Phi}}_{l}^{UCI}
ΦlUCI集合中挑选一些元素并入
Φ
‾
l
,
t
m
p
U
C
I
{\overline{\Phi}}_{l, tmp}^{UCI}
Φl,tmpUCI。完成并入操作后,从
Φ
‾
l
U
C
I
{\overline{\Phi}}_{l}^{UCI}
ΦlUCI,
Φ
‾
l
U
L
−
S
C
H
{\overline{\Phi}}_{l}^{UL-SCH}
ΦlUL−SCH将属于
Φ
‾
l
,
t
m
p
U
C
I
{\overline{\Phi}}_{l, tmp}^{UCI}
Φl,tmpUCI的元素排除,并重新统计
Φ
‾
l
U
C
I
{\overline{\Phi}}_{l}^{UCI}
ΦlUCI,
Φ
‾
l
U
L
−
S
C
H
{\overline{\Phi}}_{l}^{UL-SCH}
ΦlUL−SCH中的元素数目。
按照Case 2运行一下该部分的算法:
G
A
C
K
=
54
G_{ACK}=54
GACK=54,在第一次和第二次进入while循环时,d=1,
m
c
o
u
n
t
R
E
=
12
m_{count}^{RE}=12
mcountRE=12,占据了第三个,第四个OS上的全部RE,也意味着
Φ
‾
l
,
t
m
p
U
C
I
{\overline{\Phi}}_{l, tmp}^{UCI}
Φl,tmpUCI包含了第三个/第四个OS的全部RE。
在第三次进入while循环,还剩
54
−
12
∗
2
−
12
∗
2
=
6
54-12*2-12*2=6
54−12∗2−12∗2=6个比特,
d
=
24
/
6
=
4
d=24/6=4
d=24/6=4,
m
c
o
u
n
t
R
E
=
6
/
2
=
3
m_{count}^{RE}=6/2=3
mcountRE=6/2=3,占据了第五个OS上的第0,4,8个RE。
g ‾ l , k , v {\overline{g}}_{l,k,v} gl,k,v序列的输出结果, g ‾ 2 , 0 − 11 , 1 {\overline{g}}_{2,0-11,1} g2,0−11,1, g ‾ 3 , 0 − 11 , 1 {\overline{g}}_{3,0-11,1} g3,0−11,1, g ‾ 4 , 0 / 4 / 8 , 1 {\overline{g}}_{4,0/4/8,1} g4,0/4/8,1均为HARQ的coded bits。
Φ ‾ l U C I {\overline{\Phi}}_{l}^{UCI} ΦlUCI, Φ ‾ l U L − S C H {\overline{\Phi}}_{l}^{UL-SCH} ΦlUL−SCH不再包含第二个,第三个OS的全部RE,以及第四个OS的第2、4、8个RE。
Step 3
找到CSI-part 1以及CSI-Part 2的映射RE,并利用 g 0 C S I − P a r t 1 , g 1 C S I − P a r t 1 , . . . , g G C S I − P a r t 1 − 1 C S I − P a r t 1 g_{0}^{CSI-Part 1}, g_{1}^{CSI-Part 1},...,g_{G^{CSI-Part 1}-1}^{CSI-Part 1} g0CSI−Part1,g1CSI−Part1,...,gGCSI−Part1−1CSI−Part1与 g 0 C S I − P a r t 2 , g 1 C S I − P a r t 2 , . . . , g G C S I − P a r t 2 − 1 C S I − P a r t 2 g_{0}^{CSI-Part 2}, g_{1}^{CSI-Part 2},...,g_{G^{CSI-Part 2}-1}^{CSI-Part 2} g0CSI−Part2,g1CSI−Part2,...,gGCSI−Part2−1CSI−Part2对 g ‾ l , k , v {\overline{g}}_{l,k,v} gl,k,v进行赋值。
步骤与Step2类似,但是需要注意的是:
CSI-Part 1不会被HARQ(<2 bits)打孔。CSI-Part 2会被HARQ(<2 bits)打孔。
这里可以看出,在计算
d
d
d以及
m
c
o
u
n
t
R
E
m_{count}^{RE}
mcountRE时,CSI-Part 1需要去掉Step 1已经占用的RE,而CSI-Part 2不需要去掉Step 1占用的RE。
给
g
‾
l
,
k
,
v
{\overline{g}}_{l,k,v}
gl,k,v赋值时,k的可取范围,CSI-Part 1与CSI-Part 2也不相同。
还是举个例子:
Case 1:
G
A
C
K
G^{ACK}
GACK=36,
G
C
S
I
−
P
a
r
t
1
G^{CSI-Part 1}
GCSI−Part1=26,
G
C
S
I
−
P
a
r
t
2
G^{CSI-Part 2}
GCSI−Part2=30。
Step 1结束后,HARQ-ACK(<2 bits)占据了第三个OS的全部RE,第四个OS的第0/2/4/6/8/10RE。
CSI-Part 1占据第0个OS的全部RE,第1个OS的第0个RE。
CSI-Part 2占据第一个OS的第1-11个RE,已经放置了22个CSI-Part 2 coded bits,还剩了8个CSI-Part 2的coded bits没有放置。第二个OS放置了DMRS,跳过。第三个OS的RE已经被HARQ-ACK(<2)占据,但是,仍旧会分配给CSI-Part 2,输出的
g
‾
3
,
0
/
3
/
6
/
9
,
1
{\overline{g}}_{3,0/3/6/9,1}
g3,0/3/6/9,1是CSI-Part 2。
Step 4
寻找UL-SCH的对应RE,并利用
g
0
U
L
−
S
C
H
,
g
1
U
L
−
S
C
H
,
.
.
.
,
g
G
U
L
−
S
C
H
−
1
U
L
−
S
C
H
g_{0}^{UL-SCH}, g_{1}^{UL-SCH},...,g_{G^{UL-SCH}-1}^{UL-SCH}
g0UL−SCH,g1UL−SCH,...,gGUL−SCH−1UL−SCH对
g
‾
l
,
k
,
v
{\overline{g}}_{l,k,v}
gl,k,v进行赋值。
UL-SCH也会被HARQ(<2 bits)打孔,并且没有了间隔寻找RE的过程(没有计算j或者d的过程),采用无间隔的RE寻找方法。
还是以Case 1举例:
第0个OS,第1个OS的全部RE被CSI-Part 1、2占据了;第2个OS放置了DMRS,不会放置UCI,因此略过;
重点看第3个OS的RE情况,其中,第0/2/4/6/8/10 RE被HARQ-ACK(<2 bits)占据了;CSI-Part 2不会考虑HARQ-ACK(<2 bits)的情况,因此依旧占据第0/3/6/9 RE; UL-SCH只会考虑 CSI-Part 2占据的情况,因此,会占据 1/2/4/5/7/8/10/11个RE。
此时从
g
‾
l
,
k
,
v
{\overline{g}}_{l,k,v}
gl,k,v考虑:
g
‾
3
,
0
/
3
/
6
/
9
,
1
{\overline{g}}_{3,0/3/6/9,1}
g3,0/3/6/9,1是CSI-Part 2,
g
‾
3
,
1
/
2
/
4
/
5
/
7
/
8
/
10
/
11
,
1
{\overline{g}}_{3,1/2/4/5/7/8/10/11,1}
g3,1/2/4/5/7/8/10/11,1是UL-SCH。
Step 5
为HARQ小于等于2 bits的情况,把
g
0
A
C
K
,
g
1
A
C
K
,
.
.
.
,
g
G
A
C
K
−
1
A
C
K
g_{0}^{ACK}, g_{1}^{ACK},...,g_{G^{ACK}-1}^{ACK}
g0ACK,g1ACK,...,gGACK−1ACK序列赋值给新的序列
g
‾
l
,
k
,
v
{\overline{g}}_{l,k,v}
gl,k,v。
接着Step 4的举例:
Case 1: 第三个OS符号上,
g
‾
3
,
0
/
3
/
6
/
9
,
1
{\overline{g}}_{3,0/3/6/9,1}
g3,0/3/6/9,1是CSI-Part 2,
g
‾
3
,
1
/
2
/
4
/
5
/
7
/
8
/
10
/
11
,
1
{\overline{g}}_{3,1/2/4/5/7/8/10/11,1}
g3,1/2/4/5/7/8/10/11,1是UL-SCH,但是,第三个OS的RE资源,其实都已经被包含在了
Φ
‾
l
r
v
d
{\overline{\Phi}}_{l}^{rvd}
Φlrvd中,因此,需要对
g
‾
3
,
0
−
11
,
1
{\overline{g}}_{3,0-11,1}
g3,0−11,1重新赋值,令其等于HARQ的coded bits。
第四个OS符号上,
g
‾
4
,
0
−
11
,
1
{\overline{g}}_{4,0-11,1}
g4,0−11,1已经是UL-SCH code bits,但是依旧会被HARQ coded bits重新赋值,
g
‾
4
,
0
/
2
/
4
/
6
/
8
/
10
,
1
{\overline{g}}_{4,0/2/4/6/8/10,1}
g4,0/2/4/6/8/10,1重新被赋值为HARQ的coded bits。
可以发现,在Step 1计算HARQ-ACK(<=2 bits)的资源;在Step 3-4计算CSI-part 2/UL-SCH的资源,以及对 g ‾ l , k , v {\overline{g}}_{l,k,v} gl,k,v赋值;在Step 5根据Step 1预留的资源,重新对 g ‾ l , k , v {\overline{g}}_{l,k,v} gl,k,v赋值,实现了对CSI-Part 2/UL-SCH的打孔操作。
Step 6
通过
l
,
k
,
v
l,k,v
l,k,v三层变量循环,输出
g
t
g_{t}
gt。相当于按照
l
,
k
,
v
l,k,v
l,k,v顺序对
g
‾
l
,
k
,
v
{\overline{g}}_{l,k,v}
gl,k,v依次读取,赋值给
g
t
g_{t}
gt。
Case 1& Case 2占据RE 示意图
Case 1:
Case 2:
简单说一下Case 2,Step 2是为了HARQ(>2 bits)的情况找到对应的RE,放置HARQ对应的coded bits。
在Step 2结束后,第三个/第四个OS符号的全部SC均用来放置HARQ-ACK, 第五个OS符号的第0/4/8个子载波用来放置HARQ-ACK,此时
M
‾
s
c
U
C
I
(
5
)
=
9
{\overline{M}}_{sc}^{UCI}(5)=9
MscUCI(5)=9,
Φ
‾
s
c
U
C
I
(
5
)
{\overline{\Phi}}_{sc}^{UCI}(5)
ΦscUCI(5)中包含第五个OS符号的第1/2/3/5/6/7/9/10/11个SC(分别对应了从第0个到第8个元素)。
在Step 3之前,CSI-Part 2还剩6 coded bits。利用Step 3的公式
d
=
9
∗
2
/
6
=
3
d=9*2/6=3
d=9∗2/6=3,
m
c
o
u
n
t
R
E
=
6
/
2
=
3
m_{count}^{RE}=6/2=3
mcountRE=6/2=3,因此取
Φ
‾
s
c
U
C
I
(
5
)
{\overline{\Phi}}_{sc}^{UCI}(5)
ΦscUCI(5)中的第0,3,6个元素,对应了第五个OS符号的第1/5/9个子载波。
可以看出,HARQ-ACK>2 bits的case不会影响已经放置好的CSI或者UL-SCH。
Notes
笔者写下这篇文章时,Rel-17已经接近尾声,只觉时光飞逝,物是人非。前行的路上总是错过了太多太多美好,只能把遗憾偷偷藏起,希望下一个Rel更精彩。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)