Exemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="srcData"></param>
        /// <param name="arges"></param>
        /// <returns></returns>
        public override double[] Process(double[] input_data, FilterArgs args)
        {
            double[] sData = base.Process(input_data, args);
            if (sData == null)
            {
                return(null);
            }
            if (!(args is MedianFilterArgs))
            {
                return(null);
            }
            MedianFilterArgs e = args as MedianFilterArgs;

            return(this.Process(sData, e));
        }
Exemplo n.º 2
0
        /// <summary>
        /// 平台处理函数
        /// </summary>
        /// <param name="srcData"></param>
        /// <param name="arges"></param>
        /// <returns></returns>
        public List <FlatInfo> Process(double[] input_data, FilterArgs args)
        {
            if (input_data == null)
            {
                return(null);
            }
            if (args == null)
            {
                return(null);
            }
            if (!(args is MedianFilterArgs))
            {
                return(null);
            }

            MedianFilterArgs arg = args as MedianFilterArgs;
            int _flat_width      = arg.FrameSize / 2 + 1;

            if (input_data.Length <= _flat_width)
            {
                return(null);
            }

            //查找平台
            List <FlatInfo> _flat_list = new List <FlatInfo>();

            List <FlatInfo> _flat1 = FindFlat(input_data.ToList(), _flat_width);

            if (_flat1 != null)
            {
                _flat_list.AddRange(_flat1);
            }

            List <FlatInfo> _flat2 = FindFlat(input_data.ToList(), _flat_width + 1);

            if (_flat2 != null)
            {
                _flat_list.AddRange(_flat2);
            }

            //List<FlatInfo> _flat3 = FindFlat(input_data.ToList(), _flat_width - 1);
            //if (_flat3 != null)
            //    _flat_list.AddRange(_flat3);

            return(_flat_list);
        }
Exemplo n.º 3
0
        /// <summary>
        /// midpoint filter
        /// </summary>
        /// <param name="srcData"></param>
        /// <param name="FrameSize"></param>
        /// <returns></returns>
        protected virtual double[] Process(double[] input_data, MedianFilterArgs args)
        {
            if (input_data == null)
            {
                return(null);
            }
            if (args == null)
            {
                return(null);
            }
            if (input_data.Length <= args.FrameSize)
            {
                return(input_data);
            }

            int _half_window_size = args.FrameSize / 2;
            int _flat_width       = _half_window_size + 1;

            //一次滤波过程中总有半窗口长度的数据未被滤波
            //组织用于恢复平台的原始数据
            List <double> _input_data_list = input_data.ToList();

            _input_data_list.InsertRange(0, this._his_input_nofilting);
            _his_input_nofilting = _input_data_list.GetRange(_input_data_list.Count - _half_window_size, _half_window_size);//更新数据偏移
            _input_data_list.RemoveRange(_input_data_list.Count - _half_window_size, _half_window_size);
            _input_data_list.InsertRange(0, this._his_input_list);

            //中值滤波
            double[] _mid_data_buf = _midFilter.Process(input_data, args);
            if (_mid_data_buf == null)
            {
                return(null);
            }
            if (_mid_data_buf.Length <= _flat_width)
            {
                return(_mid_data_buf);
            }
            //组织滤波后的数据,数量应该与input_data_list数据一致
            List <double> _mid_data_list = _mid_data_buf.ToList();

            _mid_data_list.InsertRange(0, this._his_mid_list);
            if (_mid_data_list.Count != _input_data_list.Count)
            {
                return(null);
            }

            //寻找并处理平台
            List <FlatInfo> _flat_list = _flatPro.Process(_mid_data_list.ToArray(), args);

            if (_flat_list != null && _flat_list.Count != 0)
            {
                //用原始数据恢复平台
                foreach (FlatInfo fi in _flat_list)
                {
                    _mid_data_list.RemoveRange(fi.StartIndex, fi.FlatWidth);
                    _mid_data_list.InsertRange(fi.StartIndex, _input_data_list.GetRange(fi.StartIndex, fi.FlatWidth));
                }
            }
            //处理历史数据
            _his_mid_list.Clear();
            _his_input_list.Clear();

            if ((_flat_list == null) || (_flat_list.Count == 0))
            {
                _his_mid_list.AddRange(_mid_data_list.GetRange(_mid_data_list.Count - (_half_window_size + 2), _half_window_size + 2));
                _his_input_list.AddRange(_input_data_list.GetRange(_input_data_list.Count - (_half_window_size + 2), _half_window_size + 2));
                _mid_data_list.RemoveRange(_mid_data_list.Count - (_half_window_size + 2), _half_window_size + 2);
            }
            else
            {
                FlatInfo _flat_info = _flat_list[_flat_list.Count - 1];
                int      _end_index = _flat_info.StopIndex + 1;

                _his_mid_list.AddRange(_mid_data_list.GetRange(_end_index, _mid_data_list.Count - _end_index));
                _his_input_list.AddRange(_input_data_list.GetRange(_end_index, _input_data_list.Count - _end_index));
                _mid_data_list.RemoveRange(_end_index, _mid_data_list.Count - _end_index);
            }

            //for (int i = _mid_data_list.Count - 1; i >= _mid_data_list.Count - _flat_width; i--)
            //{
            //    if (_mid_data_list[i - 1] == _mid_data_list[i])
            //    {
            //        this._his_mid_list.Clear();
            //        this._his_input_list.Clear();
            //    }
            //    else
            //    {
            //        this._his_mid_list.Clear();
            //        int count = _mid_data_list.Count - i + 1;
            //        this._his_mid_list.AddRange(_mid_data_list.GetRange(i - 1, count));
            //        _mid_data_list.RemoveRange(i - 1, count);

            //        this._his_input_list.Clear();
            //        this._his_input_list.AddRange(_input_data_list.GetRange(i - 1, count));
            //        break;
            //    }
            //}
            return(_mid_data_list.ToArray());
        }