Vă mulțumim pentru susținere

Detectarea vârfului semnalului măsurat

Folosim o placă de achiziție a datelor pentru a citi citirile dintr-un dispozitiv care crește semnalul la un vârf și apoi cade înapoi în apropierea valorii inițiale. Pentru a găsi valoarea maximă, căutăm în prezent matricea pentru citirea cea mai înaltă și folosim indexul pentru a determina momentul de vârf al valorii care este folosit în calculele noastre.

Aceasta funcționează bine dacă cea mai mare valoare este vârful pe care îl căutăm, dar dacă dispozitivul nu funcționează corect, putem vedea un al doilea vârf care poate fi mai mare decât vârful inițial. Luăm 10 citiri pe secundă din 16 dispozitive pe o perioadă de 90 de secunde.

Gândurile mele inițiale sunt să citez prin citirea citirilor pentru a vedea dacă punctele anterioare și următoare sunt mai mici decât curentul pentru a găsi un vârf și a construi o serie de vârfuri. Poate ar trebui să ne uităm la o medie a unui număr de puncte pe ambele părți ale poziției curente pentru a permite zgomotul în sistem. Aceasta este cea mai bună cale de a continua sau există tehnici mai bune?


Folosim LabVIEW și am verificat forumurile LAVA și există un număr de exemple interesante. Aceasta face parte din software-ul nostru de testare și încercăm să evităm folosirea prea multor biblioteci non-standard VI, așa că speram să primesc un feedback despre procesul / algoritmii implicați, mai degrabă decât despre codul specific.

0
adăugat editat

9 răspunsuri

Puteți încerca o medie de semnal, adică pentru fiecare punct, valoarea medie cu cele 3 sau mai multe puncte din jur. Dacă zgomotele sunt uriașe, chiar și acest lucru nu poate ajuta.

Îmi dau seama că aceasta a fost limba agnostică, dar presupunând că folosiți LabView, există o mulțime de procesoare de semnal pre-ambalate care vin cu LabView pe care le puteți utiliza pentru a face netezirea și reducerea zgomotului. forumurile NI sunt un loc minunat pentru a obține ajutor mai specializat în acest gen de lucruri.

0
adăugat

Puteti aplica cateva Standard Devision in logica dvs. si luati nota de varfuri peste x%.

0
adăugat

Cred că doriți să corelați semnalul dvs. cu un semnal așteptat, exemplar. Dar a trecut atât de mult de când am studiat procesarea semnalelor și chiar și atunci nu am făcut prea multă atenție.

0
adăugat

Aș dori să contribui la acest thread un algoritm pe care l-am dezvoltat :

Se bazează pe principiul

dispersie : dacă o nouă datapoint este un număr x dat de standard abaterile de la unele medii în mișcare, semnalele de algoritm (numite și scor z ). Algoritmul este foarte robust deoarece construiește o medie și o deviație separate , astfel încât semnalele să nu corupe pragul. Semnalele viitoare sunt, prin urmare, identificate cu aproximativ aceeași precizie, indiferent de cantitatea de semnale anterioare. Algoritmul are 3 intrări: lag = decalajul ferestrei în mișcare , threshold = scorul z la care semnalele algoritmului și influențează = 0 și 1) de semnale noi privind deviația medie și standard . De exemplu, un lag din 5 va utiliza ultimele 5 observații pentru a netezi datele. Un prag de 3,5 va semnala dacă o datapoint este de 3,5 abateri standard față de media în mișcare. Și un influence de 0.5 dă semnale jumătate influenței pe care o au datele de date normale. De asemenea, un influence de 0 ignoră semnalele complet pentru recalcularea noului prag: o influență de 0 este, prin urmare, cea mai robustă opțiune.

Funcționează după cum urmează:

pseudocod

# Let y be a vector of timeseries data of at least length lag+2
# Let mean() be a function that calculates the mean
# Let std() be a function that calculates the standard deviaton
# Let absolute() be the absolute value function

# Settings (the ones below are examples: choose what is best for your data)
set lag to 5;          # lag 5 for the smoothing functions
set threshold to 3.5;  # 3.5 standard deviations for signal
set influence to 0.5;  # between 0 and 1, where 1 is normal influence, 0.5 is half

