private FilterInfo CreateFilter(int lowFrequency, int highFrequency, int filterOrder)
        {
            double[]        coefficients = FirCoefficients.BandPass(SamplingRate, lowFrequency, highFrequency, filterOrder);
            OnlineFirFilter filter       = new OnlineFirFilter(coefficients);

            return(new FilterInfo(filter, lowFrequency, highFrequency));
        }
Example #2
0
        public void lowpass(double value)
        {
            OnlineFilter lowpass = OnlineFirFilter.CreateLowpass(ImpulseResponse.Finite, fs_hz, value);

            for (int column_id = first_eeg_channel; column_id <= last_eeg_channel; column_id++)
            {
                double[] filtered = lowpass.ProcessSamples(data.GetColumn(column_id));
                data = data.SetColumn(column_id, filtered);
            }
        }
Example #3
0
        // median
        public void denoise(int order)
        {
            OnlineFilter denoise = OnlineFirFilter.CreateDenoise(order);

            for (int column_id = first_eeg_channel; column_id <= last_eeg_channel; column_id++)
            {
                double[] filtered = denoise.ProcessSamples(data.GetColumn(column_id));
                data = data.SetColumn(column_id, filtered);
            }
        }
Example #4
0
        public void notch_interference(double low_value, double high_value)
        {
            OnlineFilter bandstop = OnlineFirFilter.CreateBandstop(ImpulseResponse.Finite, fs_hz, low_value, high_value);

            for (int column_id = first_eeg_channel; column_id <= last_eeg_channel; column_id++)
            {
                double[] filtered = bandstop.ProcessSamples(data.GetColumn(column_id));
                data = data.SetColumn(column_id, filtered);
            }
        }
Example #5
0
        public double[] Bandpassfilter(double[] data, int sampling, int lowcutoff, int highcutoff)
        {
            this._sampling     = sampling;
            this._low_cutoff_  = lowcutoff;
            this._high_cutoff_ = highcutoff;
            var bandpassnarrow = OnlineFirFilter.CreateBandpass(ImpulseResponse.Finite, sampling, _low_cutoff_, _high_cutoff_, 17);

            data = bandpassnarrow.ProcessSamples(data);
            return(data);
        }
        protected override void Execute()
        {
            _filteredDatas.Clear();
            OnlineFirFilter filter = _configForm.Filter;

            for (int i = 0; i < this.DataBuf.Count; i++)
            {
                double[] showData = this.DataBuf[i];
                _filteredDatas.AddRange(filter.ProcessSamples(showData));
            }
        }
Example #7
0
        protected override void Execute()
        {
            _filteredDatas.Clear();
            int samplesPerView = GlobalInfo.SamplesInChart;
//            if (null == _filteredWave || _filteredWave.Length != samplesPerView)
//            {
//                _filteredWave = new double[samplesPerView];
//            }
            OnlineFirFilter filter = _configForm.Filter;

            for (int i = 0; i < GlobalInfo.EnableChannelCount; i++)
            {
                double[] showData = DataBuf.GetRange(i * samplesPerView, samplesPerView).ToArray();
                _filteredDatas.AddRange(filter.ProcessSamples(showData));
            }
        }
Example #8
0
    /**
     * 零相位延迟FIR滤波
     * @param:
     *      dataSerial          输入波形
     *      samplingFreq        采样率 Hz
     *      lowCutOff           低截至频率 Hz
     *      highCutOff          高截至频率 Hz
     *
     * @return FIRResult        滤波后数据
     */
    public double[] ZeroPhaseFIR(double[] dataSerial, double samplingFreq, double lowCutOff, double highCutOff)
    {
        IList <double> coef = new List <double>();

        double[] hf = FirCoefficients.BandPass(samplingFreq, lowCutOff, highCutOff, 64);     //获得滤波系数
        foreach (double number in hf)
        {
            coef.Add(number);
        }

        OnlineFirFilter filter = new OnlineFirFilter(coef);

        double[] FIRResult = filter.ProcessSamples(dataSerial);           //正向滤波
        FIRResult = filter.ProcessSamples(FIRResult.Reverse().ToArray()); //反向滤波
        FIRResult = FIRResult.Reverse().ToArray();                        //反转

        return(FIRResult);
    }
