Пример #1
0
        //private TrignoEmgSignal[] Process(double [] rawData)
        //{
        //    int count = Math.Min(_nChannels, rawData.Length);
        //    TrignoEmgSignal[] signals = new TrignoEmgSignal[count];


        //    for (int index = 0; index < count; index++)
        //    {
        //        TrignoEmgSignal signal = new TrignoEmgSignal();

        //        signal.RawSample = rawData[index];
        //        signal.BpfSample = _bandPassFilters[index].filterData(signal.RawSample );
        //        signal.FullWaveSample = FullWaveRectification(signal.BpfSample)[0];

        //        signals[index] = MovingWindowAverageFilter(signal, index);
        //    }

        //    return signals;
        //}

        private TrignoEmgSignal[] Process(double[][] rawData)
        {
            int count = Math.Min(_nChannels, rawData.Length);

            TrignoEmgSignal[] signals = new TrignoEmgSignal[count];


            for (int index = 0; index < count; index++)
            {
                TrignoEmgSignal signal = new TrignoEmgSignal(rawData[index]);

                signal.BpfSample = _bandPassFilters[index].filterData(signal.RawSample);
                FullWaveRectification(signal.BpfSample, signal.FullWaveSample);
                signals[index] = MovingWindowAverageFilter(signal, index);
            }

            return(signals);
        }
Пример #2
0
        private TrignoEmgSignal MovingWindowAverageFilter(TrignoEmgSignal signal, int index)
        {
            bool   activated = false;
            double onOff     = 0;

            for (int i = 0; i < signal.FullWaveSample.Length; i++)
            {
                if (_movingWindowData[index].Count == _movingWindowLength)
                {
                    _movingWindowData[index].RemoveAt(0);
                    _movingWindowData[index].Add(signal.FullWaveSample[i]);
                }
                else
                {
                    _movingWindowData[index].Add(signal.FullWaveSample[i]);
                }

                double currentMean = Mean(_movingWindowData[index]);

                signal.AveragedSample[i] = currentMean;

                if (currentMean > (_baselineMean[index] + (3 * _baselineStdev[index])))
                {
                    onOff = currentMean;
                }
                else
                {
                    onOff = 0;
                }

                signal.OnOff[i]        = onOff;
                activated              = activated || !(onOff == 0);
                signal.RestingMean[i]  = _baselineMean[index];
                signal.RestingStdev[i] = _baselineStdev[index];
            }
            signal.MuscleActivated = activated;

            return(signal);
        }
Пример #3
0
        public void CollectionDataReady(object sender, ComponentDataReadyEventArgs e)
        {
            TransformData[] tData = new TransformData[e.Data.Length];
            foreach (TransformData td in e.Data)
            {
                tData[_sensorToChannel[_guidToSensor[td.Id]]] = td;
            }
            double[][] data = new double[e.Data.Length][];
            //if (tData.Length >= 2 && tData[0].Data.Count == tData[1].Data.Count)
            //{
            //    var channelData = tData[0];
            //    for (int i = 0; i < channelData.Data.Count; i++)
            //    {
            //        for (int j = 0; j < tData.Length; j++)
            //        {
            //            data[j] = tData[j].Data[i];
            //        }
            //        switch (_calibrationState)
            //        {
            //            case CalibrationState.Calibrating:
            //                Train(data);
            //                OnMuscleActivationChanged(new MuscleActivationChangedEventArgs(null));
            //                break;
            //            case CalibrationState.Calibrated:
            //                OnMuscleActivationChanged(new MuscleActivationChangedEventArgs(Process(data)));
            //                break;
            //            default: //CalibrationState.Uncalibrated
            //                for (int c = 0; c < data.Length; c++)
            //                {
            //                    _signals[c] = new TrignoEmgSignal(data[c]);
            //                }
            //                OnMuscleActivationChanged(new MuscleActivationChangedEventArgs(_signals));
            //                break;
            //        }

            //    }
            //}
            if (tData.Length >= 2 && tData[0].Data.Count == tData[1].Data.Count)
            {
                for (int channel = 0; channel < tData.Length; channel++)
                {
                    data[channel] = new double[tData[channel].Data.Count];
                    for (int sample = 0; sample < tData[channel].Data.Count; sample++)
                    {
                        data[channel][sample] = tData[channel].Data[sample];
                    }
                }
                switch (_calibrationState)
                {
                case CalibrationState.Calibrating:
                    Train(data);
                    OnMuscleActivationChanged(new MuscleActivationChangedEventArgs(null));
                    break;

                case CalibrationState.Calibrated:
                    OnMuscleActivationChanged(new MuscleActivationChangedEventArgs(Process(data)));
                    break;

                default:     //CalibrationState.Uncalibrated
                    for (int c = 0; c < data.Length; c++)
                    {
                        _signals[c] = new TrignoEmgSignal(data[c]);
                    }
                    OnMuscleActivationChanged(new MuscleActivationChangedEventArgs(_signals));
                    break;
                }
            }
            else
            {
                Console.Write("E");
            }
        }