Rob,
Does it solve your problem now?
I have to try in practice in my application see if the result is acceptable.
In a "perfect" wind controller, I should be able to detect a gradual decrescendo, that is the player blowing softer and softer to make the sound fade away gradually but I don't know how I would differentiate that from the slow decay that I see when I stop blowing altogether.
Otherwise you might need the second derivative too.
By second derivative you mean something like:
newderivative = oldvalue - newvalue ;
secondderivative = oldderivative - newderivative ;
oldderivative = newderivative ; // Remembers the previous one
Missing in the graph is the square wave, derived from the first derivative. Would make the picture complete.
Sorry, I did not include it because it does not show very well, But I am attaching it now. I am also attaching the actual Excel in case you are interested (the 8 periods moving average was calculated in the spreadsheeti itself).
Maybe smoothing the original signal with a moving average is better than smoothing the derivative (should become smoother automatically).
I did not think about that because the actual signal seems clean enough but maybe a 2 or 4 period moving average of the signal will yield a clean derivative as well and be faster to show a true change
seen this class - Arduino Playground - RunningAverage - ?
No, I haven't. It does look very useful.
My approach is very similar to yours in:
long runningAverage(int M)
which avoids the need for floating math.
with the difference that I use two distinct routines, one for initializing the array during setup() and one to update the actual running average from loop().
That has the advantage of eliminating
if (count < LMSIZE) count++;
so that the division is always by 16 (in my case) which could be replaced by a rightward 4 bit shift (though if I understand correctly, the compiler is smart enough to make the replacement).
Also, is:
index = index % LMSIZE;
More efficient than:
index++ ;
if (index >= LMSIZE) index = 0 ; // If LMSIZE is 16 index cannot be more than 15
I can post the code for my little functions if of interest (and if you'd like to comment on it)
Thanks again
Moving Average.xls (105 KB)