Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 5 additions & 15 deletions MainFiles/mainInit.m
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,8 @@
stationManagement.activeIDsCV2X = stationManagement.activeIDsCV2X(stationManagement.activeIDsCV2X>0);
stationManagement.activeIDs11p = stationManagement.activeIDs.*(stationManagement.vehicleState(stationManagement.activeIDs)~=constants.V_STATE_LTE_TXRX);
stationManagement.activeIDs11p = stationManagement.activeIDs11p(stationManagement.activeIDs11p>0);
stationManagement.indexInActiveIDs_ofLTEnodes = zeros(length(stationManagement.activeIDsCV2X),1);
for i=1:length(stationManagement.activeIDsCV2X)
stationManagement.indexInActiveIDs_ofLTEnodes(i) = find(stationManagement.activeIDs==stationManagement.activeIDsCV2X(i));
end
stationManagement.indexInActiveIDs_of11pnodes = zeros(length(stationManagement.activeIDs11p),1);
for i=1:length(stationManagement.activeIDs11p)
stationManagement.indexInActiveIDs_of11pnodes(i) = find(stationManagement.activeIDs==stationManagement.activeIDs11p(i));
end
[~, stationManagement.indexInActiveIDs_ofLTEnodes] = ismember(stationManagement.activeIDsCV2X, stationManagement.activeIDs);
[~, stationManagement.indexInActiveIDs_of11pnodes] = ismember(stationManagement.activeIDs11p, stationManagement.activeIDs);

%% Number of vehicles at the current time
outputValues.Nvehicles = length(stationManagement.activeIDs);
Expand Down Expand Up @@ -102,8 +96,7 @@

% Parameter for 11p retransmission KPI calculation, the index of active11p
% in the range during earlier retransmission
NactiveIDs11p = length(stationManagement.activeIDs11p);
stationManagement.indexInRaw_earler = zeros(NactiveIDs11p, NactiveIDs11p, length(phyParams.Raw)); % (to, from, idRaw)
stationManagement.indexInRaw_earler = zeros(simValues.maxID, simValues.maxID, length(phyParams.Raw)); % (to, from, idRaw)

% HARQ init
stationManagement.cv2xNumberOfReplicas = phyParams.cv2xNumberOfReplicasMax * ones(simValues.maxID,1);
Expand Down Expand Up @@ -237,16 +230,13 @@
outputValues.enteredInRangeLTE = -1 * ones(simValues.maxID,simValues.maxID,length(phyParams.Raw));
for iRaw = 1:length(phyParams.Raw)
valuesEnteredInRange = outputValues.enteredInRangeLTE(:,:,iRaw);
% fixme: when using tracefile, there may not be consecutive
% activeIDs (e.g. max ID in 140 cars is 150). But distanceReal has
% the number of activesIDs' rows and columns
valuesEnteredInRange(stationManagement.activeIDsCV2X,stationManagement.activeIDsCV2X) = (positionManagement.distanceReal(stationManagement.activeIDsCV2X,stationManagement.activeIDsCV2X)<=phyParams.Raw(iRaw))-1;
valuesEnteredInRange(stationManagement.activeIDsCV2X,stationManagement.activeIDsCV2X) = (positionManagement.distanceReal(stationManagement.indexInActiveIDs_ofLTEnodes, stationManagement.indexInActiveIDs_ofLTEnodes)<=phyParams.Raw(iRaw))-1;
outputValues.enteredInRangeLTE(:,:,iRaw) = valuesEnteredInRange - diag(diag(valuesEnteredInRange+1));
end
outputValues.enteredInRange11p = -1 * ones(simValues.maxID,simValues.maxID,length(phyParams.Raw));
for iRaw = 1:length(phyParams.Raw)
valuesEnteredInRange = outputValues.enteredInRange11p(:,:,iRaw);
valuesEnteredInRange(stationManagement.activeIDs11p,stationManagement.activeIDs11p) = (positionManagement.distanceReal(stationManagement.activeIDs11p,stationManagement.activeIDs11p)<=phyParams.Raw(iRaw))-1;
valuesEnteredInRange(stationManagement.activeIDs11p,stationManagement.activeIDs11p) = (positionManagement.distanceReal(stationManagement.indexInActiveIDs_of11pnodes, stationManagement.indexInActiveIDs_of11pnodes)<=phyParams.Raw(iRaw))-1;
outputValues.enteredInRange11p(:,:,iRaw) = valuesEnteredInRange - diag(diag(valuesEnteredInRange+1));
end
end
Expand Down
54 changes: 26 additions & 28 deletions MainFiles/mainPositionUpdate.m
Original file line number Diff line number Diff line change
Expand Up @@ -12,36 +12,25 @@
simValues.dataTrace,stationManagement.activeIDs, ...
positionManagement.XvehicleReal,positionManagement.YvehicleReal, ...
round(timeManagement.timeNextPosUpdate,2)-simParams.positionTimeResolution,simValues,outParams);