Example #9
0
        public OnlineFirFilter SetFilter(CtkPassFilterStruct pfarg)
        {
            var flag = this.filter != null;

            flag &= this.FilterArgs.Mode == pfarg.Mode;
            flag &= this.FilterArgs.SampleRate == pfarg.SampleRate;
            flag &= this.FilterArgs.CutoffLow == pfarg.CutoffLow;
            flag &= this.FilterArgs.CutoffHigh == pfarg.CutoffHigh;

            if (flag)
            {
                return(filter);
            }

            this.FilterArgs = pfarg;


            var coff = new double[0];

            switch (this.FilterArgs.Mode)
            {
            case CtkEnumPassFilterMode.BandPass:
                coff = FirCoefficients.BandPass(this.FilterArgs.SampleRate, this.FilterArgs.CutoffLow, this.FilterArgs.CutoffHigh);
                break;

            case CtkEnumPassFilterMode.LowPass:
                coff = FirCoefficients.LowPass(this.FilterArgs.SampleRate, this.FilterArgs.CutoffLow);
                break;

            case CtkEnumPassFilterMode.HighPass:
                coff = FirCoefficients.HighPass(this.FilterArgs.SampleRate, this.FilterArgs.CutoffHigh);
                break;

            default:
                throw new NotImplementedException();
            }

            filter = new OnlineFirFilter(coff);
            return(filter);
        }
