LTE UL grant中RIV的編碼和解碼

2021-07-24 12:05:29 字數 2405 閱讀 3523

我們先看下riv的編碼方式。關於riv的編碼過程,已經在《lte-tdd隨機接入過程(4)-riv的解析和preamble資源的選擇》中有詳細的解釋,具體公式見下面的圖1。其中,l_crbs表示分配的rb的長度,n_ul_rb表示該頻寬總的rb個數,rb_start表示分配rb的起始位置,編碼生成的riv就是ul_grant(由msg2或dci0攜帶)中的具體數值。

(圖1 msg2攜帶的riv)

圖1的這種編碼方式是2023年由nec和docomo聯合提出來的,採用的是基於三角形二叉樹(tree based)的高效編碼方式,這個數學公式的圖形表達方式如圖2所示。這種二叉樹組成的形狀是等邊三角形,每個邊的節點個數相同,均等於葉子節點個數n,n為該頻寬rb總個數。根據這種特性,可以得到這種三角形二叉樹占用的總節點個數為n×(n+1)/2,二叉樹中的每個節點對應的值就是乙個riv值,且只需要ceil(log2(n×(n+1)/2))bit就可以編碼riv值。

根據上面的解釋,現在我們可以知道圖2顯示的實際就是1.4mhz頻寬時的樹形資源分配圖。在1.4m頻寬時,rb的總個數n=6,二叉樹占用的節點個數=n×(n+1)/2=21,意味著編碼生成的riv值不會超過20。比如當前enb正在給3個ue分配資源,其中為ue1分配的是綠色的2個rb,rb-id分別是,為ue2分配的是紅色的3個rb,rb-id分別是,為ue3分配的是藍色的1個rb,rb-id是。enb給每個ue配置的riv值與rb集合組成1個等邊三角形,所以這3個ue的riv值分別是6(與rb0/1組成乙個三角形)、14(與rb2/3/4組成乙個三角形)、5(只有1個節點即為本身)。根據上面圖1的公式,分別代入三個ue的rb起始位置和長度,也同樣可以計算得到三個riv值分別是6、14和5。

(圖2 1.4mhz頻寬的樹形資源分配示意圖)

有的朋友可能會發現圖2中的節點11、16、17這三個並不是順序遞增的,那是怎麼得到的呢?實際過程如圖3所示,每個節點號按行從左到右依次遞增。行數i=1時,節點號從0增加到n-1;行數i=2時,節點號從n增加到2*(n-1),超過等邊三角形範圍的節點號用紅色的三角框圈住,比如11號節點。然後再繼續其它行數的處理,依次類推。當處理完行數i=4時,完成節點18、19和20的填寫,此時會發現三個節點11、16、17是沒有寫到三角形二叉樹中的,但卻在二叉樹的右側形成乙個倒三角。將這三個節點組成的倒三角反轉180度移入整個二叉樹的最上方,就可以得到葉子節點樹為n的三角形二叉樹。

(圖3 生成三角形二叉樹的過程)

我們再回頭看下圖1中的數學公式就會發現,這個公式有兩個不同的分支:if分支對應rb長度小於或等於4的riv計算方式

(以n=6為例),else分支對應長度為5和6的riv計算方式。而觀察圖3的二叉樹生成過程,也會發現兩個不同的組成部分:第乙個組成部分是前4行的riv值按行順序遞增,第二個組成部分是第5行和第6行的倒三角反轉移入。數學公式和圖形的結果是相互印證的:對於順序按行遞增的,可以得到if分支的公式;對於倒三角移入的,則可以得到else分支的公式。

至此,riv的編碼過程已經詳細介紹完,下面繼續介紹解碼的部分。

從riv解碼rb起始位置rb_start和rb長度l_crbs,第一種也是比較笨的方法是通過查表得到。這種方式是先通過圖1編碼的方式得到所有的riv值,然後反向查riv表,得到對應的rb起始位置和rb長度。這種方法雖然沒有問題,但效率是比較低的,下面介紹第二種方法。

假定p表示rb的長度,o表示rb的起始位置,n表示頻寬rb數,x表示riv值,則記:

a = floor(x / n)+1

b = x mod n

那麼存在:

if (a + b > n)

else

還是以圖2為例,比如當前的x=riv=14,n=6,那麼a=3,b=2。因(a+b)=5<6,所以執行else分支,故rb長度p=a=3,rb起始位置o=b=2。

再比如當前的x=riv=17,n=6,那麼a=3,b=5。因(a+b)=8>6,所以執行if分支,故rb長度p=n+2-a=5,rb起始位置o=n-1-b=0,即對應rb集合為,符合圖2中的二叉樹結構。

參考:

(1)3gpp ts 36.213 v9.3.0 (2010-09) physical layer procedures

Python中的descriptor中的一點疑問

在我的印象中,類中的函式是可以有兩種呼叫方式的,如下 class b def func self return 10 b b b.func b.func b 於是,在之前研究descriptor的時候,我就有了幾點困惑 我將 更換成了如下兩個版本 版本1 import time class lazy...

python中的dict Python中的dict

dict python內建了字典 dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵 值 key value 儲存,具有極快的查詢速度。d print dict get michael d michael add a element d adam 67 print d...

zset中的score Redis中的事務

watch 監控某個或幾個key的變化 multi 接下來的命令不會立馬執行,會先放入乙個事務的佇列中 exec 執行事務佇列中的命令 unwatch 可以在watch執行之後 multi命令執行之前執行,效果是解除對某個key的監控 discard 可以在multi命令執行之後exec命令執行之前...