%% ONLY LTE
if sum(stationManagement.vehicleState(stationManagement.activeIDs)==100)>0
%if simParams.technology ~= 2 % not only 11p
if ~isempty(stationManagement.activeIDsCV2X)
% Update stationManagement.BRid vector (variable number of vehicles in the scenario)
[stationManagement.BRid] = updateBRidFile(stationManagement.BRid,stationManagement.activeIDs,indexNewVehicles);
end
end

% Vectors IDvehicleLTE and IDvehicle11p are updated
stationManagement.activeIDsCV2X = stationManagement.activeIDs.*(stationManagement.vehicleState(stationManagement.activeIDs)==100);
stationManagement.activeIDsCV2X = stationManagement.activeIDs.*(stationManagement.vehicleState(stationManagement.activeIDs)==constants.V_STATE_LTE_TXRX);
stationManagement.activeIDsCV2X = stationManagement.activeIDsCV2X(stationManagement.activeIDsCV2X>0);
stationManagement.activeIDs11p = stationManagement.activeIDs.*(stationManagement.vehicleState(stationManagement.activeIDs)~=100);
stationManagement.activeIDs11p = stationManagement.activeIDs.*(stationManagement.vehicleState(stationManagement.activeIDs)~=constants.V_STATE_LTE_TXRX);
stationManagement.activeIDs11p = stationManagement.activeIDs11p(stationManagement.activeIDs11p>0);
stationManagement.indexInActiveIDs_ofLTEnodes = zeros(length(stationManagement.activeIDsCV2X),1);
for i=1:length(stationManagement.activeIDsCV2X)
stationManagement.indexInActiveIDs_ofLTEnodes(i) = find(stationManagement.activeIDs==stationManagement.activeIDsCV2X(i));
end
stationManagement.indexInActiveIDs_of11pnodes = zeros(length(stationManagement.activeIDs11p),1);
for i=1:length(stationManagement.activeIDs11p)
stationManagement.indexInActiveIDs_of11pnodes(i) = find(stationManagement.activeIDs==stationManagement.activeIDs11p(i));
end
[~, stationManagement.indexInActiveIDs_ofLTEnodes] = ismember(stationManagement.activeIDsCV2X, stationManagement.activeIDs);
[~, stationManagement.indexInActiveIDs_of11pnodes] = ismember(stationManagement.activeIDs11p, stationManagement.activeIDs);

% % For possible DEBUG
% figure(300)
% plot(timeManagement.timeNextPosUpdate*100*ones(1,length(positionManagement.XvehicleReal)),positionManagement.XvehicleReal,'*');
% hold on

% Update variables for resource allocation in LTE-V2V
%if simParams.technology ~= 2 % not only 11p
if sum(stationManagement.vehicleState(stationManagement.activeIDs)==100)>0
if ~isempty(stationManagement.activeIDsCV2X) % if there were active CV2X

