private void noise12hz_CheckedChanged(object sender, EventArgs e) { Settings set = Settings.instance(); set.noise12Hz = noise12hz.Checked; set.noise20Hz = noise20hz.Checked; set.noise45Hz = noise45hz.Checked; set.noiseNotch = noiseNotch.Checked; if (noise50hz.Checked) { set.noiseCustom = 50; } else if (noise60hz.Checked) { set.noiseCustom = 60; } set.commit(); frm.graph1.samples = FileHandler.load(frm.slider1); frm.graph1.Refresh(); }
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> /// 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; }