Fs = 10;
t = 0:1/Fs:20;
measured = sin(t-2) + sin(3*(t-2))/3 + sin(5*(t-2))/5 + sin(7*(t-2))/7 + sin(9*(t-2))/9;
model = @(x) x(1)*sign(sin(x(2)*t-x(3)))+x(4);
index = measured>0.5;
hi_med = median(measured(index))
lo_med = median(measured(~index))
edge_points = find(diff(index)>0);
period = mean(edge_points(2:2:end)-edge_points(1:2:end-1))/Fs
phi = edge_points(1)/Fs;
x0 = [(hi_med-lo_med)/2 2*pi/period phi (hi_med-lo_med)/2+lo_med];
fun = @(x) norm(model(x)-measured);
options = optimset('Display','iter','PlotFcns',@optimplotfval);
[x,fval,exitflag,output] = fminsearch(fun,x0,options)
figure, plot(t,[measured; model(x0); model(x)]);
legend('測定値','初期値','最適値');
xlabel('時刻 t'); ylabel('値'); title('矩形波のフィッティング');