Detectie protocol

Wiskunde is niet alleen een vak op school. Kom je ergens in de praktijk (bijvoorbeeld tijdens je werk) een wiskundig probleem tegen dan kun je hier om hulp vragen.
Plaats reactie
RensR
Nieuw lid
Nieuw lid
Berichten: 4
Lid geworden op: 28 apr 2014, 10:49

Detectie protocol

Bericht door RensR » 28 apr 2014, 11:09

Ik heb momenteel een probleem als ik op basis van deze waardes de volgende dallen in de grafiek probeer te vinden.
Afbeelding

Het zit zo: We gebruiken op werk verschillende apparaten met sensoren. Deze sensoren presteren niet heel erg constant. Het zou zomaar kunnen dat apparaat B ruim hogere/lagere meetwaardes heeft (denk aan +/- 100). Momenteel zoeken we naar een daling van minimaal 150 t.o.v. de twintig voorgaande metingen. Vervolgens wordt er 90 metingen niet gemeten(in deze grafiek wel) waarna er weer gezocht wordt naar een daling van 150.

Deze manier is niet erg betrouwbaar. Wat ik me afvroeg of dit probleem misschien te benaderen is vanuit een wiskundig oogpunt, helaas heb ik hier te weinig kaas van gegeten.

arie
Moderator
Moderator
Berichten: 3916
Lid geworden op: 09 mei 2008, 09:19

Re: Detectie protocol

Bericht door arie » 28 apr 2014, 20:36

Een methode die je zou kunnen overwegen is via Fourier transformaties.
Je kan dan de ruis (= hoog frequent componenten in de getransformeerde) wegfilteren, waarna een vloeiend signaal (in het tijddomein) overblijft.
In dit vloeiende signaal zijn de (negatieve) pieken die je zoekt eenvoudig te detecteren (zie code hieronder).

Voorbeeld:

Afbeelding

- zwart gestippeld = originele signaal (= jouw gegevens)
- rood = gefilterd signaal
- blauw = signaalgemiddelde
- groen = gedetecteerde pieken

Matlab code:

Code: Selecteer alles

%% v = [800, 805, ....];  = vector met alle meetwaarden, hier nog toe te voegen

sizev=size(v)(2);        % sizev = aantal waarden in v

vf=fft(v);               % vf = fourier getransformeerde van v
wf=vf;                   % filter hoge frequenties weg
wf(50:sizev-48)=0;
w=abs(ifft(wf));         % w = gefilterd signaal

x=1:sizev;               % waarden voor de x-as

m=zeros(1,sizev);        % bereken gemiddelde signaal
m(1,:)=mean(w);

p=zeros(1,sizev);        % detecteer de pieken
p(1,:)=550;
for(i=2:(sizev-1))
  if(w(i-1) > w(i) && w(i+1)>w(i) && w(i)<750)
    p(1,i)=600;          % deze w(i) is een piek
  end;
end;

figure();                % teken plaatje
plot(x,v,'k:',w,'r',m,'b',p,'c');
In dit geval liggen de pieken bij [40, 64, 146, 175, 253, 281, 359, 389, 466, 497, 576, 609, 686].
Het lijkt erop dat ze twee-aan-twee optreden, de tweede van elk tweetal kan je zo nodig nog onderdrukken.

RensR
Nieuw lid
Nieuw lid
Berichten: 4
Lid geworden op: 28 apr 2014, 10:49

Re: Detectie protocol

Bericht door RensR » 29 apr 2014, 11:54

Beste Arie,

Heel erg bedankt voor je reactie. Wat ik misschien had moeten vermelden is dat de dallen niet achteraf gevonden kunnen worden. Op basis van de gemeten waarde bepaald het apparaat namelijk of hij verder moet gaan of stoppen.

Wat wel gedaan kan worden is tot de huidige gemeten waarde terugkijken, dat is geen enkel probleem. Maar ik ben bang dat de resultaten van een fourier transformatie niet altijd het gewenste resultaat geeft.

Ik ben niet in het bezit van Matlab. Zou je misschien voor mij twee figuren kunnen maken met de volgende twee vectoren?

Code: Selecteer alles

800,805,810,814,817,821,823,824,828,830,832,833,835,835,838,837,839,841,841,840,824,762,764,775,793,835,819,815,807,794,783,776,777,766,739,705,679,629,605,597,603,625,656,715,829,846,820,830,826,832,832,813,804,798,788,770,759,725,699,671,673,697,698,676,656,648,651,662,691,747,724,725,761,824,891,882,868,865,888,917,942,953

Code: Selecteer alles

800,805,810,814,817,821,823,824,828,830,832,833,835,835,838,837,839,841,841,840,824,762,764,775,793,835,819,815,807,794,783,776,777,766,739,705,679,629,605,597

arie
Moderator
Moderator
Berichten: 3916
Lid geworden op: 09 mei 2008, 09:19

Re: Detectie protocol

Bericht door arie » 29 apr 2014, 21:24

Dan wil je dus voorspellen wanneer een dal begint (= zal gaan optreden)?
Dat is een ander probleem.
Je zou dan het (drijvend) gemiddelde van de normale meetwaarden en de spreiding daarin moeten bijhouden.
Aan de hand daarvan kan je dan kijken of een nieuw gemeten waarde nog binnen de normale bandbreedte zit (of daaronder).

