Datenanalysefirma !



  • Hi zusammen,

    ich habe das Problem dass ich Dateien auslesen muss zu denen ich nur eine sehr unzureichende Schnittstellenbeschreibung habe.
    Diese Dateien sind proprietäre .ecg Files mit einer festen Länge von jeweils 6 KB.
    Da ich nun schon ewig dran rumprobiere ohne auch nur annährend der Lösung ein Stück näher zu kommen ist es wohl das Beste wenn ich mich mich an eine professionelle Datenanalysefirma wende.

    Vielleicht kennt Ihr da einige oder habt sogar Erfahrung mit professionellen Datenanalysefirmen ?
    Könnt Ihr mir da welche empfehlen, habt Ihr da vllt. ein paar Links ?

    ...ShadowEater
    😉



  • Wäre es nicht billiger den Hersteller zu fragen?



  • Ja, aber der kann nicht weiterhelfen da diese Schnittstellenbeschreibung das einzige ist was vom ehemaligen Mutterkonzern übrig geblieben ist und dieser Mutterkonzern nicht mehr existiert !

    Grußß
    ShadowEater



  • was sind das für daten? ecg hört sich irgendwie nach medizinischen messwerten an.
    🙂



  • Ja, das sind Daten die von einem EKG Gerät erstellt wurden.
    BTW, wenn ich Teile der Schnittstellenbeschreibung posten möchte (.tif) ist das hier möglich ?
    Nö, Images kann ich hier nicht posten, oder ?

    Gruß
    ShadowEater



  • es gibt doch im internet tausende dienste wo du bilder hochladen kannst z.B. http://www.imageshack.us/





  • Hi dnke für die Antworten,
    @Gästchen, ne leider nicht, ich poste jetzt mal einen Teil der Schnittstellenbeschreibung !

    Gruß
    ShadowEater



  • Hi,

    hier ist die Schnittstellenbeschreibung, ich hab ein rar hochgeladen welches die betreffenden .tif in gut leserlicher Qualität enthält.
    Ich hoffe Ihhr könnt damit was anfangen.
    Wenn Ihr möchtet lade ich auch eine Probedatei rauf, die ham nur 5 KB!

    http://www.filehosting.at/files/download.php?file=665f4ced4769a3421578a754a3d5b059

    Vielen Dank für eure Mühe vorab
    ShadowEater



  • Moin

    Die Datenstrucktur scheint doch vollständig beschrieben zu sein. Wo ist den das Problem?

    Die ersten 60 Byte sind header, danach kommen die ECG Waveform data. jeder Sampel hat 12 Bit die entsprechend gespeichert werden. wie man jetzt aus 3 Byte wieder 2 12Bit sampels extrahiert steht auch drin. Der ganze waveform block muss auf eine 4 Byte trenze erweitert werden ( wird dann mit FF aufgefüllt )

    Zumindest den Header solltest du auswerten können. Der datenstatz ist immer gleich lang, also sollte auch die länge der Waveform immer gleich bleiben. Das Datum ist auch drinn, ist soweit ich gesehen habe ein unix timestamp. sollte sich also auch finden und überprüfen lassen.

    gruss.



  • Hi Termite,

    Zumindest den Header solltest du auswerten können.

    ja den Header auslesen scheint auch zu funktionieren, ich kann aus den Beschreibung auch rauslesen, dass der Head immer 60 Byte lang ist.

    wie man jetzt aus 3 Byte wieder 2 12 Bit sampels extrahiert steht auch drin.

    dann versteh ichs nicht, kannst Du da näher drauf eingehen ?
    Ich komm an die Waveform Daten nicht ran. Da stehen nur Ascii Werte aber wie muß ich die interpretieren ???

    Gibt's ne Möglichkeit Dich per Mail zu erreichen, das wäre echt klasse ?

    hoffnungsvoll
    ShadowEater



  • Hier nochmal alle benötigten Files und Infos !

    Ich hab noch das kleine unfertige Prog. von mir angehängt.
    Ich probiere da jetzt schon tagelang dran rum aber ich steig durch die Schnittstellenbeschreibung einfach nicht ganz durch, wäre echt super wenn Ihr mir da weiterhelfen könntet !

    http://www.filehosting.at/files/download.php?file=8c4e15178fca9b45eaa118d3fd52a76b

    Gruß und vielen Dank vorab
    ShadowEater



  • Arbeitest du daran privat oder beruflich?



  • privat!

    Warum ???



  • Moin

    auf Seite 11 ist ein Teil der 12 Bit Darstellung beschrieben Punkt 4.2.2.2

    in der Datei 44dbe22f.ecg sind die ersten Data Byts

    12 34 56 78 9A BC [hex stelle]
    00 04 40 00 04 40 [daten]

    die 12 Byte ergeben sich dann wie folgt
    1. hexstellen 421 somit 400
    2. hexstellen 563 somit 400
    3. hexstellen A78 somit 400
    4. hexstellen BC9 somit 400

    Bedeutet somit das aus 3 Bytes 2 12bit sampls werden.

    uint8_t data[3] = { 0x00, 0x04, 0x40 };
    uint16_t sampl[2] { 0, 0};
    
    sampl[0]  = data[0];
    sampl[0] |= ( data[1] & 0x0F ) << 8;
    
    sampl[1]  = ( data[1] & 0xF0 ) >> 4;
    sampl[1] |= data[2] << 4;
    

    Fat 12 macht meines wissens auch so was ähnliches.

    gruss



  • Du hast einen Fehler in deiner Header einlese Routine gemacht.

    Die While-Schleife

    int iHeaderEnd = 0;
    
    ...
    
        while (iHeaderEnd < 68)
        {
            f.read((char*)arrHeader,iHeaderEnd);
            iHeaderEnd++;
        }
    

    macht so keinen Sinn.

    Du überschreibst jedes mal deinen arrHeader mit neuen Informationen.
    Wenn du dir die Funktionsbeschreibung von fstream::read durchliest, kommst
    du schnell auf die richtige Anwendung dieser Methode:

    istream& read ( char* s, streamsize n );
      Read block of data
      Reads a block of data of n characters and stores it in the array pointed by s.
    

    Wenn du nun die gesamte Schleife durch

    f.read((char*)arrHeader, 68);
    

    ersetzt, liest er den Header auch richtig ein.

    Zum überprüfen: offne eine ecg Datei mit einem Hexeditor und schau dir dort
    den Hinhalt an.

    Hier mal die Versionnummer:

    Vers. of Data format :  E C G 10
    

    Gruß mcr

    EDIT: Die Ausgabe habe ich wie folgt geändert:

    cout << "Vers. of Data format :	" << arrHead[0]    <<" " << arrHead[1] << " " << arrHead[2] << " " << (long)arrHead[3] << endl << endl;
    

    Wie kommst du auf die Idee, die ersten 68 bytes für den Header zu verwenden? Bisher wurde doch hier im Thread über 60 bytes gesprochen.



  • Hi mcr und Termite,
    vielen Dank für eure Hilfe, ich hab nur noch ein paar Fragen !

    @mcr
    Stimmt hab den Fehler behoben und die Schleife ersetzt und selbstverständlich nur bis 60 Bytes !

    unsigned char* cEcgReadIn::LoadEcg()
    {
    	fstream f;
    	int iHeaderEnd = 0;
    
    	f.open("44DBE2AD.ecg",ios::in | ios::binary);
    	if (!f) 
    	{
    		cout << "Fehler beim oeffnen der Datei...\n";
    	}
    
    	f.read((char*)arrHeader, 60);
    	f.close();
        return arrHeader;
    }
    

    Die Ausgabe hab ich auch abgeändert:

    cout << "Vers. of Data format :	" << arrHead[0]    <<" " << arrHead[1] << " " << arrHead[2] << " " << (long)arrHead[3] << endl << endl;
    

    Aber was ist mit den ECG Waveformdatas ?
    Wie schreibe ich die in ein Array und wie geb ich sie wieder aus ? 😉

    @Termite
    OK, was ich verstehe ist dass ich 3 Byte in 2 zwölf Bit Blöcke umwandeln muß !
    Ist auch klar dass die waveform Daten ab (inklusive) dem 60. Byte stehen, aber bis wohin ???
    Deinen Code versehe ich leider nicht so ganz 😞 !
    Wäre es zuviel verlangt wenn Du mir zeigen würdest (codemäßig) wie ich die kompletten Waveformdaten einer Datei in ein Array schreibe und diese ausgebe, dann steig ich da besser durch denke ich ?!

    Danke vorab für die Mühe und Hilfe
    hoffnungsvoll
    ShadowEater



  • ist was passiert, funktioniert es jetzt, funzt es nicht, gibt es nen neuen fehler...



  • Hi BitWax,

    siehe ober 😉 !

    Gruß
    ShadowEater



  • ah ok, war ich zu schnell 😃


Anmelden zum Antworten