private ChannelData[] Filter50Hz(ChannelData[] signal) { // 50Hz Filter based on http://blog.myzeo.com/zeo-raw-data-library-free-your-mind/ // Convolution math based on http://www.phys.uu.nl/~haque/computing/WPark_recipes_in_python.html float[] filter = { 0.0032f, 0.0063f, -0.0088f, -0.0000f, 0.0100f, -0.0082f, -0.0047f, 0.0132f, -0.0054f, -0.0108f, 0.0151f, 0.0000f, -0.0177f, 0.0147f, 0.0087f, -0.0248f, 0.0105f, 0.0215f, -0.0315f, -0.0000f, 0.0411f, -0.0369f, -0.0241f, 0.0790f, -0.0404f, -0.1123f, 0.2939f, 0.6250f, 0.2939f, -0.1123f, -0.0404f, 0.0790f, -0.0241f, -0.0369f, 0.0411f, -0.0000f, -0.0315f, 0.0215f, 0.0105f, -0.0248f, 0.0087f, 0.0147f, -0.0177f, 0.0000f, 0.0151f, -0.0108f, -0.0054f, 0.0132f, -0.0047f, -0.0082f, 0.0100f }; int filterLen = filter.Length; int len = signal.Length; int n = len + filterLen - 1; ChannelData[] filteredSignal = new ChannelData[n]; for (int i = 0; i < n; i++) { float t = 0; int lower = Math.Max(0, i - (filterLen - 1)); int upper = Math.Min(len - 1, i); for (int j = lower; j <= upper; j++) { t = t + (signal[j].Values[0] * filter[i - j]); } filteredSignal[i] = new ChannelData(1); filteredSignal[i].Values[0] = t; } return(filteredSignal); }
public ChannelData[] ReadEegFromLastPosition(ref int lastPosition, int len) { this.rwLock.AcquireReaderLock(Timeout.Infinite); ChannelData[] eegValues = new ChannelData[len]; for (int i = 0; i < len; i++) { eegValues[i] = new ChannelData(1); } int count = (len / ZeoMessage.SamplesPerMessage) + 1; for (int i = lastPosition, j = 0; i < (lastPosition + count) && i < this.zeoMessages.Count; i++) { ZeoMessage zeoMessage = this.zeoMessages[i]; for (int k = 0; j < len && k < ZeoMessage.SamplesPerMessage; j++, k++) { if (zeoMessage.Waveform != null) { eegValues[j].Values[0] = zeoMessage.Waveform[k]; } else { eegValues[j].Values[0] = 0; } } } if (this.LiveStream) { lastPosition = ((this.Length * ZeoMessage.SamplesPerMessage) - len) / ZeoMessage.SamplesPerMessage; if (lastPosition < 0) { lastPosition = 0; } } ChannelData[] filteredValues = this.Filter50Hz(eegValues); for (int i = 0; i < len; i++) { eegValues[i] = filteredValues[i]; } this.rwLock.ReleaseLock(); return(eegValues); }
public ChannelData[] ReadFrequencyDataFromLastPosition(ref int lastPosition, int len) { this.rwLock.AcquireReaderLock(Timeout.Infinite); ChannelData[] freqData = new ChannelData[len]; for (int i = lastPosition, j = 0; i < (lastPosition + len) && i < this.zeoMessages.Count; i++, j++) { ZeoMessage zeoMessage = this.zeoMessages[i]; freqData[j] = new ChannelData(ZeoMessage.FrequencyBinsLength + 2); if (zeoMessage.FrequencyBins != null) { int k = 0; for (k = 0; k < zeoMessage.FrequencyBins.Length; k++) { freqData[j].Values[k] = zeoMessage.FrequencyBins[k]; } freqData[j].Values[k] = zeoMessage.Impedance ?? 0; } else { freqData[j].Values[freqData[j].Values.Length - 2] = zeoMessage.Impedance ?? 0; } freqData[j].Values[freqData[j].Values.Length - 1] = zeoMessage.SoundAlarmVolume; } if (this.LiveStream) { lastPosition = this.Length - len; if (lastPosition < 0) { lastPosition = 0; } } this.rwLock.ReleaseLock(); return(freqData); }
public ChannelData[] ReadStageDataFromLastPosition(ref int lastPosition, int len) { this.rwLock.AcquireReaderLock(Timeout.Infinite); ChannelData[] stageData = new ChannelData[len]; for (int i = lastPosition, j = 0; j < len && i < this.zeoMessages.Count; i++) { ZeoMessage zeoMessage = this.zeoMessages[i]; stageData[j] = new ChannelData(2); if (zeoMessage.SleepStage != null) { stageData[j].Values[0] = -(int)zeoMessage.SleepStage; stageData[j].Values[1] = zeoMessage.SoundAlarmVolume; j++; } } for (int i = 0; i < len; i++) { if (stageData[i] == null) { stageData[i] = new ChannelData(2); stageData[i].Values[0] = -5; stageData[i].Values[1] = ZeoMessage.MinSoundVolume; } else if (stageData[i].Values[0] == 0) { stageData[i].Values[0] = -5; stageData[i].Values[1] = ZeoMessage.MinSoundVolume; } } this.rwLock.ReleaseLock(); return(stageData); }
private ChannelData[] Filter50Hz(ChannelData[] signal) { // 50Hz Filter based on http://blog.myzeo.com/zeo-raw-data-library-free-your-mind/ // Convolution math based on http://www.phys.uu.nl/~haque/computing/WPark_recipes_in_python.html float[] filter = { 0.0032f, 0.0063f, -0.0088f, -0.0000f, 0.0100f, -0.0082f, -0.0047f, 0.0132f, -0.0054f, -0.0108f, 0.0151f, 0.0000f, -0.0177f, 0.0147f, 0.0087f, -0.0248f, 0.0105f, 0.0215f, -0.0315f, -0.0000f, 0.0411f, -0.0369f, -0.0241f, 0.0790f, -0.0404f, -0.1123f, 0.2939f, 0.6250f, 0.2939f, -0.1123f, -0.0404f, 0.0790f, -0.0241f, -0.0369f, 0.0411f, -0.0000f, -0.0315f, 0.0215f, 0.0105f, -0.0248f, 0.0087f, 0.0147f, -0.0177f, 0.0000f, 0.0151f, -0.0108f, -0.0054f, 0.0132f, -0.0047f, -0.0082f, 0.0100f }; int filterLen = filter.Length; int len = signal.Length; int n = len + filterLen - 1; ChannelData[] filteredSignal = new ChannelData[n]; for (int i = 0; i < n; i++) { float t = 0; int lower = Math.Max(0, i - (filterLen - 1)); int upper = Math.Min(len - 1, i); for (int j = lower; j <= upper; j++) { t = t + (signal[j].Values[0] * filter[i - j]); } filteredSignal[i] = new ChannelData(1); filteredSignal[i].Values[0] = t; } return filteredSignal; }
public ChannelData[] ReadStageDataFromLastPosition(ref int lastPosition, int len) { this.rwLock.AcquireReaderLock(Timeout.Infinite); ChannelData[] stageData = new ChannelData[len]; for (int i = lastPosition, j = 0; j < len && i < this.zeoMessages.Count; i++) { ZeoMessage zeoMessage = this.zeoMessages[i]; stageData[j] = new ChannelData(2); if (zeoMessage.SleepStage != null) { stageData[j].Values[0] = -(int)zeoMessage.SleepStage; stageData[j].Values[1] = zeoMessage.SoundAlarmVolume; j++; } } for (int i = 0; i < len; i++) { if (stageData[i] == null) { stageData[i] = new ChannelData(2); stageData[i].Values[0] = -5; stageData[i].Values[1] = ZeoMessage.MinSoundVolume; } else if (stageData[i].Values[0] == 0) { stageData[i].Values[0] = -5; stageData[i].Values[1] = ZeoMessage.MinSoundVolume; } } this.rwLock.ReleaseLock(); return stageData; }
public ChannelData[] ReadFrequencyDataFromLastPosition(ref int lastPosition, int len) { this.rwLock.AcquireReaderLock(Timeout.Infinite); ChannelData[] freqData = new ChannelData[len]; for (int i = lastPosition, j = 0; i < (lastPosition + len) && i < this.zeoMessages.Count; i++, j++) { ZeoMessage zeoMessage = this.zeoMessages[i]; freqData[j] = new ChannelData(ZeoMessage.FrequencyBinsLength + 2); if (zeoMessage.FrequencyBins != null) { int k = 0; for (k = 0; k < zeoMessage.FrequencyBins.Length; k++) { freqData[j].Values[k] = zeoMessage.FrequencyBins[k]; } freqData[j].Values[k] = zeoMessage.Impedance ?? 0; } else { freqData[j].Values[freqData[j].Values.Length - 2] = zeoMessage.Impedance ?? 0; } freqData[j].Values[freqData[j].Values.Length - 1] = zeoMessage.SoundAlarmVolume; } if (this.LiveStream) { lastPosition = this.Length - len; if (lastPosition < 0) { lastPosition = 0; } } this.rwLock.ReleaseLock(); return freqData; }
public ChannelData[] ReadEegFromLastPosition(ref int lastPosition, int len) { this.rwLock.AcquireReaderLock(Timeout.Infinite); ChannelData[] eegValues = new ChannelData[len]; for (int i = 0; i < len; i++) { eegValues[i] = new ChannelData(1); } int count = (len / ZeoMessage.SamplesPerMessage) + 1; for (int i = lastPosition, j = 0; i < (lastPosition + count) && i < this.zeoMessages.Count; i++) { ZeoMessage zeoMessage = this.zeoMessages[i]; for (int k = 0; j < len && k < ZeoMessage.SamplesPerMessage; j++, k++) { if (zeoMessage.Waveform != null) { eegValues[j].Values[0] = zeoMessage.Waveform[k]; } else { eegValues[j].Values[0] = 0; } } } if (this.LiveStream) { lastPosition = ((this.Length * ZeoMessage.SamplesPerMessage) - len) / ZeoMessage.SamplesPerMessage; if (lastPosition < 0) { lastPosition = 0; } } ChannelData[] filteredValues = this.Filter50Hz(eegValues); for (int i = 0; i < len; i++) { eegValues[i] = filteredValues[i]; } this.rwLock.ReleaseLock(); return eegValues; }