#include
using std::cout;
using std::endl;
#include
int main()
double Simulation_Status;
{
if (Simulation_Status == 0) // load parameters
{
double PacketArrivalTime = 0.0;
double MeanPacketLength = 0.0;
int BufferSize = 0;
double LineSpeed = 0.0;
double SimulationTime = 0.0;
double TimeStamp = 0.0;
PoissonArrival TrafficModel;
int channel_state = 0;
long total_data_packets = 0;
long total_departed_pakcets = 0;
double total_packet_system_time = 0.0;
double total_packet_queueing_time = 0.0;
long number_of_packet_queued = 0;
long number_of_blocked_data = 0;
double channel_time = 0.0;
Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime);
Q.Create_Time = Q.Scheduled_Time;
Q.length = TrafficModel.frame_length(MeanPacketLength);
Q.event = new_packet_arrival; Q.data_type = DATA;
Q.seq_no = Schedular.seq_no++;
Schedular.join_from_head(Q);
button1->Text = "Running...";
Simulation_Status = 1;
button1->Enabled = false;
textBox5->AcceptsReturn = true;
textBox5->AppendText("Simulation starts at " + DateTime::Now.ToLongTimeString() + "\n");
while (TimeStamp<1000)> 200000000)
Schedular.seq_no = 0;
switch(Q.event)
{
case new_packet_arrival:
if (TimeStamp > Q.Scheduled_Time)
textBox5->AppendText("error410\n");
else
{
TimeStamp = Q.Scheduled_Time;
if (channel_state == 0)
{
Q.event = departure;
Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp; ++channel_state;
Schedular.join_from_end(Q);
textBox5->AppendText(Q.seq_no + " enters server \n");
}
else if (DataBuffer.count < event =" queued;">AppendText(Q.seq_no + " enters queue \n");
}
else
{
textBox5->AppendText(Q.seq_no + " blocked! \n");
}
Q.data_type = DATA;
Q.event = new_packet_arrival;
Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime) + TimeStamp; Q.Create_Time = Q.Scheduled_Time;
Q.length = TrafficModel.frame_length(MeanPacketLength);
Q.seq_no = Schedular.seq_no++;
Schedular.join_from_end(Q);
}
break;
case departure:
if (TimeStamp > Q.Scheduled_Time)
textBox5->AppendText("error447\n");
else
{
TimeStamp = Q.Scheduled_Time;
--channel_state;
if (Q.data_type == DATA)
{
}
if (DataBuffer.count != 0)
{
DataBuffer.get_event(Q);
Q.event = departure;
Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp; ++channel_state;
Schedular.join_from_end(Q);
total_packet_queueing_time += (TimeStamp - Q.Create_Time);
}
}
break;
}
}
textBox5->AppendText("Simulation ends at " + DateTime::Now.ToLongTimeString() + "\n");
button1->Text = "Finished"; Simulation_Status = 0;
double packet_loss_rate = double(number_of_blocked_data) / double(total_data_packets);
double average_delay = total_packet_system_time / double(total_departed_pakcets);
double average_queueing_delay = total_packet_queueing_time / double(total_departed_pakcets);
double average_queueing_delay2 = total_packet_queueing_time / double(number_of_packet_queued);
textBox5->AppendText("封包遺失率 = " + Convert::ToString(packet_loss_rate) + "\n"); textBox5->AppendText("平均延遲時間 = " + Convert::ToString(average_delay) + " sec.\n");
textBox5->AppendText("平均排程時間 = " + Convert::ToString(average_queueing_delay) + " sec.\n");
textBox5->AppendText("平均排程時間 if queued = " + Convert::ToString(average_queueing_delay2) + " sec.\n");
}
}
{
Simulation_Status = 0;
}
2008年6月27日 星期五
NS2技能的自我檢視
Q1: 數據上的誤差
在一些實驗中,有關係到封包遺失的模擬,似乎都有誤差,跟課本上面的數據有些出入,
想了解在模擬上的差異在哪邊
Q2: TCL的修改
在使用NS2時,經常要自行設計TCL檔,在實驗中經常要做一些變更,通常是直接更改原始碼,
比原來的使用JAVE來進行編輯要快速的多,但是修改的方式並非知道的很清楚,大部分都是
造課本上面的方式修改
Q3: 影像傳輸的精確度
在實驗六中,最後重建影像有模糊的跡象,但是並非一直模糊,時好時壞的感覺,是什麼原因造成這樣的結果
Q4: ./的差別
有時候在輸入指令的地方,開頭需要./來標註目前所在的位子,但有時候又不需要,而且不同
電腦也不一定需要使用,總覺得是個別電腦的問題,但是又想不出實際原因來
Q5: 轉檔的原因
從yuv->m4v->mp4,yuv應該用在撥放的地方,而mp4使用在網路傳輸上,為何不能跳過m4v
在一些實驗中,有關係到封包遺失的模擬,似乎都有誤差,跟課本上面的數據有些出入,
想了解在模擬上的差異在哪邊
Q2: TCL的修改
在使用NS2時,經常要自行設計TCL檔,在實驗中經常要做一些變更,通常是直接更改原始碼,
比原來的使用JAVE來進行編輯要快速的多,但是修改的方式並非知道的很清楚,大部分都是
造課本上面的方式修改
Q3: 影像傳輸的精確度
在實驗六中,最後重建影像有模糊的跡象,但是並非一直模糊,時好時壞的感覺,是什麼原因造成這樣的結果
Q4: ./的差別
有時候在輸入指令的地方,開頭需要./來標註目前所在的位子,但有時候又不需要,而且不同
電腦也不一定需要使用,總覺得是個別電腦的問題,但是又想不出實際原因來
Q5: 轉檔的原因
從yuv->m4v->mp4,yuv應該用在撥放的地方,而mp4使用在網路傳輸上,為何不能跳過m4v
2008年5月15日 星期四
實驗十一 無線網路效能分析探討(三)
實驗十 無線網路效能分析探討(二)
2008年5月8日 星期四
實驗九 無線網路效能分析探討(一)
第一次使用需要先依照下圖指令來編譯程式

