Datenanalysefirma !



  • ShadowEater schrieb:

    Danke für die schnelle Hilfe mcr und Termite,

    @Termite
    verstehe ich das richtig : samplBuffer ist das dynamische Ergebnisarray inwelchem alle benötigten Werte drinstehen ?

    Dann müsste diese Funktion doch korrekt sein oder ?
    Beim kompilieren gibt es auch keine Fehler oder Warnungen aber bein ausführen:

    AX_ECG_ReadIn_01.exe hat ein Problem festgestellt und muss beendet werden.

    unsigned short int * 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();
    
     	
    	const	max = 0x00000DAC; 
    	unsigned char * dataInPtr; 
    	
    	unsigned short int * samplBuffer = new unsigned short int [max]; 
    	
    	int j = 60; 
    	
    	/* for all sampls do */ 
    	for ( int i = 0; i < max; i++ ) 
    	{ 
    		/* if even sampl */ 
    		if ( (i % 2) == 0 ) 
    		{ 
    			/* add bit 0 to7  bit to sampl */ 
    			samplBuffer [i]  = dataInPtr[j]; 
    			j++; 
    			/* add bit 8 to 11 bit to sampl */ 
    			samplBuffer [i] |= ( dataInPtr[j] & 0x0F ) << 8; 
    		} 
    		/* if odd sampl */ 
    		else 
    		{ 
    			/* add bit 0 to 3 to the sampl */ 
    			samplBuffer [1]  = ( dataInPtr[j] & 0xF0 ) >> 4; 
    			j++; 
    			/* add bit 4 to 11 to the sampl */ 
    			samplBuffer [1] |= dataInPtr[2] << 4; 
    			j++; 
    		} 
       }
      return samplBuffer;
    }
    

    Ausgabe :

    unsigned short int *samplearr;
    	samplearr = EcgRead.LoadEcg();
    
    	cout << "Vers. of Data format :	" << samplearr[0]    <<" " << samplearr[1] << " " << samplearr[2] << " " << (long)samplearr[3] << endl << endl;
    

    Ich habe das kleine Projekt der Übersichtlichkeit wegen nochmal bereinigt und raufgeladen !

    http://www.filehosting.at/files/download.php?file=51ac8cb9f6f5306f68246b1d66c3c55e

    BTW:Kennst Du irgendwelche Tuts, Bücher oder Skripte von Universitäten die sich mit solchen Bitschiebereien beschäftigen (Aufgaben mit Lösungen wären gut) denn in allen meinen Büchern wird nur beschrieben dass es das gibt und es wird nur sehr kurz darauf eingegangen aber nichts wirklich beispielhaft erklärt !???

    Vielen Dank für Deine / Eure Mühe und Hilfe
    Gruß
    ShadowEater



  • Hi,

    ich hab nen Fehler gefunden :

    long	max = 0x00000DAC; 
    	unsigned char * dataInPtr = new	unsigned char[max]; 
    	unsigned short int * samplBuffer = new unsigned short int [max]; 
    
    	int j = 60; 
    
    	/* for all sampls do */ 
    	for ( int i = 0; i < max; i++ ) 
    	{
    		/* if even sampl */ 
    		if ( (i % 2) == 0 ) 
    		{
    			/* add bit 0 to7  bit to sampl */ 
    			samplBuffer [i]  = dataInPtr[j]; 
    			j++; 
    			/* add bit 8 to 11 bit to sampl */ 
    			samplBuffer [i] |= ( dataInPtr[j] & 0x0F ) << 8; 
    		}
    

    dataInPtr muß dynamisch sein, da ein paar Zeilen weiter dataInPtr einem dynamischen Array zugewiesen wird samplBuffer [i] = dataInPtr[j]; !

    Ausgabe:

    long	max = 0x00000DAC; 
    	unsigned short int * samplBuffer = new unsigned short int [max]; 	
    	samplBuffer = EcgRead.LoadEcg();
    
    	cout << samplBuffer[0]    <<" " << (long)samplBuffer[1] << " " << samplBuffer[2] << " " << samplBuffer[3] << endl << endl;
    

    Auf dem Screen wird dann :
    3533 3292 3533 52685 ausgegen, aber das stimmt doch nicht ...!!!???

    Gruß
    ShadowEater



  • Du hast bisher noch nicht weiter eingelesen.

    f.read(datain, bytes);
    

    fehlt noch!

    Gruß mcr

    EDIT: dataInPtr muss im obigen Beispiel 5252 bytes groß sein.



  • Hi

    max ist ein Wert, der aus daten des Headers gebildet wird. ( byte 8, 9, 10 und 11)

    mein wert ist nur beispielhaft für eine von den Dateien, kann somit auch abweichen.

    dataInPtr ist ein pointer auf den puffer der inputdaten, die nach dem header kommen. der ist 1,5 mal grösser als der max wert. bzw. FileSize - 60. Die daten müssen vorher natürlich noch eingelesen werden. Analog zu arrHeader. vor dem 2. lesevorgang die datei aber nich schliesen 😉

    gruss



  • Hi,

    danke für eure Antworten aber ich bekomm hier Fehler über Fehler !!!
    Ich kriegs einfach nicht zum laufen !
    Ich weiß dass das nicht üblich ist aber könntet ihr vllt. so nett sein und über den Code den ich raufgeladen hab mal korrigierend drüberschauen ???

    Wenn das Programm fehlerfrei für eine Datei mit einlesen und Ausgabe läuft, dann kann ich damit rumprobieren.
    Ich she momentan sonst wirklich kein Land. Ich such auch keine CodeSklafen oder bin zu faul zum selbstschreiben, ich bin schlicht grad am ersaufen 😉 !!!

    Hier nochmal der Link:
    http://www.filehosting.at/files/download.php?file=9cb3c43f83915e54a1126a03fd9bbf23

    Es ist wirklich wie verhext.
    Nebenbei nochmal kennt ihr irgentwelche Tuts, Scripte oder sonstiges Material die auf diese Bitschiebegeschichrten eingehen (vllt sogar mit Beispielen, Aufgaben und Lösungen ???) ???

    Vielen, vielen Dank für eure Hilfe & Mühe
    der völligen Verzweiflung nahe
    ShadowEater



  • Hier mal die verbesserte Einlese Routine:

    unsigned short int* cEcgReadIn::LoadEcg()
    {
        fstream f;
    
        f.open("44DBE2AD.ecg",ios::in | ios::binary);
        if (!f) cout << "Fehler beim oeffnen der Datei...\n";
    
        f.read((char*)arrHeader, 60);
    
        const int	max = 0x00000DAC; // muss aus den Header-Infos berechnet werden!
        unsigned char * dataInPtr = new unsigned char[5252]; // 5252 ebensfalls berechnen!
    
        f.read((char *)dataInPtr, 5252); // du hattest vergessen die Daten einzulesen
        unsigned short int * samplBuffer = new unsigned short int [max];
    
        int j = 0; // daten werden separat eingelesen, daher hier die 0
    
        /* for all sampls do */
        for (int i = 0; i < max; ++i) {
            /* if even sampl */
            if ((i % 2) == 0) {
                /* add bit 0 to 7  to sampl */
                samplBuffer [i]  = dataInPtr[j++];
                /* add bit 8 to 11 to sampl */
                samplBuffer [i] |= ( dataInPtr[j] & 0x0F ) << 8;
            }
            /* if odd sampl */
            else {
                /* add bit 0 to 3   to sampl */
                samplBuffer [i]  = ( dataInPtr[j++] & 0xF0 ) >> 4;  // hier war 1 statt i!
                /* add bit 4 to 11  to sampl */
                samplBuffer [i] |= dataInPtr[j++] << 4; // hier war 2 statt j und 1 statt i
            }
        }
    
        cout << "Die ersten 9 eingelesenen Bytes: ";
        for (int i = 0; i<9; ++i) cout << hex << (int)dataInPtr[i] << " ";
        cout << endl;
    
        cout << "Die ersten 6 Samples:            ";
        for (int i = 0; i<6; ++i) cout << hex << (int) samplBuffer[i] << " ";
        cout << endl;
    
        f.close();
        return samplBuffer;
    }
    

    Fehler und Kommentare habe ich im Code angefügt!

    Gruß mcr



  • Fang ersteinmal langsam an, z.B. hiermit.

    Und gewöhne dir bitte mal eine vernünftige Zeichensetzung an, d.h. keine Leerzeichen vor den Satzzeichen und es genügt auch ein Satzzeichen. Man benötigt keine drei...



  • *D*A*N*K*E*
    mcr,

    damit kann ich schon was anfangen 😉

    const int    max = 0x00000DAC; // muss aus den Header-Infos berechnet werden! 
        unsigned char * dataInPtr = new unsigned char[5252]; // 5252 ebensfalls berechnen!
    

    Kannst Du mir noch sagen wie ich die beiden berechne, Termite hat da schon eine Andeutung gemacht nur leider war die etwas zu professionell !

    Gruß
    und danke nochmal
    ShadowEater

    P.S.: lolz schau mir später mal an ob da die Bitgeschichten gut beschrieben sind !



  • Hi,

    @mcr:

    Sind die Samplewerte nicht etwas groß:

    3f7----3f6-----3f8----3ff-----40c----41d
    1015--1014--1016--1023--1036--1053

    Diese Werte sind Punktpaare X und Y Koordinaten der Punkte die dann die EKG Kurve darstellen, die sind im 1000'er Bereich, ist das nicht etwas groß ?

    Vilen Dank
    Gruß
    ShadowEater



  • max ermittelst du aus den Headerinformationen:

    int max = arrHeader[12] + (arrHeader[13] << 8);
        max += (arrHeader[14] << 16) + (arrHeader[15] << 24);
        cout << "Datasets: " << max << endl;
    
        int readsize = max * 12 / 8;  // bytes an nutzdaten
        cout << "Readsize: " << readsize << " bytes" << endl;
    
        unsigned char * dataInPtr = new unsigned char[readsize];
        f.read((char *)dataInPtr, readsize);
    

    So, das sollte nun komplett sein!

    Gruß mcr



  • ShadowEater schrieb:

    Hi,

    @mcr:

    Sind die Samplewerte nicht etwas groß:

    3f7----3f6-----3f8----3ff-----40c----41d
    1015--1014--1016--1023--1036--1053

    Diese Werte sind Punktpaare X und Y Koordinaten der Punkte die dann die EKG Kurve darstellen, die sind im 1000'er Bereich, ist das nicht etwas groß ?

    Vilen Dank
    Gruß
    ShadowEater

    Du, ich habe keine Ahnung, welche Bedeutung diese Zahlen haben.
    Sorry, da kann ich dir nicht weiterhelfen.

    Gruß mcr

    PS: vielleicht steht ja in deiner Beschreibung etwas genaueres über die
    Einheiten.



  • Hi mcr,

    danke für Deine droßartige Hilfe !
    In der Beschreibung steht leider nichts, naja, das kann ich vllt. durch ausprobieren herausfinden.

    Eine frage hätte ich noch :

    int max = arrHeader[12] + (arrHeader[13] << 8);
        max += (arrHeader[14] << 16) + (arrHeader[15] << 24);
        cout << "Datasets: " << max << endl;
    
        int readsize = max * 12 / 8;  // bytes an nutzdaten
        cout << "Readsize: " << readsize << " bytes" << endl;
    
        unsigned char * dataInPtr = new unsigned char[readsize];
        f.read((char *)dataInPtr, readsize);
    

    wenn ich diese Zeilen einpflege bekomm ich bein kompilieren wieder keine Fehler aber beim ausführen die Feklermeldung dass ein fehler gefunden wurde... an Microsoft sensen... !

    Wo muss ich mit den Zeilen hin und was muss raus !

    Vielen Dank für Deine Hilfe und Mühe
    ShadowEater

    P.S.: Wenn Du möchtest halt ich Dich auf dem Laufenden (was die Daten betrifft)



  • Hier die kompletten Files:

    ECG_ReadIn_01.h

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    class cEcgReadIn
    {
     private:
    
     public:
        unsigned char arrHeader[60];
    
        cEcgReadIn	();
        ~cEcgReadIn	();
    
        unsigned short int *LoadEcg();
    };
    
    cEcgReadIn::cEcgReadIn()
    {
    }
    
    cEcgReadIn::~cEcgReadIn()
    {
    }
    
    unsigned short int* cEcgReadIn::LoadEcg()
    {
        fstream f;
    
        f.open("44DBE2AD.ecg",ios::in | ios::binary);
        if (!f) cout << "Fehler beim oeffnen der Datei...\n";
    
        f.read((char*)arrHeader, 60);
    
        int max = arrHeader[12] + (arrHeader[13] << 8);
        max += (arrHeader[14] << 16) + (arrHeader[15] << 24);
        cout << "Datasets: " << max << endl;
    
        int readsize = max * 12 / 8;  // bytes an nutzdaten
        cout << "Readsize: " << readsize << " bytes" << endl;
    
        unsigned char * dataInPtr = new unsigned char[readsize];
        f.read((char *)dataInPtr, readsize);
    
        unsigned short int * samplBuffer = new unsigned short int [max];
    
        int j = 0; // daten werden separat eingelesen, daher hier die 0
    
        /* for all sampls do */
        for (int i = 0; i < max; ++i) {
            /* if even sampl */
            if ((i % 2) == 0) {
                /* add bit 0 to7  bit to sampl */
                samplBuffer [i]  = dataInPtr[j++];
                /* add bit 8 to 11 bit to sampl */
                samplBuffer [i] |= ( dataInPtr[j] & 0x0F ) << 8;
            }
            /* if odd sampl */
            else {
                /* add bit 0 to 3 to the sampl */
                samplBuffer [i]  = ( dataInPtr[j++] & 0xF0 ) >> 4;
                /* add bit 4 to 11 to the sampl */
                samplBuffer [i] |= dataInPtr[j++] << 4;
            }
        }
    
        cout << "Die ersten 9 eingelesenen Bytes: ";
        for (int i = 0; i<9; ++i) cout << hex << (int)dataInPtr[i] << " ";
        cout << endl;
    
        cout << "Die ersten 6 Samples:            ";
        for (int i = 0; i<6; ++i) cout << hex << (int) samplBuffer[i] << " ";
        cout << endl;
    
        f.close();
        return samplBuffer;
    
    }
    

    und AX_ECG_ReadIn_01.cpp

    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    #include "ECG_ReadIn_01.h"
    
    int main()
    {
    	cEcgReadIn EcgRead;
    
    	unsigned short int *samplearr;
    	samplearr = EcgRead.LoadEcg();
    
    	return 0;
    
    }
    

    Viel Spaß damit..

    Kannst mich gerne auf den Laufenden halten. Es interessiert mich auch,
    was da rauskommt.

    Gruß mcr



  • Hi mcr,
    eine Frage hab ich immer noch:

    samplBuffer [i] |= dataInPtr[j++] << 4;
    

    Ist dies die verkürzte Schreibweise für:

    samplBuffer [i] = samplBuffer [i] | dataInPtr[j++] << 4;
    

    Und weshalb muß hier ein e OR und keine AND Verknüpfung durchgeführt werden ?

    Ansonsten: GEIL, DAT FUNKTIONIERT!!!!! 😃 😃 😃 😃 👍
    http://filehosting.at/images/download.php?file=0ea174f6e6c2c2221a7346753d43034c
    Vielen vielen vielen Dank!!!!!

    ShadowEater



  • 1. Ja, das ist diese verkürzte Schreibweise
    2. Mit | (or) fügst du Bits hinzu. Mit & (and) schneidest du Bits ab.

    Beispiel or

    101100 
      010110
    --------
      111110
    

    Beispiel and

    101100
      010110
    --------
      000100
    

    Wie hast du dieses Bild erzeugt?
    Kannst du mir dazu mal deinen Code schicken?

    Gruß mcr



  • Hi mcr,

    das Bild hab ich mit Excel(OpenOffice)gemacht.
    Ja selbstverständlich schick ich Dir die Datei zu, später werd icg die Grafik in einem ChartControl anzeigen (im fertigen Programm).

    Kannst Du mir Deine MailAdresse irgendwie senden, gibts hier die Möglichkeit einer Pn (Personal Note) oder so ?

    Gruß
    ShadowEater



  • Hi, hast Post 😉



  • Hi mcr,

    Du auch 😉

    Gruß
    ShadowEater



  • ShadowEater schrieb:

    Pn (Personal Note)

    *klugscheiß*
    Pn = persönliche Nachricht
    Pm = personal message
    /klugscheiß


Anmelden zum Antworten