//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); }
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); }
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"); } }