以Two Ray Ground ,希望有效的傳輸距離為250公尺

執行test_2nodes.tcl檔

傳送端 sd 檔和接收端 rd 檔所傳送和接收到的封包數相同

隱藏節點問題
可傳送的有效距離為120m,使用threshold球出相對應的參數

可傳送的有效距離為150m,使用threshold球出相對應的參數

執行test_hidden_terminal.tcl檔

下圖是沒有RTS/CTS時 sd1 sd2 rd1 rd2 的封包數比較


改成有RTS/CTS

下圖是有RTS/CTS時 sd1 sd2 rd1 rd2 的封包數比較


暴露節點問題
可傳送的有效距離為100m及120m,使用threshold球出相對應的參數


跟上一個範例操做類似,先是沒有RTS/CTS時 sd1 sd2 rd1 rd2 的封包數比較


下圖是有RTS/CTS時 sd1 sd2 rd1 rd2 的封包數比較

以Two Ray Ground ,希望有效的傳輸距離為250公尺
執行test_2nodes.tcl檔
傳送端 sd 檔和接收端 rd 檔所傳送和接收到的封包數相同
隱藏節點問題
可傳送的有效距離為120m,使用threshold球出相對應的參數
可傳送的有效距離為150m,使用threshold球出相對應的參數
執行test_hidden_terminal.tcl檔
下圖是沒有RTS/CTS時 sd1 sd2 rd1 rd2 的封包數比較
改成有RTS/CTS
下圖是有RTS/CTS時 sd1 sd2 rd1 rd2 的封包數比較
暴露節點問題
可傳送的有效距離為100m及120m,使用threshold球出相對應的參數
跟上一個範例操做類似,先是沒有RTS/CTS時 sd1 sd2 rd1 rd2 的封包數比較
下圖是有RTS/CTS時 sd1 sd2 rd1 rd2 的封包數比較
2008年5月7日 星期三
實驗八 影像傳輸效能分析與評估
在lab8目錄下執行下面的指令,使用ffmpeg程式將YUV檔轉成m4v檔

接著使用MP4Box將影片再轉成mp4檔案,發現少了msvcr70.dll這個檔案

我把上次實驗用的msvcr70.dll複製過來就沒問題了

利用mp4trace程式將影片中每一個frame相關資訊擷取出來並存放到副檔名為st的檔案中

用ns2模擬

模擬後會產生4個檔案,經由etmp4程式產生一個有畫面遺失的影片mp4檔

再使用ffmpeg程式將上一步所重建之後的mp4檔回復成yuv影片檔

使用avgpsnr去針對重建後yuv影片檔及原始yuv影片檔,獲得重建後的yuv影片的平均PSNR
其值為26.609726

a. 產生GOP length 9的方式

b. 產生 GOP length 15的方式
接著使用MP4Box將影片再轉成mp4檔案,發現少了msvcr70.dll這個檔案
我把上次實驗用的msvcr70.dll複製過來就沒問題了
利用mp4trace程式將影片中每一個frame相關資訊擷取出來並存放到副檔名為st的檔案中
用ns2模擬
模擬後會產生4個檔案,經由etmp4程式產生一個有畫面遺失的影片mp4檔
再使用ffmpeg程式將上一步所重建之後的mp4檔回復成yuv影片檔
使用avgpsnr去針對重建後yuv影片檔及原始yuv影片檔,獲得重建後的yuv影片的平均PSNR
其值為26.609726
a. 產生GOP length 9的方式
b. 產生 GOP length 15的方式
訂閱:
文章 (Atom)