Vra

Ons gebruik 'n data-verkrygingskaart om lesings van 'n toestel te neem wat sy sein tot 'n piek verhoog en dan terugval tot naby die oorspronklike waarde.Om die piekwaarde te vind soek ons ​​tans die skikking vir die hoogste lesing en gebruik die indeks om die tydsberekening van die piekwaarde te bepaal wat in ons berekeninge gebruik word.

Dit werk goed as die hoogste waarde die piek is waarna ons soek, maar as die toestel nie reg werk nie, kan ons 'n tweede piek sien wat hoër as die aanvanklike piek kan wees.Ons neem 10 lesings per sekonde vanaf 16 toestelle oor 'n tydperk van 90 sekondes.

My aanvanklike gedagtes is om deur die lesings te blaai om te kyk of die vorige en volgende punte minder as die stroom is om 'n piek te vind en 'n reeks pieke te konstrueer.Miskien moet ons kyk na 'n gemiddelde van 'n aantal punte weerskante van die huidige posisie om vir geraas in die stelsel voorsiening te maak.Is dit die beste manier om voort te gaan of is daar beter tegnieke?


Ons gebruik wel LabVIEW en ek het die LAVA forums en daar is 'n aantal interessante voorbeelde.Dit is deel van ons toetssagteware en ons probeer vermy om te veel nie-standaard VI-biblioteke te gebruik, so ek het gehoop vir terugvoer oor die betrokke proses/algoritmes eerder as spesifieke kode.

Was dit nuttig?

Oplossing

Jy kan seingemiddeld probeer, d.w.s.vir elke punt, gemiddeld die waarde met die omliggende 3 of meer punte.As die geraas blits groot is, sal selfs dit dalk nie help nie.

Ek besef dat dit taalagnosties was, maar om te raai dat jy LabView gebruik, is daar baie voorafverpakte seinverwerking VI's wat saam met LabView kom wat jy kan gebruik om gladmaak en geraasvermindering te doen.Die NI forums is 'n wonderlike plek om meer gespesialiseerde hulp oor hierdie soort ding te kry.

Ander wenke

Daar is baie en baie klassieke piekopsporingsmetodes, waarvan enigeen kan werk.Jy sal moet sien wat veral die kwaliteit van jou data beperk.Hier is basiese beskrywings:

  1. Tussen enige twee punte in jou data, (x(0), y(0)) en (x(n), y(n)), tel op y(i + 1) - y(i) vir 0 <= i < n en noem dit T ("reis") en stel R ("styg") tot y(n) - y(0) + k vir gepas klein k. T/R > 1 dui op 'n hoogtepunt.Dit werk OK as groot reis as gevolg van geraas onwaarskynlik is of as geraas simmetries versprei rondom 'n basiskrommevorm.Vir jou aansoek, aanvaar die vroegste piek met 'n telling bo 'n gegewe drempel, of ontleed die kurwe van reis per stygingswaardes vir meer interessante eiendomme.

  2. Gebruik ooreenstemmende filters om ooreenkomste met 'n standaard piekvorm te kry (gebruik in wese 'n genormaliseerde puntproduk teen een of ander vorm om 'n cosinus-metriek van ooreenkoms te kry)

  3. Ontwikkel teen 'n standaard piekvorm en kyk vir hoë waardes (alhoewel ek dikwels vind dat 2 minder sensitief is vir geraas vir eenvoudige instrumentasie-uitset).

  4. Maak die data glad en kyk vir drieling van gelyke gespasieerde punte waar, indien x0 < x1 < x2, y1 > 0.5 * (y0 + y2), of kontroleer Euklidiese afstande soos volg: D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2)), wat staatmaak op die driehoek ongelykheid.Die gebruik van eenvoudige verhoudings sal weer vir jou 'n puntemeganisme verskaf.

  5. Pas 'n baie eenvoudige 2-gaussiese mengsel model by jou data (byvoorbeeld, Numeriese Resepte het 'n lekker klaargemaakte stukkie kode).Neem die vroeëre hoogtepunt.Dit sal oorvleuelende pieke korrek hanteer.

  6. Vind die beste passing in die data met 'n eenvoudige Gaussiese, Cauchy-, Poisson- of wat-het-jy-kromme.Evalueer hierdie kurwe oor 'n wye reeks en trek dit af van 'n kopie van die data nadat jy die piekligging daarvan opgemerk het.Herhaal.Neem die vroegste piek waarvan die modelparameters (standaardafwyking waarskynlik, maar sommige toepassings kan omgee vir kurtosis of ander kenmerke) aan een of ander kriterium voldoen.Wees op die uitkyk vir artefakte wat agterbly wanneer pieke van die data afgetrek word.Beste wedstryd kan bepaal word deur die soort wedstrydtelling wat in #2 hierbo voorgestel word.

Ek het al voorheen gedoen wat jy doen:vind pieke in DNS-volgordedata, vind pieke in afgeleides geskat vanaf gemete krommes, en vind pieke in histogramme.

Ek moedig jou aan om noukeurig aandag te gee aan behoorlike basislyn.Wiener-filtrering of ander filtering of eenvoudige histogram-analise is dikwels 'n maklike manier om te begin in die teenwoordigheid van geraas.

