I suppose you can use synchronous averaging in this case due to the signal being periodic and the nature of the noise (as long as it is sufficiently uncorrelated). See MATLAB example:
ts = 1e-4; % sampling time
tend = 10; % end time
t = 0:ts:tend-ts; % time vector
fx = 10; % periodic signal frequency
x = 5*sin(2*pi*fx*t); % periodic signal
switch 2
case 1
n = 1*rand(1,length(x)); % noise in (0,1)
case 2
R = 50; % upsampling factor
nn = 1*rand(1,length(x)/R+1);
tn = 0:ts*R:tend;
nnn = timeseries(nn,tn);
nnnn = resample(nnn, t, 'zoh');
n = nnnn.Data(:).'; % noise that looks like OP's plot
end
%y = x + n; % additive
y = x.*n; % multiplicative
nsp = 1/(fx*ts); % no. samples per period
NP = fx*tend; % no. periods
avg = zeros(1,nsp); % initialise
for k = 1:NP % loop over number of periods available
Is = (k-1)*nsp+1; % index to start of period
Ie = k*nsp; % index to end of period
avg = avg + 1/NP*y(Is:Ie); % add period to average
end
avg = 2.*avg; % scale dependent on noise and how it enters the signal
plot(t(1:nsp),y(1:nsp),t(1:nsp),avg,t(1:nsp),x(1:nsp)) % plot signals
legend('signal with noise', 'average', 'signal')
