Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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;
        }
Пример #6
0
        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;
        }
Пример #7
0
        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;
        }
Пример #8
0
        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;
        }