/// <summary> /// Function to apply a bandpass filter on Signal object /// </summary> /// <param name="rhythmFilter">Provide filter for rhythm data</param> /// <param name="medianFilter">Provide filter for median data</param> /// <returns>a filtered copy of object</returns> public Signal ApplyFilter(DSP.IFilter rhythmFilter, DSP.IFilter medianFilter) { Signal sig = new Signal(); sig.Type = this.Type; sig.RhythmStart = this.RhythmStart; sig.RhythmEnd = this.RhythmEnd; if (this.Rhythm != null) { if (rhythmFilter == null) { return(null); } rhythmFilter.compute(this.Rhythm[0]); rhythmFilter.compute(this.Rhythm[0]); sig.Rhythm = new short[this.Rhythm.Length]; for (int i = 0; i < sig.Rhythm.Length; i++) { sig.Rhythm[i] = (short)Math.Round(rhythmFilter.compute(this.Rhythm[i])); } } if (this.Median != null) { if (medianFilter == null) { return(null); } medianFilter.compute(this.Median[0]); medianFilter.compute(this.Median[0]); sig.Median = new short[this.Median.Length]; for (int i = 0; i < sig.Median.Length; i++) { sig.Median[i] = (short)Math.Round(medianFilter.compute(this.Median[i])); } } return(sig); }
/// <summary> /// Apply highpass filter to Signal object /// </summary> /// <param name="cutoff">top frequency of bandpass filter</param> /// <param name="numSections">nr of sections to use in filter (default: 2)</param> /// <param name="filters">provide filters that where used</param> /// <returns>a filtered copy of the signal object</returns> public Signals ApplyHighpassFilter(double cutoff, int numSections, ref DSP.IFilter[] filters) { Signals sigs = new Signals(); sigs.RhythmAVM = this.RhythmAVM; sigs.RhythmSamplesPerSecond = this.RhythmSamplesPerSecond; sigs.MedianAVM = this.MedianAVM; sigs.MedianLength = this.MedianLength; sigs.MedianSamplesPerSecond = this.MedianSamplesPerSecond; sigs.MedianFiducialPoint = this.MedianFiducialPoint; if (this.QRSZone != null) { sigs.QRSZone = new QRSZone[this.QRSZone.Length]; for (int i = 0; i < sigs.QRSZone.Length; i++) { sigs.QRSZone[i] = this.QRSZone[i].Clone(); } } if (this._Lead != null) { sigs.NrLeads = this.NrLeads; if (filters == null || filters.Length != this.NrLeads) { filters = new DSP.IFilter[this.NrLeads]; } for (int i = 0; i < sigs._Lead.Length; i++) { DSP.IFilter rhythmFilter = null, medianFilter = null; if ((_Lead[i].Rhythm != null) && (this.RhythmSamplesPerSecond > 0)) { if ((filters[i] == null) || !(filters[i] is DSP.HighpassFilterButterworthImplementation)) { filters[i] = new DSP.HighpassFilterButterworthImplementation(cutoff, numSections, sigs.RhythmSamplesPerSecond); } rhythmFilter = filters[i]; } if ((_Lead[i].Median != null) && (this.MedianSamplesPerSecond > 0)) { medianFilter = new DSP.HighpassFilterButterworthImplementation(cutoff, numSections, sigs.MedianSamplesPerSecond); } sigs._Lead[i] = this._Lead[i].ApplyFilter(rhythmFilter, medianFilter); if (sigs._Lead[i] == null) { return(null); } } } return(sigs); }