t = 0:2^8;
N = length(t);
tau = 10;
x_asym = 4;
x_r2s = x_asym*(1 - exp(-t/tau));
sig = 0.05;
phi = 0.6;
xi1 = sig*randn(1,N);
xi2 = sig*randn(1,N);
pert1 = filter(1,[1 -phi],xi1);
pert2 = filter(1,[1 -phi],xi2);
x_prd_1 = x_r2s+pert1;
x_prd_2 = x_r2s+pert2;
N = 10;
x_prd_1savg = myslidingavg(x_prd_1, N);
x = t;
y = x_prd_1;
f = @(a,b,c,x) a.*(1-exp(b.*(x-c)));
obj_fun = @(params) norm(f(params(1), params(2), params(3),x)-y);
sol = fminsearch(obj_fun, [y(end),0,0]);
a_sol = sol(1);
b_sol = sol(2);
c_sol = sol(3);
x_prd_1fit = f(a_sol, b_sol,c_sol, x);
figure
plot(t,x_r2s,'b',t,x_prd_1,'r',t,x_prd_1savg,'c',t,x_prd_1fit,'k');
legend('signal','signal+noise','after sliding avg','exp fit');
function out = myslidingavg(in, N)
if (isempty(in)) | (N<=0)
disp(sprintf('SlidingAvg: (Error) empty input data or N null.'));
return;
end
if (N==1)
out = in;
return;
end
nx = length(in);
if (N>=(2*(nx-1)))
out = mean(in)*ones(size(in));
return;
end
out = zeros(size(in));
if rem(N,2)~=1
m = N/2;
else
m = (N-1)/2;
end
for i=1:nx,
dist2start = i-1;
dist2end = nx-i;
if dist2start<m || dist2end<m
dd = min(dist2start,dist2end);
else
dd = m;
end
out(i) = mean(in(i-dd:i+dd));
end
end
0 Comments
Sign in to comment.