clear;
%function sizerand用来产生一个数据包大小的随机数
%fucntion tiemrand用来产生一个数据包产生间隔大小的随机数
interval=50;%读取缓存的时间间隔
%定义缓存使用的数据结构
buffer.size=0;%数据包的大小
buffer.time=0;%数据包的产生时间
%根据timepdf和sizepdf可以确定每ms最多产生100bytes的数据
%每ms内最多产生1/2.5=0.4个数据包,则50ms内最多产生20个数据包
buffersize=21;%缓存中存数据包的个数
front=0;rear=0;N=1;%front和rear分别是缓存的头部和尾部
flag=0;
average=0;
for T=0:0.1:1000%T划分的越小buffer(N).time-T就会越趋近于0这样结果更准确(26行)
%%%%=================================向缓存中写入数据==========================
%%%%%%%%%产生时间随机数模块%%%%%%%%%
if T==0|buffer(N).time<T
temp=timerand;
if N==1&flag==0
buffer(N).time=temp;
elseif (N==1|N==2)&flag==1%若此前读完缓存时buffer(N).time==0此时程序会先进入产生时间随机数模块
% 此时N==1否则会先进入产生数据包大小模块N==2
buffer(N).time=buffer(1).time+temp;
%disp('fuck');
flag=0;
else
buffer(N).time=buffer(N-1).time+temp;
end
%%%%%%%%%%%%产生数据包大小模块%%%%%%%%%%%%%%%%
elseif buffer(N).time-T<0.1%当时间快要到达产生数据包的时间
if front==mod(rear+1,buffersize)%判断缓存是否已经满了
break
end
buffer(N).size=sizerand;
N=N+1;
buffer(N).size=0;%用来初始化新的buffer结构体,因为N加1了
buffer(N).time=0;
rear=mod(rear+1,buffersize);
end
%%=================================向缓存中写入数据结束==========================
if mod(T,interval)==0&T>0%每interval=50ms读取一次缓存,50ms内最多能读取到20个数据包
sum=0;
for k=1:(N-1)
sum=sum+buffer(k).size;
end
if average==0
average=sum/interval;
else
average=(average+sum/interval)/2
end
if buffer(N).time==0
buffer(1).time=buffer(N-1).time;
else
buffer(1).time=buffer(N).time;
end
rear=0;front=0;N=1;
flag=1;%说明缓存被读取过一次
end
end