Hi, so for future people who might run into the same problem, I found a solution:
I offset the original curve down/up with the given y-offset. After that, calculate how many timesteps/times the curve has to be shifted to the right/left to get the given x-(time-)offset.
Now shift the upper/lower bound to the left/right by that exact number of elemetns in the array. Compare every new value at those timesteps and if they are greater than the original upper bound (or lower for the lower bound respectively), exchange the value in the upper/lower bound. See my code, I hope it clears up what words couldn't explain:
% Just some input
X = 0:0.1:10;
Y = sin(X);
ValTolerance = 2;
TimeTolerance = 1;
%Generate upper/lower bound without shift to right/left
UpperBound = Y + ValTolerance;
LowerBound = Y - ValTolerance;
%Generate arrays, which are for right/left shifting
UpperRL = UpperBound;
LowerRL = LowerBound;
%Needed times of array indice shifting to get wanted time-delay-tolerance
Dist = find(X >= TimeTolerance, 1)-1;
%Generate matrix in such way that:
% 1st row: X-Values from 0 to 10
% 2nd row: Y Values of sin function
% 3rd row: UpperBound without shifting left/right
% 4th row: Same UpperBound array, to be shiftet left/right
% 5th row: LowerBound without shifting left/right
% 6th row: Same LowerBound array, to be shiftet left/right
M = [X; Y; UpperBound; UpperRL; LowerBound; LowerRL];
%Right direction
for z1 = 1:Dist %shift as often as needed for wanted time-delay-tolerance
M(4,z1+1:end) = M(4,z1:end-1); %shift UpperRL array one element to the right
M(4,1) = 0; %replace first array element with 0, as there is no known value for it
M(6,z1+1:end) = M(6,z1:end-1); %do the same for the LowerRL array
M(6,1) = 0;
for z2 = 1:length(M(1,:)) %compare the whole dataset
if M(4, z2) > M(3, z2) %replace values of the UpperBound array, if the UpperRL values are greater
M(3,z2) = M(4,z2);
end
if M(6, z2) < M(5, z2) %replace values of the LowerBound array, if the LowerRL values are smaller
M(5,z2) = M(6,z2);
end
end
end
%reset UpperRL and LowerRL arrays to do the same thing for the left direction
M(4,:) = UpperBound;
M(6,:) = LowerBound;
%Left direction
for z1 = 1:Dist
M(4,1:end-z1) = M(4,2:(end-z1)+1);
M(4,end) = 0;
M(6,1:end-z1) = M(6,2:(end-z1)+1);
M(6,end) = 0;
for z2 = 1:length(M(1,:))
if M(4, z2) > M(3, z2)
M(3,z2) = M(4,z2);
end
if M(6, z2) < M(5, z2)
M(5,z2) = M(6,z2);
end
end
end
%final arrays of the upper and lower bound
UpperBound = M(3,:);
LowerBound = M(5,:);
It most certainly is not the most potent code but it does its job:
One thing is also the flat ends at the start and at the end, which appear because there is no information about the signal outside the given window.