Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » ganz wilde Datenerkennung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.03.2006, 20:14 Uhr
~herzschlagermittler
Gast


Hi Leutz,

Denker gesucht - ich bekomm's nicht hin!

Ich arbeite zwar gerade in C++ dran, geht aber eher um einen Algorithmus..

folgendes Problem:

ich habe einen unsigned long "Datenstrom" (bekomme alle 3/100 sekunden einen Wert von meinem Gerät).
Dieser Datenstrom stellt den gemessenen Herzschlag dar.
Die Werte pendeln ca. zwischen 930 und 970 (wenn gar nichts angeschlossen ist) und fluktuieren ein bisschen mehr, wenn das Gerät an die Hand angeschlossen ist (also halt neben dem Herzschlag auch). Ein Herzschlag stellt dann eine Erhöhung der Werte dar, und die will ich erkennen. Mein Ziel: Den Herzschlag "boolsch" erkennen.

zb so sehen die Werte aus: 940, 960, 930, 970, 940, 990, 1100, 1180, 1080, 970, 980, 960

Eigentlich leicht, man sieht, dass der Herzschlag um die 1180 ist.
Die Werte sind Erfährungsgemäß 5-6 Werte lang erhöht, 3 Werte stark erhöht.

Mein Ansatz (nach ein bisschen rumprobieren) war:
- Puffer mit 3 Werten
- Puffersumme > 2950
- Puffermaximum > 1050
- Pufferminimum > 975
(hab auch noch methoden für Unterschied der Werte, Summe der Unterschiede und Mittelwerte für den Puffer geschrieben und damit auch einen Puffer von 5-10 Länge ausprobiert (weil ja zb im 10er Puffer die ganze Kurve drinnen ist)

Problem: es geht um Menschen und nicht Computer, sprich aufgrund der biologischen Unterschiede funktioniert es mal, und mal nicht. Die "Kurve" der Werte ist je nach Mensch oder aktuellem Zustand mal flacher (hab sogar schon mal erlebt, dass die Kurve nicht über 1000 kommt, trotzdem aber eine kurve war) und mal steiler (Spitzen bis 2000).
Ist das Gerät angeschlossen, fluktuieren die Werte auch schon mal ohne Herzschlag über 1000, aber nicht in Form einer Kurve über 6 Werte.

Ich weiss, dass 100% zu erkennen mit dem Gerät nicht drinnen ist, aber auf jeden Fall mehr als ich jetzt hinbekomme.
Aus Performance-gründen und um die Bestimmung sicherer zu machen werte ich auch nach einem erkannten Herzschlag erst einmal die nächsten 0,3 Sekunden (entspricht 200 schläge pro minute) die folgenden Werte nicht aus. Die Zeit danach werden bei mir aber oft Herzschläge fälschlicherweise erkannt - erhöhe ich die Anforderungswerte oben wird oft nichts erkannt.

Deshalb die Frage an die schlauen Köpfe hier, wer da eine tolle Idee hat.

Gibt es einen Algorithmus um derartige "Kurven" (ach, ja: in denen kann auch mal ein Wert nicht stimmen, ideal sind die Kurven nicht: zb 1000 1200 1180 1250 1100 990) zu ermitteln?
Sprich - wie orientiere ich mich eher an der Form des Datenstromes/der Kurve als an den absoluten Werten? (am besten wohl eine Kombination).

Danke im Voraus,

Rainer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.03.2006, 01:55 Uhr
~herzschlagermittler
Gast


habe ne bessere lösung zur kurvenerkennung gefunden: (trotzdem unten noch fragen...)


C++:
bool Buffer::IsHeartBeat()
{
    int goup = 0;
    int godown = 0;

    for (int i = 0; i < 3; i++)
    {
        goup += content[i] - content[i + 1];
    }

    for (i = 3; i < 6; i++)
    {
        godown += content[i] - content[i + 1];
    }

    if (goup < -75 && godown > 75)
        return true;
    else
        return false;

}



der buffer besteht aus genau den 7 elementen und checkt, ob ein steigen _und_ fallen vorherrscht indem ich die unterschiede summiere.
ist besser als absolute werte abzufragen.
funktioniert wunderbar, da ein herzschlag immer (fast) genauso lang dauert.
einzige konstante ist die 75. diesen wert werde ich aber über einen schieberegler variabel machen (von 50 bis 200), dann kann man die sensibilität der messung einstellen.

noch ein paar fragen an euch, die es vielleicht noch genauer machen können:

- wenn ich die quadrate der unterschiede nehme, kann ich dadurch besser so eine kurve bestimmen? (wenn ja wie checke ich die richtug ab, da dann ja alle vorzeichen gleich sind?)
- das problem der kurvenbestimmung gibts doch sicher schon im thema analog-> digital. kennt sich da jemand aus?
- die ergebnisse sollten exakter sein, wenn ich den buffer größer mache (dann die mittleren felder abfrage) und eine interpolation vorher drüberjage.
wie interpoliere (es gibt ja verschiedene interpolationen - ich meine die, die solche kurven glättet, weiss leider den fachbegriff nicht) ich so ein array in c++?
lohnt so eine interpolation wenn man den rechenaufwand berücksichtigt? (zwar array nur 7-10 elemente groß, aber dafür aufruf bei jeder bufferverschiebung alle 3ms!!) hab da was in erinnerung von wegen matrizen invertieren usw...

mod edit: BENUTZE CPP TAGS SELBER

Dieser Post wurde am 26.03.2006 um 15:29 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.03.2006, 03:01 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


was ist denn dein genaues performance problem. Wo liegen denn was Grenzen? Das habe ich noch nicht so richtig verstanden...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.03.2006, 10:02 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


man könnte evtl das ganze zeuch durch ne fdct (fast-discret-cosinus-transformation) jagen dann dürften sich deine kurven "geraden", dann sollte die erkennung einfacher sein.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.03.2006, 23:34 Uhr
ao

(Operator)


Hallo, erklär doch mal genauer, was du verbessern willst. Ist die Fehlerrate noch zu hoch? Willst du den Zeitpunkt des Pulsschlags genauer haben? Oder was?

Glätten hat nur dann Sinn, wenn es was zu glätten gibt, d.h. wenn das Messsignal von Störungen überlagert ist. Du müsstest zuerst mal feststellen, ob das so ist, bevor du einfach nur das Nutzsignal einebnest.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.03.2006, 23:55 Uhr
ao

(Operator)


So, jetzt hab ich mal ein Diagramm von deiner kleinen Messreihe da gemacht, sieht ja eigentlich ganz klar aus.

Als erstes würde ich, nachdem ich so ein, zwei Sekunden Daten vorliegen habe, die Werte normieren, d.h. jeden Messwert so mit einem Faktor multiplizieren, dass ein Mittelwert von - sagen wir - 1000 rauskommt. Damit kannst du rausrechnen, dass du bei manchen Leuten stärkere Signale hast als bei anderen.

Vielleicht macht dich das unabhängiger von dieser magischen 75.

Darüberhinaus - wie du schon selber sagst - könnte es hilfreich sein, einen oder zwei variable Parameter zur Empfindlichkeitseinstellung zu haben.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: