Another approach is to use compound median filtering which returns a blocky function. Then threshold the jumps between blocks. No assumptions about the number or size of blocks is made.
Function to plot the input series as discrete jumps.
BlockPlot[s_] :=
Partition[
Flatten[{s[[1]],
Table[{{s[[i, 1]], s[[i - 1, 2]]}, s[[i]]}, {i, 2, Length[s]}]}],
2]
Median filter until the signal does not change, then repeat for successively wider window radii r.
MedianFilterRoot[x_, r_] := FixedPoint[Round[MedianFilter[#, r]]&, x]
CompoundMedianFilter[x_?VectorQ, r_] := Fold[MedianFilterRoot[#1,#2]&,x,Range[r]]
CompoundMedianFilter[x_?MatrixQ, r_] :=
Transpose[{x[[All,1]], Fold[MedianFilterRoot[#1, #2]&,x[[All,2]],Range[r]]}]
Find locations where the signal jumps more than the threshold t.
DifferenceThreshold[y_List, t_] :=
Pick[Most[y], UnitStep[Abs[Differences[y[[All, 2]]]] - t], 1]
Subsample the imported data v down to w, for faster execution, and find the maximum. Both are global variables.
w = v[[Range[1, 3142, 10]]];
max = Max[w[[All, 2]]];
Adjust the maximum filter window radius r, and the jump threshold t.
Manipulate[
Module[{y = CompoundMedianFilter[w, r]},
ListLinePlot[BlockPlot[y], PlotStyle -> Directive[Thick, Blue],
Prolog -> {Red, Point[w]},
Epilog -> {Darker[Green],
Map[Line[{{#[[1]], 0}, {#[[1]], max}}]&, DifferenceThreshold[y, t]]},
Frame -> True, PlotRange -> {0, max}, ImageSize -> 600]],
{{r, 10, "Max CMF Radius"}, 1, 30, 1, Appearance -> "Labeled"},
{{t, 30, "Jump Threshold"}, 10, 200, 10, Appearance -> "Labeled"}
]
