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)); }
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); } }
// 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); } }
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); } }
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)); } }
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)); } }
/** * 零相位延迟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); }
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); }
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"); }
public FilterInfo(OnlineFirFilter filter, int lowFrequency, int highFrequency) { Filter = filter; Band = new FilterBandInfo(lowFrequency, highFrequency); }