Esempio n. 1
0
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            // skip if file is not specified
            if (!FileHandler.available())
            {
                return;
            }


            // read sample rate
            sampleRate         = FileHandler.readSampleRate();
            slider1.sampleRate = sampleRate;


            // set default settings
            Settings set = Settings.instance();

            slider1.seek        = set.lastSeek;
            slider1.blocks      = set.lastBlocks;
            slider1.perPage     = set.perPage;
            slider1.page        = (long)(slider1.seek / slider1.perPage);
            slider1.blocksCount = FileHandler.blocksCount();
        }
        /// <summary>
        /// save to file, each block is 512 bytes
        /// </summary>
        /// <param name="path">path to file</param>
        /// <param name="seek">position of block</param>
        /// <param name="blocks">blocks to save</param>
        public static void save(string path, long seek, long blocks)
        {
            if (seek > blocksCount())
            {
                return;
            }

            BinaryWriter bw = new BinaryWriter(new FileStream(path, FileMode.Create));

            long cnt = 0;

            if (seek < 0)
            {
                setPosition(0);
                cnt = blocks + seek;
            }
            else
            {
                setPosition(seek);
                cnt = blocks;
            }

            for (int i = 0; i < cnt; i++)
            {
                bw.Write(readBlock());


                if (remainingBlocks() < 1)
                {
                    bw.Close();
                    return;
                }
            }


            bw.Close();

            EcgStatistic ecg = new EcgStatistic();

            ecg.id           = id.id;
            ecg.age          = id.age;
            ecg.name         = id.name;
            ecg.starttimeSec = id.starttimeSec + (int)((float)seek * 56.0f / FileHandler.readSampleRate());


            XmlClass <EcgStatistic> .Save(ecg, path + ".xml", SerializedFormat.Document);
        }
Esempio n. 3
0
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            // skip if file not loaded
            if (!FileHandler.available())
            {
                return;
            }


            // read sample rate from file
            sampleRate         = FileHandler.readSampleRate();
            graph1.sampleRate  = sampleRate;
            slider1.sampleRate = sampleRate;

            // read settings
            Settings set = Settings.instance();

            slider1.seek        = set.lastSeek;
            slider1.blocks      = set.lastBlocks;
            slider1.perPage     = set.perPage;
            slider1.page        = (long)(slider1.seek / slider1.perPage);
            slider1.blocksCount = FileHandler.blocksCount();


            // config zoom and start point
            graph1.start = set.lastOffset;
            graph1.zoom  = set.lastZoom;

            graph1.detection = set.detection;
            graph1.detectST  = set.detectST;

            // load filtered samples
            graph1.samples   = FileHandler.load(slider1);
            graph1.ecgid     = FileHandler.id;
            slider1.critical = graph1.ecgid.critical;


            slider1.s2 = graph1.ecgid.starttimeSec;
            graph1.s2  = slider1.seek * 56.0f / slider1.sampleRate;

            slider1.Refresh();
            graph1.Refresh();



            // on scroll changes
            graph1.onChange = () =>
            {
                if (!FileHandler.available())
                {
                    return;
                }
                set            = Settings.instance();
                set.lastOffset = graph1.start;
                set.lastZoom   = graph1.zoom;
                set.commit();
            };
            // on slider position changes
            slider1.onChange = () =>
            {
                if (!FileHandler.available())
                {
                    return;
                }
                set            = Settings.instance();
                set.lastSeek   = slider1.seek;
                set.lastBlocks = slider1.blocks;
                set.perPage    = slider1.perPage;


                graph1.samples = FileHandler.load(slider1);

                slider1.critical = FileHandler.id.critical;


                graph1.zoom = slider1.blocks * 56.0f / slider1.sampleRate;
                graph1.s2   = slider1.seek * 56.0f / slider1.sampleRate;

                if (slider1.seek < 0)
                {
                    graph1.start = slider1.seek * 56.0f / slider1.sampleRate;
                }
                else
                {
                    graph1.start = 0;
                }


                graph1.detection = set.detection;
                graph1.detectST  = set.detectST;


                set.commit();



                if (graph1.samples.Count < graph1.zoom * sampleRate)
                {
                    graph1.zoom = (float)graph1.samples.Count / (float)sampleRate;
                }

                graph1.Refresh();
            };
        }
        /// <summary>
        /// load and filter signal
        /// </summary>
        /// <param name="slider">slider</param>
        /// <returns></returns>
        public static SignalSamples load(Slider slider)
        {
            // skip if file not exist
            if (!FileHandler.available())
            {
                return(null);
            }


            // load samples
            Settings set = Settings.instance();

            int           sampleRate = FileHandler.readSampleRate();
            SignalSamples samples    = FileHandler.readBlocks(slider.seek, slider.blocks);

            samples            = samples.Normalize();
            samples.sampleRate = sampleRate;


            // find signal amplitude
            Signal deltaGreat = samples.FindMax() - samples.FindMin();

            // 2x 12 hz filter
            if (set.noise12Hz)
            {
                samples.Filter(12, sampleRate / 2, 1.3f);
                samples.Filter(12, sampleRate / 2, 1.3f);
            }
            // 20 hz filter
            if (set.noise20Hz)
            {
                samples.Filter(20, sampleRate / 2, 1.3f);

                samples.Filter(20, sampleRate / 2, 1.3f);
            }

            // 45 hz filter
            if (set.noise45Hz)
            {
                samples.Filter(45, sampleRate / 2, 1.3f);
            }


            // 50hz or 60hz noise
            if (set.noiseCustom > 0)
            {
                samples.Filter(set.noiseCustom, sampleRate / 2, 1);
            }


            // notch filter
            if (set.noiseNotch)
            {
                samples = FilterNotch.Process(samples, 400, 0.1f);
            }



            // find signal loss enerrgy amplitude
            Signal deltaLess = samples.FindMax() - samples.FindMin();

            // amplify loosed amplitude
            samples.Amplify(deltaGreat, deltaLess);

            // load file description
            FileHandler.id = XmlClass <EcgStatistic> .Load(FileHandler.p + ".xml", SerializedFormat.Document);

            return(samples);
        }
