Ho uno spettro TOF e vorrei implementare un algoritmo utilizzando python (numpy) che trova tutti i massimi dello spettro e restituisce i corrispondenti valori x.
Ho cercato online e ho trovato l'algoritmo riportato di seguito.
trova la posizione dei picchi in uno spettro numpy
L'assunto è che vicino al massimo la differenza tra il valore precedente e il valore al massimo è maggiore di un numero DELTA. Il problema è che il mio spettro è composto da punti equamente distribuiti, anche vicino al massimo, così che DELTA non viene mai superato e la funzione peakdet restituisce una matrice vuota.
Avete qualche idea su come superare questo problema? Gradirei davvero i commenti per capire meglio il codice dato che sono abbastanza nuovo in Python.
Grazie!
import sys
from numpy import NaN, Inf, arange, isscalar, asarray, array
def peakdet(v, delta, x = None):
maxtab = []
mintab = []
if x is None:
x = arange(len(v))
v = asarray(v)
if len(v) != len(x):
sys.exit('Input vectors v and x must have same length')
if not isscalar(delta):
sys.exit('Input argument delta must be a scalar')
if delta <= 0:
sys.exit('Input argument delta must be positive')
mn, mx = Inf, -Inf
mnpos, mxpos = NaN, NaN
lookformax = True
for i in arange(len(v)):
this = v[i]
if this > mx:
mx = this
mxpos = x[i]
if this < mn:
mn = this
mnpos = x[i]
if lookformax:
if this < mx-delta:
maxtab.append((mxpos, mx))
mn = this
mnpos = x[i]
lookformax = False
else:
if this > mn+delta:
mintab.append((mnpos, mn))
mx = this
mxpos = x[i]
lookformax = True
return array(maxtab), array(mintab)
Di seguito viene mostrata parte dello spettro. In realtà ho più picchi di quelli mostrati qui.
Correggere il seguente: questa> mn + Delta e questo (mn + delta) e questo <(mx -delta) –
TommasoF
Il codice era senza parentesi. Tuttavia, anche con loro non cambia molto. Ho ancora un array vuoto. – diegus
Non puoi semplicemente usare la convolvola invece e cercare tutti gli zero-crossing con un primo kernel derivativo adatto? – deinonychusaur