上次說明圖(一)流程中設定WiSE參數(LoadParameters()與LoadScenarioParameters())後,程式就會進入GenerateNetworkTopology(),此步驟主要是布建BS以及灑UE,本篇主要按照specifications的規範,初步布建基地台資訊(但我們先不考量Wrapped around,後續再來說明如何寫 Wrapped around 的基地台布建),而灑UE的部分也未來再說明。
圖(一) WiSE程式流程圖 與 C++程式框架
GenerateNetworkTopology()主要的檔案有Spec.h、Network.h與SpecNetworkTopologyGenerator.h以及SpecNetworkTopologyGenerator.cpp,這些檔案的關係圖如圖(二);Spec.h設定參數後,程式進入Network.h檔,Network.h裡有SpecNetworkTopologyGenerator Function,就開始布建BS以及UE。
圖(二) Network Topology程式流程圖
在WiSE SpecNetworkTopologyGenerator.h裡我們產生一個CSpecNetworkTopologyGenerator Class,其架構如圖(三),接下來我將依序說明:
1.GenerateMacroCellTopology
2.GenerateInHOfficeMacroCellTopology
3.GenerateIndoorHotspotMacroCellTopology
圖(三) CSpecNetworkTopologyGenerator Class
Let’s GO~!
1.GenerateMacroCellTopology
功能為產生Macro cell topology,如圖(四),此為我們熟知的BS布建,每個Node有三個sectors,但它是如何布建的呢?就來看程式囉!讀者如想知道這部分TR來源,可參考TR 36.814 UMa, UMi, RMa。
圖(四) 19個Nodes布建
圖(五) MacroCellTopology I
BS布建其實很簡單,邏輯通了,就什麼都通了,程式碼如圖(五)。至於要產生幾個Node呢?我們可參考圖(五)的第42行,cNode.resize(1+uRing*(2*6+(uRing-1)*6)/2),uRing我們可以在Spec.h中設定,uRing=0、1 、 2產生Node的數量分別為1、7、19,我們可參考圖(六)。
圖(六) uRing與Node關係
圖(五)的第43行,Matrix<double> mdLocation(cNode.size(),2),mdLocation矩陣開的維度為cNode.size() By 2,2包含要放X軸與Y軸兩個位置;初始化一切就緒後,就進入45行的for迴圈裡面,第一次進入時:n=0,index=0
dAngle=-120;
mdLocation[index][0]=dInterNodeDistance*n; // dInterNodeDistance 為Node間距離
mdLocation[index][1]=0;
dOffsetX=dInterNodeDistance*cos(dAngle/180*PI);
dOffsetY=dInterNodeDistance*sin(dAngle/180*PI);
因n=0所以不會進入53行的for迴圈裡
所以得到mdLocation[index][0]=0(X軸值)與mdLocation[index][1]=0(Y軸值),就擺好第一個Node位置,如圖(七)。
圖(七) n=0
再來又回到圖(五)的第45行:n=1,index=0,也就是要開始擺放第二圈Node,
可參考圖(五)程式碼與圖(八)說明圖,注意:相對應的顏色,綠色、黃色、藍色顏色是有意義的歐!
圖(八) n=1
圖(五)的第45行:n=1,index=0第一層for迴圈就會擺好圖(八)中index=0的那個Node,而其他的Node則是第53行for迴圈裡面來完成。
完成n=1後,又回到圖(五)的第45行:n=2,index=0,也就是要開始擺放第三圈Node,其方法跟n=0與n=1一樣,可參考圖(九)。
圖(九) n=2
擺好所有BSs位置後,程式就會進入如圖(十)的程式
圖(十) MacroCellTopology II
cNode[i].uID // Node編號
cNode[i].dLocation[0] // Node X軸值
cNode[i].dLocation[1] // Node Y軸值
cNode[i].dLocation[2] // Node 高度
cNode[i].cCell.resize(vdAzimuth.size()); // vdAzimuth size 是3,把cell都開成3個
圖(十)72與73行將座標(0,0)移到左下角,如圖(十一),主要是因為我們之前在擺Node位置時,是以中心點為(0,0)位置。
圖(十一) 移中心點(0,0)
圖(十) MacroCellTopology II主要是將每個Node與Node裡面的Cells資訊填進去,其中值得注意的是第82與84行,一個Node裡面三個不同方向的Sectors如圖(十二)。
圖(十二) 一個Node裡面三個不同方向的Cells
2.GenerateInHOfficeMacroCellTopology
在Indoor Office裡,總共有12個Nodes,每個Node裡面一樣有三個不同方向的Cells,想了解可參考TR 38.900;我想,有了前面較為複雜的GenerateMacroCellTopology經驗後,這個就相對簡單多了,我直接把程式碼與示意圖放在一起,如圖(十三),讀者就可以直接對應。
圖(十三) InHOfficeMacroCellTopology
3.GenerateIndoorHotspotMacroCellTopology
在Indoor Office,總共有12個Nodes, 圖(十四) , 每個Node只有一個Cell,而且值得注意的是,每個Node是垂直於天花板,所以程式碼第184行cNode[i].cCell[j].dRotation[1]=90.0。
圖(十四) IndoorHotspotMacroCellTopology
GenerateInHOfficeMacroCellTopology與GenerateIndoorHotspotMacroCellTopology不用考慮 Wraped around ,GenerateMacroCellTopology則需要,圖(十五)。
圖(十五) Wrapped around
後續再跟大家分享 Wrapped around 這部分,有任何問題留言跟我聯絡歐! 掰掰~