Esempio n. 5
0
        /// <summary>
        /// thread for faster analysing
        /// </summary>
        void run()
        {
            // skip if file not available
            if (!FileHandler.available())
            {
                return;
            }



            progressBar1.Value = 0;

            // load sample rate
            sampleRate = FileHandler.readSampleRate();

            // load samples
            samples = FileHandler.load(slider1);

            progressBar1.Value = 20;
            Application.DoEvents();
            bool fst = false;

            // if signal was ecg
            if (decg.Checked)
            {
                // set samples
                graph1.samples    = samples;
                graph1.sampleRate = sampleRate;
                graph1.ylabel     = "mv";
            }
            else
            {
                graph1.samples            = new SignalSamples();
                graph1.samples.sampleRate = 0;
                graph1.sampleRate         = 0;

                bool stop = false;

                // initialize ecg arrays
                int[]                tr     = new int[3];
                int[]                offset = new int[3];
                List <float>[]       sigz   = new List <float> [3];
                EcgCharacteristics[] last   = new EcgCharacteristics[3];
                EcgCharacteristics[] now    = new EcgCharacteristics[3];


                // define ecg arrays
                for (int i = 0; i < 3; i++)
                {
                    sigz[i]   = new List <float>();
                    offset[i] = sampleRate;
                    // detect first ecg signal
                    last[i] = samples.FindDelta(i + 1, 0, offset[i]);
                    tr[i]   = 0;
                }

                // loop until signal is end
                do
                {
                    for (int i = 0; i < 3; i++)
                    {
                        //  detect second ecg signal
                        now[i] = samples.FindDelta(i + 1, last[i].lastCharacteristic(), offset[i]);


                        // find distrance between two pulses
                        offset[i] = Math.Abs(now[i]["R"].idx - last[i]["R"].idx);

                        // if the heart beat(pulse rate) between exact range
                        if (offset[i] > 0 && offset[i] < sampleRate)
                        {
                            // find heart beat sample rate
                            if (!fst)
                            {
                                graph1.samples.sampleRate += offset[i];
                                if (i == 2)
                                {
                                    fst = true;
                                }
                            }
                            float hpr = 0;

                            // calculate ST line
                            if (dst.Checked)
                            {
                                hpr = (now[i]["ST"].value - now[i]["Q"].value);
                            }
                            else if (dpr.Checked)                             // calculate heart beat
                            {
                                hpr = 60.0f / (float)(offset[i] / (float)sampleRate);
                            }

                            sigz[i].Add(hpr);
                        }
                        else
                        {
                            // if pulse rate was not reliable set offset as default sample rate
                            offset[i] = sampleRate;
                        }
                        //  if ecg data was not reliable try again
                        if (now[i]["c"].idx <= 0 || now[i]["T"].idx <= 0)
                        {
                            tr[i]++;
                        }

                        // set last ecg signal if signal was out of range
                        if (now[i].lastCharacteristic() <= last[i].lastCharacteristic())
                        {
                            now[i]["c"].idx = last[i].lastCharacteristic() + offset[i];
                        }

                        // skip if signal was out of range
                        if (now[i].lastCharacteristic() + offset[i] > samples.Count)
                        {
                            tr[i] = 40;
                        }

                        // set
                        last[i] = now[i];
                    }

                    // return when data was end
                    if (tr[0] > 30 && tr[1] > 30 && tr[2] > 30)
                    {
                        stop = true;
                    }
                } while (!stop);

                // find maximum signal range
                int max = sigz[0].Count;
                for (int i = 0; i < 3; i++)
                {
                    if (sigz[i].Count > max)
                    {
                        max = sigz[i].Count;
                    }
                }

                // insert collected data as samples
                for (int i = 0; i < max; i++)
                {
                    Signal sig = new Signal();
                    for (int j = 0; j < 3; j++)
                    {
                        if (i < sigz[j].Count)
                        {
                            sig[j + 1] = sigz[j][i];
                        }
                    }

                    graph1.samples.Add(sig);
                }
                // show results
                if (dpr.Checked)
                {
                    graph1.ylabel = "";
                }
                else if (dst.Checked)
                {
                    graph1.ylabel = "mv";
                }
                progressBar1.Value        = 100;
                graph1.samples.sampleRate = (int)((float)sampleRate / (float)graph1.samples.sampleRate / 3.0f + 1);
                graph1.sampleRate         = graph1.samples.sampleRate;
                graph1.samples.NoiseReduction(3);
            }
            graph1.zoom = (float)graph1.samples.Count / (float)graph1.sampleRate;

            graph1.Refresh();
            working = false;
        }