Example #10
0
        private void RefreshCoefficient()
        {
            double[]            coefficient = null;
            SoftPanelGlobalInfo globalInfo  = SoftPanelGlobalInfo.GetInstance();
            FilterType          type        = (FilterType)Enum.Parse(typeof(FilterType), metroComboBox_type.Text);
            double lowCutoff  = double.Parse(textBox_lowerCutoff.Text);
            double highCutoff = double.Parse(textBox_highCutoff.Text);

            switch (type)
            {
            case FilterType.LowPass:
                coefficient = FirCoefficients.LowPass(globalInfo.SampleRate, lowCutoff);
                break;

            case FilterType.HighPass:
                coefficient = FirCoefficients.HighPass(globalInfo.SampleRate, highCutoff);
                break;

            case FilterType.BandPass:
                if (lowCutoff > highCutoff)
                {
                    double tmp = lowCutoff;
                    lowCutoff  = highCutoff;
                    highCutoff = tmp;
                }
                coefficient = FirCoefficients.BandPass(globalInfo.SampleRate, lowCutoff, highCutoff);
                break;

            case FilterType.BandStop:
                if (lowCutoff > highCutoff)
                {
                    double tmp = lowCutoff;
                    lowCutoff  = highCutoff;
                    highCutoff = tmp;
                }
                coefficient = FirCoefficients.BandStop(globalInfo.SampleRate, lowCutoff, highCutoff);
                break;
            }
            _filter = new OnlineFirFilter(coefficient);
        }
        private static async Task TestBrainDeviceManager()
        {
            var cfg       = ClientConfig.GetConfig();
            var lowFilter = new LowPassFilter()
            {
                LowPassRate = 10
            };
            var highFilter = new HighPassFilter()
            {
                HighPassRate = 10000
            };
            var bPassFilter = new BandPassFilter()
            {
                LowCutoffRate = 20, HighCutoffRate = 30
            };
            var bStopFilter = new BandStopFilter()
            {
                LowPassRate = 35, HighPassRate = 38
            };
            var mFilter = new MedianFilter()
            {
                HalfMedianWindowSize = 7
            };
            var bandFilter = new BandPassStopFilter
            {
                BandFilterList = new List <BandFilter> {
                    lowFilter, highFilter, bPassFilter, bStopFilter
                }
            };

            bandFilter.Disable = true;
            var allFilter = new FilterTypeList()
            {
                Filters = new List <FilterType> {
                    bandFilter, mFilter
                }
            };
            var filterParameters = new Dictionary <string, string>
            {
                { FilterTypeList.FIRhalfOrderOptionName, 10.ToString() }
            };

            cfg.FilterLst = allFilter;
            IOnlineFilter         filter     = null;
            WaveletReconstruction waveletRec = null;

            cfg.WaveletRecCfg = new WaveletReconstructionConfig
            {
                AvgLevel          = 8,
                ConvolutionMode   = ConvolutionModeEnum.Normal,
                ExtensionMode     = SignalExtension.ExtensionMode.SymmetricHalfPoint,
                Level             = 8,
                MotherWaveletName = "db5",
                WindowSize        = 15
            };
            cfg.WriteToFile(ClientConfig.DefaultConfigFileName);


            BrainDeviceManager.Init();
            var sender = await BrainDeviceManager.Connnect("127.0.0.1", 9211);

            BrainDevState currentState = default(BrainDevState);

            //保证设备参数正常才继续跑逻辑
            BrainDeviceManager.BrainDeviceState.Subscribe(ss =>
            {
                currentState = ss;
                filterParameters.Update(
                    FilterTypeList.SampleRateOptionName,
                    BrainDevState.SampleCountPer1Sec(ss.SampleRate).ToString()
                    );
                //AppLogger.Debug($"Brain Device State Changed Detected: {ss}");
            }, () =>
            {
                AppLogger.Debug("device stop detected");
            });
            int totalReceived    = 0;
            var medianFilter     = OnlineFirFilter.CreateDenoise(7);
            var fastMedianFilter = new OnlineFastMedianFilter(3);

            BrainDeviceManager.SampleDataStream.Subscribe(tuple =>
            {
                var(order, datas, arr) = tuple;
                //Console.Write($" {order} ");
                var passTimes = BrainDevState.PassTimeMs(currentState.SampleRate, totalReceived) / 1000;
                var intArr    = datas.CopyToArray();
                var val       = intArr[0];
                var voltage   = BitDataConverter.Calculatevoltage(val, 4.5f, currentState.Gain);
                totalReceived++;
                var m1 = medianFilter.ProcessSample(voltage);
                var m2 = fastMedianFilter.ProcessSample(voltage);
                AppLogger.Debug($"passTimes:{passTimes},val:{val},voltage:{voltage},median filter:{m1},fast:{m2},{m1==m2}");
                if (filter == null)
                {
                    filter     = allFilter.CreateFilter(filterParameters);
                    waveletRec = cfg.WaveletRecCfg.Create(
                        BrainDevState.SampleCountPer1Sec(currentState.SampleRate));
                    waveletRec.ReconstructionStream.Subscribe(reconstruct =>
                    {
                        var(vol, tim) = reconstruct;
                        AppLogger.Debug($"wavelet reconstruction:{vol} at {tim}");
                    });
                }
                waveletRec?.BufferData((voltage, passTimes));
                AppLogger.Debug($"filter processed:{filter.ProcessSample(voltage)}");
                //AppLogger.Debug($"order:{order}");
                //AppLogger.Debug($"converted values:{datas.Show()}");
                //AppLogger.Debug($"original datas:{arr.Show()}");
            }, () =>
            {
                AppLogger.Debug("device sampling stream closed detected");
            });

            var cmdResult = await sender.QueryParam();

            AppLogger.Debug("QueryParam result:" + cmdResult);
            if (cmdResult != CommandError.Success)
            {
                AppLogger.Error("Failed to QueryParam, stop");
                BrainDeviceManager.DisConnect();
                return;
            }


            cmdResult = await sender.SetFilter(true);

            AppLogger.Debug("SetFilter result:" + cmdResult);

            cmdResult = await sender.SetTrap(TrapSettingEnum.Trap_50);

            AppLogger.Debug("SetTrap result:" + cmdResult);

            cmdResult = await sender.SetSampleRate(SampleRateEnum.SPS_2k);

            AppLogger.Debug("SetSampleRate result:" + cmdResult);

            cmdResult = await sender.QueryParam();

            AppLogger.Debug("QueryParam result:" + cmdResult);

            cmdResult = await sender.QueryFaultState();

            AppLogger.Debug("QueryFaultState result:" + cmdResult);

            cmdResult = await sender.TestSingleImpedance(1);

            AppLogger.Debug("TestSingleImpedance result:" + cmdResult);

            cmdResult = await sender.TestMultiImpedance(30);

            AppLogger.Debug("TestMultiImpedance result:" + cmdResult);

            Console.ReadLine();
            var fs = new FileResource(currentState, 19801983, 1, BrainDeviceManager.BufMgr);

            fs.StartRecord(BrainDeviceManager.SampleDataStream);
            cmdResult = await sender.Start();

            if (cmdResult != CommandError.Success)
            {
                AppLogger.Error("Failed to start sampler");
            }
            else
            {
                AppLogger.Debug($"start receive sample data");
                await Task.Delay(1000 *10);

                AppLogger.Debug($"stoping");
                await sender.Stop();

                AppLogger.Debug($"stop receive sample data");
                await Task.Delay(1000);
            }

            BrainDeviceManager.DisConnect();
            fs.Dispose();

            var readf = new FileSampleData(fs.ResourceId, BrainDeviceManager.BufMgr);

            Console.WriteLine($"expecte to read {totalReceived} blocks");
            Console.WriteLine($"start reading saved sampling data");
            int readCount = 0;

            readf.DataStream.Subscribe(tuple =>
            {
                var(order, datas, arr) = tuple;
                Console.Write($" {order} ");
                readCount++;
                //AppLogger.Debug($"order:{order}");
                //AppLogger.Debug($"converted values:{datas.Show()}");
                //AppLogger.Debug($"original datas:{arr.Show()}");
            }, () =>
            {
                AppLogger.Debug($"read sampling data file end,count :{readCount},expected count:{totalReceived}");
            });
            readf.Start();
            await Task.Delay(1000 *10);

            Console.Write($"wait complete");
        }
Example #12
0
 public FilterInfo(OnlineFirFilter filter, int lowFrequency, int highFrequency)
 {
     Filter = filter;
     Band   = new FilterBandInfo(lowFrequency, highFrequency);
 }