Ten slotte, as jou data tipies raserig is en jy data van die kaart af kry as ongeverwysde enkel-einde afvoer (of selfs verwys, net nie differensieel nie), en as jy gemiddeld baie waarnemings in elke datapunt gebruik, probeer om dit te sorteer waarnemings en die weggooi van die eerste en laaste kwartiel en die gemiddelde van wat oorbly.Daar is 'n magdom sulke uitskieter-uitskakelingstaktieke wat regtig nuttig kan wees.

Hierdie probleem is in 'n mate bestudeer.

Daar is 'n stel baie bygewerkte implementerings in die TSpectrum* klasse van WORTEL ('n kern-/deeltjiefisika-analise-instrument).Die kode werk in een- tot driedimensionele data.

Die ROOT-bronkode is beskikbaar, so jy kan hierdie implementering gryp as jy wil.

Van die TSpektrum klas dokumentasie:

Die algoritmes wat in hierdie klas gebruik word, is in die volgende verwysings gepubliseer:

[1] M.Morhac et al.:AGTERGROND-ALMIMINASIE-metodes vir multidimensionele toeval gamma-straalspektra.Kerninstrumente en metodes in fisika-navorsing A 401 (1997) 113- 132.

[2] M.Morhac et al.:Doeltreffende een- en tweedimensionele goue ontbinding en die toepassing daarvan op gamma-straalspektra-ontbinding.Kerninstrumente en metodes in fisika-ondersoek A 401 (1997) 385-408.

[3] M.Morhac et al.:Identifisering van pieke in multidimensionele toeval gamma-straalspektra.Kerninstrumente en metodes in navorsingsfisika A 443 (2000), 108-125.

Die vraestelle word vanaf die klasdokumentasie geskakel vir diegene van julle wat nie 'n NIM aanlyn-intekening het nie.


Die kort weergawe van wat gedoen word, is dat die histogram afgeplat het om geraas uit te skakel, en dan word plaaslike maksima deur brute krag in die afgeplatte histogram opgespoor.

Ek wil graag bydra tot hierdie draad 'n algoritme wat Ek het myself ontwikkel:

Dit is gebaseer op die beginsel van verspreiding:as 'n nuwe datapunt 'n gegewe x aantal standaardafwykings weg van een of ander bewegende gemiddelde is, sal die algoritme seine (ook genoem z-telling).Die algoritme is baie robuust omdat dit 'n skei bewegende gemiddelde en afwyking, sodat seine nie die drumpel korrupteer nie.Toekomstige seine word dus met ongeveer dieselfde akkuraatheid geïdentifiseer, ongeag die hoeveelheid vorige seine.Die algoritme neem 3 insette: lag = the lag of the moving window, threshold = the z-score at which the algorithm signals en influence = the influence (between 0 and 1) of new signals on the mean and standard deviation.Byvoorbeeld, a lag van 5 sal die laaste 5 waarnemings gebruik om die data glad te maak.A threshold van 3.5 sal aandui as 'n datapunt 3.5 standaardafwykings weg van die bewegende gemiddelde is.En 'n influence van 0,5 gee seine helfte van die invloed wat normale datapunte het.Net so, 'n influence van 0 ignoreer seine heeltemal vir die herberekening van die nuwe drempel:'n invloed van 0 is dus die mees robuuste opsie.

Dit werk soos volg:

Pseudokode

# 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

Demonstration of robust thresholding algorithm

> Oorspronklike antwoord

Hierdie metode is basies uit David Marr se boek "Vision"

Gaussiese vervaag jou sein met die verwagte breedte van jou pieke.dit raak ontslae van geraaspyle en jou fasedata is onbeskadig.

Dan randopsporing (LOG sal doen)

Dan was jou rande die rande van kenmerke (soos pieke).kyk tussen rande vir pieke, sorteer pieke volgens grootte, en jy is klaar.

Ek het variasies hierop gebruik en dit werk baie goed.

Ek dink jy wil kruiskorreleer jou sein met 'n verwagte, voorbeeldige sein.Maar, dit is so lank sedert ek seinverwerking bestudeer het en selfs toe het ek nie veel kennis geneem nie.

Ek weet nie baie van instrumentasie nie, so dit kan heeltemal onprakties wees, maar dan weer kan dit 'n nuttige ander rigting wees.As jy weet hoe die lesings kan misluk, en daar is 'n sekere interval tussen pieke gegewe sulke mislukkings, hoekom doen jy nie gradiëntdaling by elke interval nie.As die afdraande jou terugbring na 'n gebied wat jy voorheen gesoek het, kan jy dit laat vaar.Afhangende van die vorm van die gemonsterde oppervlak, kan dit jou ook help om pieke vinniger te vind as om te soek.

Is daar 'n kwalitatiewe verskil tussen die gewenste piek en die ongewenste tweede piek?As beide pieke "skerp" is -- m.a.w.kort in tydsduur -- as jy na die sein in die frekwensiedomein kyk (deur FFT te doen), sal jy by die meeste bande energie kry.Maar as die "goeie" piek betroubaar energie aanwesig het by frekwensies wat nie in die "slegte" piek bestaan ​​nie, of omgekeerd, kan jy hulle outomaties op hierdie manier onderskei.

Jy kan sommige toepas Standaard afwyking na jou logika en let op pieke oor x%.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top