% if simParams.BRAlgorithm==18 && timeManagement.timeNow > phyParams.Tsf (Vittorio 5.5.3)
if simParams.BRAlgorithm==constants.REASSIGN_BR_STD_MODE_4 && timeManagement.timeNow > phyParams.TTI
Expand All @@ -56,13 +45,17 @@
( rand(length(stationManagement.activeIDs(indexNewVehicles)),1) * (2*simParams.coexA_desynchError) - simParams.coexA_desynchError);
end
end
% Update stationManagement.resReselectionCounterCV2X for vehicles exiting the scenario
% Update stationManagement.resReselectionCounterCV2X for vehicles EXITING the scenario
stationManagement.resReselectionCounterCV2X(stationManagement.activeIDsExit) = Inf;
% Update stationManagement.resReselectionCounterCV2X for vehicles entering the scenario

% Update stationManagement.resReselectionCounterCV2X for vehicles ENTERING the scenario
% a) LTE vehicles that enter or are blocked start with a counter set to 0
% b) 11p vehicles are set to Inf
stationManagement.resReselectionCounterCV2X((stationManagement.BRid(:,1)==-1) & (stationManagement.vehicleState==constants.V_STATE_LTE_TXRX)) = 0;
stationManagement.resReselectionCounterCV2X((stationManagement.BRid(:,1)==-1) & (stationManagement.vehicleState~=constants.V_STATE_LTE_TXRX)) = Inf;
indexNewVehicleInAll = zeros(simValues.maxID,1);
indexNewVehicleInAll(stationManagement.activeIDs(indexNewVehicles)) = deal(1);
stationManagement.resReselectionCounterCV2X(indexNewVehicleInAll & (stationManagement.vehicleState==constants.V_STATE_LTE_TXRX)) = 0;
stationManagement.resReselectionCounterCV2X(indexNewVehicleInAll & (stationManagement.vehicleState~=constants.V_STATE_LTE_TXRX)) = Inf;

% Reset stationManagement.errorSCImatrixLTE for new computation of correctly received SCIs
%stationManagement.correctSCImatrixCV2X = zeros(length(stationManagement.activeIDsCV2X),length(stationManagement.activeIDsCV2X)-1);
end
Expand All @@ -73,6 +66,11 @@
% Add LTE positioning error (if selected)
% (Xvehicle, Yvehicle): fictitious vehicles' position seen by the eNB
[simValues.XvehicleEstimated(PosUpdateIndex),simValues.YvehicleEstimated(PosUpdateIndex)] = addPosError(positionManagement.XvehicleReal(PosUpdateIndex),positionManagement.YvehicleReal(PosUpdateIndex),simParams.sigmaPosError);

% update stationManagement
stationManagement.hasTransmissionThisSlot = ismember(stationManagement.activeIDsCV2X, stationManagement.transmittingIDsCV2X);
[~, stationManagement.indexInActiveIDsOnlyLTE_OfTxLTE] = ismember(stationManagement.transmittingIDsCV2X, stationManagement.activeIDsCV2X);
[~, stationManagement.indexInActiveIDs_OfTxLTE] = ismember(stationManagement.transmittingIDsCV2X, stationManagement.activeIDs);
end

% Call function to compute the distances
Expand All @@ -90,7 +88,7 @@
[positionManagement,stationManagement] = computeNeighbors (stationManagement,positionManagement,phyParams);

