How to find peaks and periods? I am looking at data like this:

Source data: http://pastebin.com/raw.php?i=L6cd8d5K
The data is quasi-periodic, there is a distinct cycle but it is not an exact repeat, and the period changes considerably.  I would like to find accurate peak positions, and period durations, for each cycle.  Ideally the peak positions would match the intuitive notion of where the exact peak is.
What makes this hard:

noise: although it may not be entirely noise!  the variation is much greater when the values are high, and so the highest spikes tend to occur near where the &quot;real&quot; peak is.

the waveform is not symmetrical: neither left-to-right nor up-down.  doing something like a highpass filter will move peaks up and down by an amount that depends on their duration and the shape in between.


What is unlikely to work well:

bandpass filter combined with conventional peak picking: the position of the peaks will shift since values from the (asymmetrical) up and down slopes is added to where the peak is.  The really high values will not have a high weight in the result since the lowpass part of the bandpass filter will spread their energy to adjacent values.

autocorrelation: the shape of successive cycles is too different.

period durations measured from the leading (or trailing) edge of one cycle to the next: again shapes are too different.
Personally, I would just use a lowpass filter  try and keep it as small as possible to reduce the effect of asymmetry.

The fact that there is significant noise already implies some uncertainty in the peak position, I expect this will be of similar or greater magnitude to any bias the filter introduces.

If you are really concerned about the bias you could look at using morphological opening and closing filters. This is basically running a ball over/under the surface so either one will over/underestimate the peak height. You can then get 2 lines to give an envelope of where the peak may lie.  The average of the two curves is probably a decent estimate of the "true" curve prodived the noise frequency is suitably high.