2015-03-19 5 views
9

Attualmente sto lavorando con alcuni dati Raman Spectra e sto cercando di correggere i miei dati causati dall'inflessione della florescence. Date un'occhiata al grafico qui sotto:Libreria di correzione della linea di base Python

enter image description here

Sono abbastanza vicino a raggiungere quello che voglio. Come puoi vedere, sto cercando di inserire un polinomio in tutti i miei dati, mentre in realtà dovrei adattarmi a un polinomio alle minimas locali.

Idealmente vorrei avere un raccordo polinomiale che, se sottratto dai miei dati originali si tradurrebbe in qualcosa di simile:

enter image description here

c'è qualche costruito in librerie sono che lo fa già?

In caso negativo, qualsiasi algoritmo semplice si può consigliare per me?

+0

Si potrebbe provare a progettare un filtro di percorso alto trasformando il segnale con '' rfft() '' e impostando la parte di frequenza bassa su zero. – Dietrich

+0

Dovresti esaminare le tecniche di ricerca minime in questa domanda: http://stackoverflow.com/questions/24656367/find-peaks-location-in-a-spectrum-numpy. Una volta che li hai, puoi adattarli solo ai minimi per trovare la correzione della tua linea di base. –

risposta

11

Ho trovato una risposta alla mia domanda, condividendo solo per tutti coloro che incappano in questo.

C'è un algoritmo chiamato "Levigatura asimmetrica dei minimi quadrati" di P. Eilers e H. Boelens nel 2005. La carta è gratuita e puoi trovarla su google.

def baseline_als(y, lam, p, niter=10): 
    L = len(y) 
    D = sparse.csc_matrix(np.diff(np.eye(L), 2)) 
    w = np.ones(L) 
    for i in xrange(niter): 
    W = sparse.spdiags(w, 0, L, L) 
    Z = W + lam * D.dot(D.transpose()) 
    z = spsolve(Z, w*y) 
    w = p * (y > z) + (1-p) * (y < z) 
    return z 
0

So che questa è una vecchia questione, ma io stumpled su di essa un paio di mesi fa e implementato la risposta equivalente utilizzando le routine spicy.sparse.

# Baseline removal                        

def baseline_als(y, lam, p, niter=10):                   

    s = len(y)                        
    # assemble difference matrix                    
    D0 = sparse.eye(s)                      
    d1 = [numpy.ones(s-1) * -2]                    
    D1 = sparse.diags(d1, [-1])                    
    d2 = [ numpy.ones(s-2) * 1]                    
    D2 = sparse.diags(d2, [-2])                    

    D = D0 + D2 + D1                       
    w = np.ones(s)                       
    for i in range(niter):                     
     W = sparse.diags([w], [0])                   
     Z = W + lam*D.dot(D.transpose())                 
     z = spsolve(Z, w*y)                     
     w = p * (y > z) + (1-p) * (y < z)                  

    return z 

Cheers,

Pedro.