% Floor coordinates for PRRmap creation (if enabled)
if simParams.typeOfScenario==2 && outParams.printPRRmap % only traffic trace
if simParams.typeOfScenario==constants.SCENARIO_TRACE && outParams.printPRRmap % only traffic trace
simValues.XmapFloor = floor(simValues.Xmap);
simValues.YmapFloor = floor(simValues.Ymap);
end
Expand Down Expand Up @@ -168,7 +166,7 @@
if ~isempty(stationManagement.activeIDsCV2X)
for iRaw = 1:length(phyParams.Raw)
valuesEnteredInRange = outputValues.enteredInRangeLTE(:,:,iRaw);
valuesEnteredInRange(stationManagement.activeIDsCV2X,stationManagement.activeIDsCV2X) = (valuesEnteredInRange(stationManagement.activeIDsCV2X,stationManagement.activeIDsCV2X)<0 & positionManagement.distanceReal(stationManagement.activeIDsCV2X,stationManagement.activeIDsCV2X)<=phyParams.Raw(iRaw))*(1+timeManagement.timeNow)-1;
valuesEnteredInRange(stationManagement.activeIDsCV2X,stationManagement.activeIDsCV2X) = (valuesEnteredInRange(stationManagement.activeIDsCV2X,stationManagement.activeIDsCV2X)<0 & positionManagement.distanceReal(stationManagement.indexInActiveIDs_ofLTEnodes,stationManagement.indexInActiveIDs_ofLTEnodes)<=phyParams.Raw(iRaw))*(1+timeManagement.timeNow)-1;
valuesEnteredInRange( positionManagement.distanceReal > phyParams.Raw(iRaw) ) = -1;
outputValues.enteredInRangeLTE(:,:,iRaw) = valuesEnteredInRange - (diag(diag(valuesEnteredInRange+1)));
end
Expand All @@ -177,7 +175,7 @@
if ~isempty(stationManagement.activeIDs11p)
for iRaw = 1:length(phyParams.Raw)
valuesEnteredInRange = outputValues.enteredInRange11p(:,:,iRaw);
valuesEnteredInRange(stationManagement.activeIDs11p,stationManagement.activeIDs11p) = (valuesEnteredInRange(stationManagement.activeIDs11p,stationManagement.activeIDs11p)<0 & positionManagement.distanceReal(stationManagement.activeIDs11p,stationManagement.activeIDs11p)<=phyParams.Raw(iRaw))*(1+timeManagement.timeNow)-1;
valuesEnteredInRange(stationManagement.activeIDs11p,stationManagement.activeIDs11p) = (valuesEnteredInRange(stationManagement.activeIDs11p,stationManagement.activeIDs11p)<0 & positionManagement.distanceReal(stationManagement.indexInActiveIDs_of11pnodes,stationManagement.indexInActiveIDs_of11pnodes)<=phyParams.Raw(iRaw))*(1+timeManagement.timeNow)-1;
valuesEnteredInRange( positionManagement.distanceReal > phyParams.Raw(iRaw) ) = -1;
outputValues.enteredInRange11p(:,:,iRaw) = valuesEnteredInRange - (diag(diag(valuesEnteredInRange+1)));
end
Expand All @@ -187,14 +185,14 @@

% Update of parameters related to transmissions in IEEE 802.11p to cope
% with vehicles exiting the scenario
%if simParams.technology ~= 1 % not only LTE
if sum(stationManagement.vehicleState(stationManagement.activeIDs)~=100)>0
if ~isempty(stationManagement.activeIDs11p)

timeManagement.timeNextTxRx11p(stationManagement.activeIDsExit) = Inf;
sinrManagement.idFromWhichRx11p(stationManagement.activeIDsExit) = stationManagement.activeIDsExit;
sinrManagement.instantThisSINRavStarted11p(stationManagement.activeIDsExit) = Inf;
stationManagement.vehicleState(stationManagement.activeIDsExit(stationManagement.vehicleState(stationManagement.activeIDsExit)~=100)) = 1;

stationManagement.indexInRaw_earler(:,stationManagement.activeIDsExit,:) = 0;

% The average SINR of all vehicles is then updated
sinrManagement = updateSINR11p(timeManagement,sinrManagement,stationManagement,phyParams);

Expand Down
10 changes: 5 additions & 5 deletions MainFilesCV2X/mainCV2XttiStarts.m
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
end
end
% hasTransmissionThisSlot introduced from version 6.2
stationManagement.hasTransmissionThisSlot(stationManagement.transmittingIDsCV2X)=1;
stationManagement.hasTransmissionThisSlot(ismember(stationManagement.activeIDsCV2X,stationManagement.transmittingIDsCV2X))=1;
%%

