2008年6月27日 星期五

期末程式

#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;
}

NS2技能的自我檢視

Q1: 數據上的誤差

在一些實驗中,有關係到封包遺失的模擬,似乎都有誤差,跟課本上面的數據有些出入,
想了解在模擬上的差異在哪邊



Q2: TCL的修改

在使用NS2時,經常要自行設計TCL檔,在實驗中經常要做一些變更,通常是直接更改原始碼,
比原來的使用JAVE來進行編輯要快速的多,但是修改的方式並非知道的很清楚,大部分都是
造課本上面的方式修改



Q3: 影像傳輸的精確度

在實驗六中,最後重建影像有模糊的跡象,但是並非一直模糊,時好時壞的感覺,是什麼原因造成這樣的結果



Q4: ./的差別
有時候在輸入指令的地方,開頭需要./來標註目前所在的位子,但有時候又不需要,而且不同
電腦也不一定需要使用,總覺得是個別電腦的問題,但是又想不出實際原因來



Q5: 轉檔的原因
從yuv->m4v->mp4,yuv應該用在撥放的地方,而mp4使用在網路傳輸上,為何不能跳過m4v

2008年5月15日 星期四

實驗十一 無線網路效能分析探討(三)

這個實驗是了解802.11b DCF和802.11e EDCA機制之運作

802.11b

執行tcl檔,並在後面增加參數0,代表802.11b


產生 sd rd 記錄檔


把mp4檔轉成yuv


算出average psnr 為33.991658 s


平均延遲:0.881965 s
最大延遲:1.257069 s


802.11e

執行tcl檔,並在後面增加參數1,代表802.11e


產生 sd rd 記錄檔


把mp4檔轉成yuv


average psnr 為34.887196 s


平均延遲:0.081828 s
最大延遲:o.495100 s

實驗十 無線網路效能分析探討(二)

一開始先測試cbrgen能不能正常使用,我測試出來是一定要用第3個方式辭能正常操作



產生出來的檔案跟課本不太一樣,不過比較其他同學的好像也是如此


接下來是測試setdest


參數設定在範圍300m*300m內不停移動,其最大速度為20m/s,模擬時間10秒


輸出結果如下圖


範例一

使用cbrgen產生traffic patern再用setdest產生無線網路移動場景


效能評估

DSDV



AODV



DSR



範例二

使用setdest產生無線網路移動場景


效能評估

DSDV



AODV



DSR

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 的封包數比較

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的方式