# Initialise variables
set signals to vector 0,...,0 of length of y;   # Initialise signal results
set filteredY to y(1,...,lag)                   # Initialise filtered series
set avgFilter to null;                          # Initialise average filter
set stdFilter to null;                          # Initialise std. filter
set avgFilter(lag) to mean(y(1,...,lag));       # Initialise first value
set stdFilter(lag) to std(y(1,...,lag));        # Initialise first value

for i=lag+1,...,t do
  if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then
    if y(i) > avgFilter(i-1)
      set signals(i) to +1;                     # Positive signal
    else
      set signals(i) to -1;                     # Negative signal
    end
    # Adjust the filters
    set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  else
    set signals(i) to 0;                        # No signal
    # Adjust the filters
    set filteredY(i) to y(i);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  end
end

Demo

Demonstrarea robust algoritm de praguri

> Original answer

0
adăugat
@BrandonBrown care nu ar trebui să fie prea dificilă? Doar modificați algoritmul original, astfel încât de fiecare dată când există un semnal, salvați detaliile pe care le doriți. De exemplu. implementați o variabilă care "emblemă" atunci când începe un vârf, urmăriți valorile de care aveți nevoie și salvați-le când vârful se oprește.
adăugat autor Jean-Paul
Dacă nu vreau doar să detectez vârfurile, ci și să izolez undele individuale care formează vârful, cum pot să fac acest lucru cu acest algoritm? Nu vreau doar valori de vârf, dar vreau să cunosc lățimea / durata și timpul de creștere / înclinarea vârfurilor detectate
adăugat autor Brandon Brown

Această problemă a fost studiată în detaliu.

Există un set de implementări extrem de actualizate în clasele TSpectrum * de ROOT (un instrument de analiză fizică nucleară / particule). Codul funcționează în date unu-tridimensionale.

Codul sursă ROOT este disponibil, astfel încât să puteți lua această implementare dacă doriți.

Din documentația din clasa TSpectrum :

Algoritmii utilizați în această clasă au fost publicați în următoarele referințe:

[1] M. Morhac et al .: Context   metode de eliminare pentru   multidimensional coincidență gamma-ray   spectre. Instrumente nucleare și   Metode în cercetarea fizică A 401   (1997) 113-   132.

     

[2] M. Morhac și colab .: Aur eficient și bidimensional   deconvoluția și aplicarea acesteia la   gama de spectre de descompunere.   Instrumente și metode nucleare în România   Physics Research 401 (1997) 385-408.

     

[3] M.Morhac și colab .: Identificarea vârfurilor în   multidimensional coincidență gamma-ray   spectre. Instrumente nucleare și   Metode în fizica cercetării   443 (2000), 108-125.

Lucrările sunt legate de documentația clasei pentru cei dintre voi care nu au un abonament online NIM.


Versiunea scurtă a ceea ce se face este că histograma se aplatizează pentru a elimina zgomotul, iar maximele locale sunt detectate de forța bruta în histograma aplatizată.

0
adăugat

Această metodă este în esență din cartea lui David Marr "Vision"

Gaussian blur semnalul cu lățimea așteptată a vârfurilor. acest lucru scapa de zgomote și datele dvs. de faza este intact.

Apoi marginea detecta (LOG va face)

Apoi marginile dvs. au fost marginile caracteristicilor (cum ar fi vârfurile). arătați între marginile vârfurilor, sortați vârfurile după dimensiune și ați terminat.

Am folosit variații în acest sens și funcționează foarte bine.

0
adăugat