timeManagement.timeGeneratedPacketInTxLTE(stationManagement.transmittingIDsCV2X) = timeManagement.timeLastPacket(stationManagement.transmittingIDsCV2X);
Expand All @@ -49,10 +49,10 @@
% Find index of vehicles that are currently transmitting
stationManagement.indexInActiveIDsOnlyLTE_OfTxLTE = zeros(length(stationManagement.transmittingIDsCV2X),1);
stationManagement.indexInActiveIDs_OfTxLTE = zeros(length(stationManagement.transmittingIDsCV2X),1);
for ix = 1:length(stationManagement.transmittingIDsCV2X)
stationManagement.indexInActiveIDsOnlyLTE_OfTxLTE(ix) = find(stationManagement.activeIDsCV2X == stationManagement.transmittingIDsCV2X(ix));
stationManagement.indexInActiveIDs_OfTxLTE(ix) = find(stationManagement.activeIDs == stationManagement.transmittingIDsCV2X(ix));
end

[~, stationManagement.indexInActiveIDsOnlyLTE_OfTxLTE] = ismember(stationManagement.transmittingIDsCV2X, stationManagement.activeIDsCV2X);
[~, stationManagement.indexInActiveIDs_OfTxLTE] = ismember(stationManagement.transmittingIDsCV2X, stationManagement.activeIDs);

end

% Initialization of the received power
Expand Down
21 changes: 10 additions & 11 deletions MainFilesIEEE802.11p/checkVehiclesStartReceiving11p.m
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
(stationManagement.vehicleState(activeIDs)==constants.V_STATE_11P_BACKOFF);
notEndingBackoff = timeManagement.timeNextTxRx11p(activeIDs) >= (timeManagement.timeNow+phyParams.tSlot-1e-10);

alreadyReceingAnotherPreamble = ( stationManagement.vehicleState(activeIDs)==constants.V_STATE_11P_RX & ...
alreadyReceingAnotherPreamble = stationManagement.vehicleState(activeIDs)==constants.V_STATE_11P_RX & ...
( (timeManagement.timeNow-sinrManagement.instantThisSINRstarted11p(activeIDs)) < 4e-6 ...
| sinrManagement.idFromWhichRx11p(activeIDs) == activeIDs ) );
| sinrManagement.idFromWhichRx11p(activeIDs) == activeIDs );

if indexEventInActiveIDs>0
% Normal case - one node is transmitting
Expand All @@ -39,10 +39,10 @@

% if preambel of the same packet was detected earlier, the following
% preamble is automatically detected
decodingThisPreamble = stationManagement.preambleAlreadyDetected(:,indexEventInActiveIDs) | (preambelSINR > phyParams.sinrThreshold11p_preamble);
decodingThisPreamble = stationManagement.preambleAlreadyDetected(activeIDs,indexEventInActiveIDs) | (preambelSINR > phyParams.sinrThreshold11p_preamble);

% update detected preamble
stationManagement.preambleAlreadyDetected(:,indexEventInActiveIDs) = decodingThisPreamble;
stationManagement.preambleAlreadyDetected(activeIDs,indexEventInActiveIDs) = decodingThisPreamble;

