La mia idea era un po' diversa, vediamo comunque come semplificare le cose. Ti presento un po' di idee non necessariamente compatibili una con l'altra.
Calcolo media e varianza
È possibile mantenere aggiornata la media degli ultimi \(n\) elementi senza doverla ricalcolare ogni volta. In particolare, la media di \(k\) elementi di un qualche vettore \(X\) che partono da un indice \(s\) ha la forma:
\[ m_s = \frac{1}{k} \sum_{i = s}^{s + k - 1} X_i . \]
Supponiamo di voler a questo punto calcolare \( m_{s+1} \) a partire da \( m_s \). Per farlo è sufficiente osservare che nella sommatoria di \(m_s\) compare un solo addendo che non compare anche in quella di \(m_{s+1}\), cioè \( X_s/k \), e nella sommatoria di \(m_{s+1}\) compare un solo addendo che non compare anche in quella di \(m_s\), cioè \(X_{s+k}/k\). Da questa osservazione concludiamo che
\[ m_{s+1} = m_s + \frac{X_{s+k} - X_s}{k}. \]
A questo punto vorremmo stimare anche la differenza tra il massimo e il minimo in qualche modo. Credo che il modo migliore per ottenere un'informazione più o meno equivalente, considerando che abbiamo già la media, è quella di calcolare la varianza. Ricordando quindi le formule precedenti per la media dovremmo ottenere se non ho sbagliato i calcoli:
\[ v_{s+1} = v_s + \frac{X_{s+k} - X_s}{k}\left( (X_{s+k} + X_s) + 2\,m_s - \frac{X_{s+k} - X_s}{k}\right) \]
Verifica se la funzione è crescente
Per verificare se la funzione è globalmente crescente nel tuo blocco utilizzi la regressione lineare. Essendo una operazione abbastanza costosa (non eccessivamente ma se la calcoli \(60000 - k + 1\) volte inizia a pesare sulle performance), allora potrebbe valer la pena di saltare quanto possibile questo test. In particolare, se la soglia per la differenza tra massimo e minimo è stata settata sufficientemente ampia, allora per la maggior parte dei campioni questo test dovrebbe essere negativo. Per cui la prima cosa che farei è verificare se è davvero necessario verificare se la curva è crescente o meno. A questo punto utilizzerei però un metodo euristico più semplice. Stavo in particolare pensando di calcolare una media tra le differenze tra elementi consecutivi. Per quello che dobbiamo fare mi sembrerebbe sufficientemente accurato come metodo.
Ricerca meno fine
Se per un qualche blocco abbiamo una bassa varianza/differenza tra massimo e minimo allora anche il blocco shiftato di una posizione avrà probabilmente la stessa caratteristica. Viceversa, se ci fosse una grossa variazione di valori e abbiamo o meno trovato un picco, troveremmo lo stesso picco shiftando di poco. Si potrebbe quindi ad esempio shiftare ogni volta di un numero \(1 < d < k\) posizioni ignorando quindi alcuni casi. In questo modo potresti quindi per esempio avanzare ogni volta di ad esempio tre posizioni e considerare il blocco di cinque elementi.
Posizione picco
Se il blocco è sufficientemente piccolo, difficilmente si trovano più picchi nello stesso blocco e puoi forse scegliere come picco una posizione che sia facile da calcolare come il centro del blocco senza commettere un errore troppo grosso. Scegliendo la posizione in questo modo ti eviti molti calcoli e ottieni un errore massimo di \(0.15 mm\).