Există o mulțime și o mulțime de metode clasice de detectare a vârfurilor, oricare ar putea funcționa. Va trebui să vedeți ce, în special, limitează calitatea datelor dvs. Iată descrierile de bază:

  1. Between any two points in your data, (x(0), y(0)) and (x(n), y(n)), add up y(i + 1) - y(i) for 0 <= i < n and call this T ("travel") and set R ("rise") to y(n) - y(0) + k for suitably small k. T/R > 1 indicates a peak. This works OK if large travel due to noise is unlikely or if noise distributes symmetrically around a base curve shape. For your application, accept the earliest peak with a score above a given threshold, or analyze the curve of travel per rise values for more interesting properties.

  2. Use matched filters to score similarity to a standard peak shape (essentially, use a normalized dot-product against some shape to get a cosine-metric of similarity)

  3. Deconvolve against a standard peak shape and check for high values (though I often find 2 to be less sensitive to noise for simple instrumentation output).

  4. Smooth the data and check for triplets of equally spaced points where, if x0 < x1 < x2, y1 > 0.5 * (y0 + y2), or check Euclidean distances like this: D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2)), which relies on the triangle inequality. Using simple ratios will again provide you a scoring mechanism.

  5. Fit a very simple 2-gaussian mixture model to your data (for example, Numerical Recipes has a nice ready-made chunk of code). Take the earlier peak. This will deal correctly with overlapping peaks.

  6. Find the best match in the data to a simple Gaussian, Cauchy, Poisson, or what-have-you curve. Evaluate this curve over a broad range and subtract it from a copy of the data after noting it's peak location. Repeat. Take the earliest peak whose model parameters (standard deviation probably, but some applications might care about kurtosis or other features) meet some criterion. Watch out for artifacts left behind when peaks are subtracted from the data. Best match might be determined by the kind of match scoring suggested in #2 above.

Am facut ceea ce faci inainte: gasirea varfurilor in datele din secventa ADN, gasirea varfurilor derivatelor estimate de curbe masurate si gasirea varfurilor in histograme.

Vă încurajez să participați cu atenție la linia de bază corectă. Filtrarea Wiener sau altă filtrare sau analiza simplă a histogramei este adesea o modalitate ușoară de a face față liniei de bază în prezența zgomotului.

În cele din urmă, dacă datele dvs. sunt în mod obișnuit zgomotoase și dacă obțineți date de pe card ca ieșire fără referință la un singur capăt (sau chiar referită, doar nu diferențial) și dacă mediizi multe observații în fiecare punct de date, încercați să le sortați observații și aruncarea primei și ultimei quartile și medie a ceea ce rămâne. Există o serie de astfel de tactici de eliminare care pot fi foarte utile.

0
adăugat
Acest răspuns are mai multe informații despre limbajul agnostic - în special, știu codul de rețete numerice care se potrivește unei lucrări Gaussian, așa cum îl folosim aici la locul de muncă pe ieșirea FFT.
adăugat autor Brendan
În ceea ce privește "+ k pentru k adecvat mici", k este o valoare constantă pentru toate calculele? Cum o alegi? Ce înseamnă în mod adecvat mic?
adăugat autor Loren
Wow, mulțumesc pentru toate aceste informații. Am fost o serie de astfel de tactici (prost) pentru a usca si rezolva problema mea de detectare de vârf, dar am de gând să ia o privire mai bună la punctul 1. Vă mulțumim pentru acest volum mare de date. Ioan.
adăugat autor John Ballinger
Este doar pentru a preveni depășirea: atunci când împărțiți T cu R, în cazul în care curba este plat sau aproape plat sau prima și ultima valori y sunt egale sau aproape egale, atunci R va fi la sau aproape de zero. În mod corespunzător, micul ar fi suficient de mic pentru a evita aruncarea raportului foarte mult când R nu este aproape de zero. Aceasta este o problemă practică, empirică. Este doar menit să împiedice o diviziune zero, pe care ați putea alege să o faceți în altă manieră.
adăugat autor Thomas Kammeyer

Nu știu foarte multe despre instrumentație, deci ar fi absolut imposibil de făcut, dar din nou ar putea fi o direcție utilă diferită. Dacă știți cum pot fi eșuate citirile și există un anumit interval între vârfuri, având astfel de eșecuri, de ce nu faceți coborâre la fiecare interval. Dacă coborârea vă aduce într-o zonă pe care ați căutat-o ​​înainte, o puteți abandona. În funcție de forma suprafeței eșantionate, aceasta vă poate ajuta să găsiți vârfuri mai rapid decât căutarea.

0
adăugat

Există o diferență calitativă între vârful dorit și vârful secundar nedorit? Dacă ambele vârfuri sunt "clare" - adică scurte în timp - când privim semnalul în domeniul frecvenței (făcând FFT) veți obține energie la majoritatea benzilor. Dar dacă vârful "bun" are în mod fiabil energie la frecvențe care nu există în vârful "rău" sau invers, este posibil să le diferențiați în mod automat în acest fel.

0
adăugat