# Onset Detection Peak Picking

I have a guitar music signal and I want to detect the onset points via energy.

This is the signal example: This is the energy plot: My question is what would be the best method defining the threshold and consequently finding the peaks. I reckon I will have to set a window length and a window step (I am thinking 1000 and 100 samples respectively on a 44.1KHz sampling rate) and then every loop defining a new threshold (adaptive/local threshold). Every loop I would have to find the window average and compare it to the threshold. I have these questions:

1) Does window length = 1000 samples and window step = 100 seems reasonable?

2) How the threshold would be defined each loop and in relation to what?

3) If a window is above length which samples in it would I consider peaks? I think it would be somewhere in the middle but what range around it?

Maybe, window middle - window step < peak samples < window middle + window step ?

• Perhaps implement an F-Test or one of the other statistical analysis of variance tests. – rickhg12hs Nov 14 '13 at 20:12
• do you have a sample we can try? – geometrikal Dec 17 '13 at 3:46

1. compute RMS from audio signal to get power
2. do AGC (automatic gain control)
3. perform "discrete differentiation" (the simplest is 1st order: $y[i] = x[i] - x[i-1]$)
4. if the value is greater than certain threshold, it means we have an onset. You have to determinate the threshold experimentally or use adaptive algorithm. Obviously you also need some kind of lowpass filter to filter the noise.

You may want to swap steps 2 and 3.

If you can use software libraries, check out aubio.

Possible duplicate of https://stackoverflow.com/questions/294468/note-onset-detection

• I've already read the linked article but there are many problems with the method described. The most important of all that the compression is described in terms of the specific track. It is very very hard to find a compression threshold that applies to every track. So I abandoned this idea a long time ago. I feel that the second diagram, which is variance, x1 = (x-m)^2, seems really good to extract information. My question was how would I find the onset points. The obvious answer, that works pretty ok, is to take the plot average and define the threshold in relation to the average. – user2832080 Nov 18 '13 at 11:32
• compression and then fixed thresholding is the same as having no compression but the threshold adjusted in proportion to the energy or magnitude signal. some people might suggest computing the envelope from the analytic signal (which you get from use of the Hilbert Transform), but i think squaring is good enough. you might want to run a peak level detector with a decay rate on that squared energy signal. and then define your threshold to be some percent of the detected and smoothed peak level. – robert bristow-johnson Mar 17 '14 at 3:13