Hier nog wel een plaatje met de filtering van je laatste 2 vectoren, maar waarschijnlijk heb je dat nu niet meer nodig.
Let wel: de piekdetectie is mede afhankelijk van hoe sterk je het signaal filtert. Hoe meer hoge frequenties je wegfiltert, hoe minder nuancering in het gefilterd signaal, dus hoe minder pieken. Bijvoorbeeld: naarmate je in het eerste plaatje hieronder minder krachtig filtert, wordt het tweede dal eerst gesplitst in 2, na nog minder krachtig filteren in 3 (negatieve) pieken.

Afbeelding

RensR
Nieuw lid
Nieuw lid
Berichten: 4
Lid geworden op: 28 apr 2014, 10:49

Re: Detectie protocol

Bericht door RensR » 30 apr 2014, 12:51

Wederom bedankt voor je reactie.

Welk soort gemiddelde is het drijvend gemiddelde? Als ik google dan vind ik niets.
Gemiddelden: Rekenkundig gemiddelde · Meetkundig gemiddelde · Harmonisch gemiddelde · Kwadratisch gemiddelde · Gewogen gemiddelde · Getrimd gemiddelde · Winsorgemiddelde
Bedoel je dat ik van de afgelopen waardes een gemiddelde moet uitrekenen en dan kijken of de gemeten waarde daar onder valt?

arie
Moderator
Moderator
Berichten: 3916
Lid geworden op: 09 mei 2008, 09:19

Re: Detectie protocol

Bericht door arie » 01 mei 2014, 14:04

Klopt, ik bedoelde
- een gemiddelde, indien je normale waarden niet veranderen rond een vast gemiddelde
- een moving average = running average = drijvend gemiddelde = voortschrijdend gemiddelde, indien je normale waarden wel veranderen gedurende de tijd.

Als je het (huidige) gemiddelde en de standaard afwijking weet, kan je op basis van die gegevens een grens bepalen van wat normaal is en wat (een voorbode van) een dip is.

Maar er zijn veel meer mogelijkheden:
- je kan ook de snelheid van verandering mee laten wegen, dat wil zeggen: je neemt je beslissing niet alleen op grond van de huidige waarde, maar kijkt ook naar het verschil met de vorige waarde: als dat verschil (= snelheid van het signaal) sterk negatief is, is de kans groter dat er een dip op komst is dan wanneer dat verschil klein is.
- op dezelfde manier kan je nog meer punten uit het verleden daarbij betrekken (bv snelheid van verandering van snelheid)
- je kan ook kijken wat een zeer kort moving average (bv 4 waarden) doet. Let dan wel op dat er een vertraging is met het werkelijke signaal: dit moving average zal trager reageren op een dip, het werkelijke signaal kan in die tijd al veel verder weggezakt zijn in die dip.

Deels zal je keuze van het beste model ook afhangen van de eigenschappen van je systeem: hoe groot is de ruis (= de random schommelingen van het signaal), hoe groot zijn de dips die je wil detecteren, hoe vaak treden die dips op, wat kost het meest: een vals positieve of vals negatieve voorspelling, etc.
Doorgaans zal je wat moeten experimenteren met de verschillende modellen (en hun parameters, zoals drempelwaarden) en aan de hand daarvan je uiteindelijke keuze maken.

RensR
Nieuw lid
Nieuw lid
Berichten: 4
Lid geworden op: 28 apr 2014, 10:49

Re: Detectie protocol

Bericht door RensR » 01 mei 2014, 15:08

Ik ben iedere keer weer verbaasd hoe bereidwillig je bent om vreemde mensen te helpen. Enorm bedankt voor de uitleg. Ik ben vandaag wat aan het testen geweest met verschillende modellen zoals je adviseerde. Het is inderdaad lastig om de juiste samenstelling te vinden. Momenteel ben ik erg tevreden over het volgende:

De sensor meet normale waardes. Van deze waardes wordt over de laatste waardes (max 20) een gemiddelde berekend. De nieuwste waarde moet een "dip-grootte" onder het laatst berekende gemiddelde vallen en een "dip-grootte" onder 800. Zodra er ook maar een stijging gemeten wordt in de gemeten waarde stopt het apparaat. Vervolgens wordt het gemiddelde weer gereset en wordt er een x tijd niet gekeken. Daarna begint het proces weer opnieuw.

Waar ik nog niet helemaal blij mee ben is dat het apparaat de licht is ingesteld. Er zou bijvoorbeeld gestopt kunnen worden op dal 4 en 11 te vroeg stopt. Gelukkig heeft het gemiddelde dit voorkomen.

Jammer genoeg kan het apparaat niet al te veel rekenopdrachten aan voordat dit serieus merkbaar wordt in de praktijk. Ik probeer het daarom simpel te houden. Het is wellicht niet helemaal ideaal maar het is niet anders.

Afbeelding
http://i.imgur.com/njIIjSk.png
Blauw = Normale waardes
Rood = Running? average
Paars = Gevonden dallen


Je hebt me enorm geholpen.

Plaats reactie