% % Approach 2: I check that the received power is above the sensing
% % threshold for decodable signals (-85 dBm in specs)
Expand All @@ -51,7 +51,7 @@
%
% From version 5.3.1, the channel check is added
% If the channel is not the same, then C is set to 0
decodingThisPreamble = decodingThisPreamble & sameChannel(stationManagement.activeIDs);
decodingThisPreamble = decodingThisPreamble & sameChannel(activeIDs);
else
% Only interference, with no real useful signal
% In this case C is always 'false'
Expand Down Expand Up @@ -110,14 +110,14 @@
% The inteference is saved in sensedPowerByLteNo11p per beacon
% resource and needs to be converted into "per subchannel"
if ~isempty(sinrManagement.sensedPowerByLteNo11p)
interferenceFromLTEnodesPerSubframe = (sum(sinrManagement.sensedPowerByLteNo11p)/length(sinrManagement.sensedPowerByLteNo11p(:,1)))';
interferenceFromLTEnodesPerSubframe = (sum(sinrManagement.sensedPowerByLteNo11p)/size(sinrManagement.sensedPowerByLteNo11p,1))';
else
interferenceFromLTEnodesPerSubframe = 0; %zeros(length(),1);
end
% sinrThr=phyParams.LOS(stationManagement.indexInActiveIDs_ofLTEnodes,indexEventInActiveIDs).*phyParams.sinrThreshold11p_LOS+...
% (1-phyParams.LOS(stationManagement.indexInActiveIDs_ofLTEnodes,indexEventInActiveIDs)).*phyParams.sinrThreshold11p_NLOS;
% retransmission may should be considered here
decodingThePreamble = (sinrManagement.P_RX_MHz(stationManagement.indexInActiveIDs_ofLTEnodes,indexEventInActiveIDs) ./ (phyParams.Pnoise_MHz + (rxPowerTotNow_MHz(stationManagement.activeIDsCV2X)-sinrManagement.P_RX_MHz(stationManagement.indexInActiveIDs_ofLTEnodes,indexEventInActiveIDs)) + interferenceFromLTEnodesPerSubframe) > phyParams.sinrThreshold11p_preamble);
decodingThePreamble = (sinrManagement.P_RX_MHz(stationManagement.indexInActiveIDs_ofLTEnodes,indexEventInActiveIDs) ./ (phyParams.Pnoise_MHz + (rxPowerTotNow_MHz(stationManagement.indexInActiveIDs_ofLTEnodes)-sinrManagement.P_RX_MHz(stationManagement.indexInActiveIDs_ofLTEnodes,indexEventInActiveIDs)) + interferenceFromLTEnodesPerSubframe) > phyParams.sinrThreshold11p_preamble);
ifStartDetecting11p = (stationManagement.vehicleState(stationManagement.activeIDsCV2X)==constants.V_STATE_LTE_TXRX)...
& ~sinrManagement.coex_detecting11p(stationManagement.activeIDsCV2X)...
& decodingThePreamble;
Expand Down Expand Up @@ -145,15 +145,14 @@
% only count the first receiving repetition
% nodesMightStartTiming = (stationManagement.vehicleState(activeIDs)==3) | ...
% (decodingThisPreamble & higherThanThreshold);
nodesMightStartTiming = (activeIDs==indexEventInActiveIDs) | ...
(decodingThisPreamble & higherThanThreshold);
nodesMightStartTiming = (activeIDs==idEvent) | (decodingThisPreamble & higherThanThreshold);

% Then the nodes starting the channel busy are calculated
ifStartCBR = (timeManagement.cbr11p_timeStartBusy(activeIDs)==-1 & nodesMightStartTiming);
% only count the first time that it detect the preamble and sensing the high power at the
% same time
ifFirstTimeStartCBR = (ifStartCBR - stationManagement.alreadyStartCBR(:,indexEventInActiveIDs)) > 0;
stationManagement.alreadyStartCBR(:,indexEventInActiveIDs) = stationManagement.alreadyStartCBR(:,indexEventInActiveIDs) | ifStartCBR;
ifFirstTimeStartCBR = (ifStartCBR - stationManagement.alreadyStartCBR(activeIDs,indexEventInActiveIDs)) > 0;
stationManagement.alreadyStartCBR(activeIDs,indexEventInActiveIDs) = stationManagement.alreadyStartCBR(activeIDs,indexEventInActiveIDs) | ifStartCBR;

% Time is updated
timeManagement.cbr11p_timeStartBusy(activeIDs(ifFirstTimeStartCBR)) = timeManagement.timeNow;
Expand Down
Loading