opnet學習筆記

最近一直在研究無線環境下兩個節點的單工通信,和有線通信一樣還是數字噴泉碼,我就是想在發端生成一定數量的數據包,然後經過刪除信道後在收端統計最終收到的包數,並將接收到的包的數據讀出後解碼。看似沒什麼難度還是浪費了我一週多的時間,我感覺自己主要卡在以下三個地方:

問題1:如何確定收端數據包已經接收完畢?

這是非常必要的,不然沒法計算最終收到的包數。

我最初的想法是在發端設一個全局變量pk_count=10,假設發端一共發10個包,每發一次,pk_count--,這樣的話當pk_count減爲0時就意味着數據包已經發完,接收端就可以統計最終收到的包數了。但仿真試了一下發現不可行,因爲發端發完了並不意味着收端也收完了,畢竟還有一定的傳輸和處理延時,可能最後的幾個包還在收端排隊着呢。

此路不通只好再想辦法了,一個新的idea就是當且僅當滿足pk_count=0 && op_strm_empty(IN_STRM) && 信道空閒的條件時認爲數據包已經接收完畢,那麼如何判斷信道空閒呢?關於這個問題,我之前CSMA中仿真過,就是在收發通信機之間畫一條統計線,然後調用op_stat_local_read()讀取信道狀態。按理說問題到這兒就解決了,可是新的問題又來了:無線怎麼畫統計線?我在百思論壇搜了一下,也有人問類似的問題,知道在無線環境中也是可以畫統計線的,但具體怎麼操作說實話沒太看懂Orz……我試着在接收節點模型中添加了一個channel_test節點與收信機用統計線相連來讀取信達狀態,雖然仿真的時候沒報錯,但是仿真完了發現這個統計線加了和不加沒什麼區別,還是沒法準確判斷數據包全部接收完沒有~~~~~~~~~

折騰了好久實在沒招了,找師兄幫忙吧……師兄的建議是:設置一個定時中斷,每隔幾秒觸發一次自中斷後判斷是否有數據包到達,有的話取消中斷繼續執行程序,否則條件轉移到下一個狀態。頓時茅塞頓開~~~回去試了一下,折騰了我好幾天的問題瞬間解決!所以說師兄還是很牛的,多念兩年書就是不一樣~~~

OPNET學習小記(五)

這就是定時中斷的那幾行程序~~~

對了,還有一個unsolved problem:在我這個程序裏定時的時間常數30的單位是秒還是毫秒?有一點比較詭異的是如果我把定時時間設爲2,只讀一個數據包就判斷接收完畢了,只有設置的大一點兒才能確保所有數據包都接收結束。這是怎麼回事兒呢?按理說只要能讀出一個數據包說明這個定時間隔就是合理的啊……想不明白,糾結ing……

問題2:如何在接收到一定量(即能保證成功譯碼的數據包量)的數據包後終止仿真?

這個問題估計大家的第一反應都是採用仿真結束中斷的辦法吧。但是我沒用過仿真結束中斷,而且對於我這種菜鳥級別的人來說,每次新接觸OPNET裏的某個技術、哪怕只是一個函數我都要出很多錯,然後費很大功夫去解決。所以爲了省事兒,我改用c語言跳出程序的辦法來結束仿真。先試的是return,因爲按理說只要遇到return整個程序就會跳出,可使用了return後仿真報錯,說什麼void類型的程序不能有返回值,而且函數輸入輸出不匹配,我對這種問題最沒耐心解決了,直接換break,結果發現break只能跳出一部分程序,當有新的數據包達到時還是會執行仿真的……

啊啊啊~~~~~~沒招了,還是用endsim吧,在網上一頓查資料,然後再在自己的進程模型中修改,好像也沒那麼難……居然一次性仿真通過,問題解決了!

問題3:如何在無線鏈路中設置刪除信道?

這個問題我認爲最難解決了,我幾乎把14個管道階段程序都看了一遍,每個階段具體做什麼、實現什麼功能也基本瞭然於心了,可就是不知道怎麼修改管道程序。

重新整理一下思路:14個管道階段與誤碼有關的主要有6個階段,分別是:bkgnoise、inoise、snr、ber、error、ecc。先是計算bkgnoise和inoise,這兩個階段計算的結果又是snr計算的基礎,snr計算存儲好後又在ber階段讀出來計算ber,ber對error階段錯誤的分配有影響,而error階段計算的error_num又決定了該包能否被接收。縱觀整個管道階段模型,可以被修改的管道只有bkgnoise和error兩個階段,其中bkgnoise階段影響其值大小的無非就那麼幾個參數:布爾曼常數、環境溫度和rx_noisefig,布爾曼常數基本是不怎麼改的,環境溫度的話管道函數裏設爲290,想要噪聲大點兒的話可以取一個更大的數(個人認爲),rx_noisefig是在無線接收機屬性裏自己設的,rx_noisefig=1.0時噪聲最小,逐漸增大其值時噪聲逐漸增大。通過適當增大噪聲理論上應該是可以產生合適的丟包率的,但我感覺這樣太麻煩而且不好設置丟包率,乾脆就在error錯誤分配階段改了,直接產生一個0到1之間的隨機數r,如果r>=0.2,error_num=0,否則error_num=1。這樣的話就算設置丟包率爲0.2的刪除信道了,就是不太規範~~~~

問題解決完了,show一下最終的仿真成果:

OPNET學習小記(五)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章