Code covered by the BSD License  

Highlights from
DESOS

image thumbnail
from DESOS by Ugo Pattacini
Simulation tool for payload data volume and downlink latency estimation in a LEO scenario

SettingsString=DESOS_settings
function SettingsString=DESOS_settings
% Parameter settings for DESOS model
%
% Author: Ugo Pattacini

% Fetch parameters from settings block in model.
settingsBlock=[bdroot '/SETTINGS'];
[TOrbit,OrbitConst,RO,CompressionType,Compression,PassThrough,PassThroughPerc,...
 Limit]=getSettings(settingsBlock,'TOrbit','OrbitConst','RO','CompressionType',...
'Compression','PassThrough','PassThroughPerc','Limit');

TOrbit=eval(TOrbit);
OrbitConst=eval(OrbitConst);
RO=eval(RO);
Compression=eval(Compression);
PassThrough=upper(PassThrough);
PassThroughPerc=eval(PassThroughPerc)/100;
Limit=eval(Limit);

switch upper(CompressionType)
    case 'OFF'
        Compression=1;
        compstr='';
    case '1D-FFT'
        Compression=1-Compression/100;
        compstr=sprintf(' (%s%%)',get_param(bdroot,'CompFact1D'));
    case '2D-FFT'
        Compression=1-Compression/100;
        compstr=sprintf(' (%s%%)',get_param(bdroot,'CompFact2D'));
end

SettingsString=sprintf('\nOrbit Period = %g min\n\n',TOrbit/60);
SettingsString=[SettingsString sprintf('Downlink Data Rate = %g Mbps/ch\n\n',RO)];
SettingsString=[SettingsString sprintf('Compression: %s%s\n\n',CompressionType,compstr)];
SettingsString=[SettingsString sprintf('Pass-Through: %s\n',PassThrough)];

% Entity size [MB]
EnSz=10;

Contacts=load('Contacts');
Contacts=Contacts.Contacts;

% Acquisitions handling
Acquisitions=load('Acquisitions');
Acquisitions=Acquisitions.Acquisitions;

Acquisitions_1=Acquisitions;
d_1=diff(Acquisitions_1(:,2).*Acquisitions_1(:,3));
Acquisitions_1(find(~d_1)+1,:)=[];

Acquisitions_2=Acquisitions;
Acquisitions_2(find(Acquisitions_2(:,3)<2),2)=-1; %#ok<FNDSB>
d_2=diff(Acquisitions_2(:,2));
Acquisitions_2(find(~d_2)+1,:)=[];

[AcqEn_1,AcqIntTime_1]=AcqHandling(Acquisitions_1,Compression,EnSz);
[AcqEn_2,AcqIntTime_2]=AcqHandling(Acquisitions_2,Compression,EnSz);
% ------------------------------

% Pass-Through handling
if strcmpi(PassThrough,'off')
    PassThrough_1=[0 0];
    PassThrough_2=[0 0];
else
    PassThroughPerc=min(PassThroughPerc,1);
    PassThroughPerc=max(PassThroughPerc,0);

    C=Contacts;    
    idx=find(C(:,2)>0);
    RemoveN=round(length(idx)*(1-PassThroughPerc));
    for i=1:RemoveN;
        j=round(rand*(length(idx)-1))+1;
        C(idx(j),2)=-1;
        idx(j)=[];
    end
    
    PassThrough_1=ComputeAND(C,AcqEn_1);
    PassThrough_2=ComputeAND(C,AcqEn_2);
end
% ------------------------------

OrbitConst=TOrbit*OrbitConst;
ServiceTime=(EnSz*8*2^20)/(RO*1e6);
Tfinal=min(Contacts(end,1),Acquisitions(end,1));
Tfinal=min(Tfinal,TOrbit*Limit);

assignin('base','AcqIntTime_1',AcqIntTime_1);
assignin('base','AcqIntTime_2',AcqIntTime_2);
assignin('base','AcqEn_1',AcqEn_1);
assignin('base','AcqEn_2',AcqEn_2);
assignin('base','PassThrough_1',PassThrough_1);
assignin('base','PassThrough_2',PassThrough_2);
assignin('base','Contacts',Contacts);
assignin('base','Compression',Compression);
assignin('base','Tfinal',Tfinal);
assignin('base','TOrbit',TOrbit);                   % [s]
assignin('base','OrbitConst',OrbitConst);           % [min]
assignin('base','EnSz',EnSz);                       % [MB]
assignin('base','ServiceTime',ServiceTime);         % [s]



%--------------------------------------------------------------------------
function varargout=getSettings(settingsBlock,varargin)

for i=1:length(varargin)
    varargout{i}=get_param(settingsBlock,varargin{i});
end



%--------------------------------------------------------------------------
function [AcqEn,AcqIntTime]=AcqHandling(Acquisitions,Compression,EnSz)

sz=size(Acquisitions);
L=sz(1);
AcqEn=[Acquisitions(:,1) -ones(L,1)];
AcqEn(find(Acquisitions(:,2)>0),2)=1; %#ok<FNDSB>
d=diff(AcqEn(:,2));
AcqEn(find(~d)+1,:)=[];

AcqIntTime=Acquisitions(:,1:2);
i=find(AcqIntTime(:,2)<0);
AcqIntTime(i,2)=AcqIntTime(min(i+1,L),2);
sz=size(AcqIntTime);
if sz(1)==1 && AcqIntTime(1,2)<0
    AcqIntTime(1,2)=1;
    return;
end
if AcqIntTime(end,2)<0
   AcqIntTime(end,:)=[]; 
end
d=diff(AcqIntTime(:,2));
AcqIntTime(find(~d)+1,:)=[];

qty=0;
sz=size(AcqIntTime);
for i=1:sz(1)-1
    t=AcqIntTime(i+1,1)-AcqIntTime(i,1);
    MBps=AcqIntTime(i,2)*Compression/(8*2^20);
    MB=max(MBps*t+qty,0);
    EnNum=round(MB/EnSz);
    qty=MB-EnNum*EnSz;
    AcqIntTime(i,2)=t/(EnNum+1);
end
AcqIntTime(end,2)=(EnSz*8*2^20)/(AcqIntTime(end,2)*Compression);



%--------------------------------------------------------------------------
function y=ComputeAND(x1,x2)

t1=x1(:,1);
t2=x2(:,1);

t=sort([t1; t2]);
d=diff(t);
t(find(~d)+1)=[];
L=length(t);

y1=zeros(L,1);
[c,i]=intersect(t,t1);
y1(i)=max(x1(:,2),0);
j=setdiff(1:L,i);
for k=1:length(j)
    if j(k)>1
        y1(j(k))=y1(j(k)-1);
    end
end

y2=zeros(L,1);
[c,i]=intersect(t,t2);
y2(i)=max(x2(:,2),0);
j=setdiff(1:L,i);
for k=1:length(j)
    if j(k)>1
        y2(j(k))=y2(j(k)-1);
    end
end

y=[t and(y1,y2)];
d=diff(y(:,2));
y(find(~d)+1,:)=[];

Contact us at files@mathworks.com