Beispiel #1
0
 def setUp(self):
     self.chain = SignalProcessor()
     self.qualUtil = QualityUtil()
     config = ConfigProvider().getProcessingConfig()
     self.upperBound = config.get("upperBound")
     self.lowerBound = config.get("lowerBound")
     self.minQuality = config.get("minQual")
     self.maxNaNValues = config.get("maxNaNValues")
class ProcessedSignalPlotter(RawSignalPlotter):
    def __init__(self, person, eegData, signals, filePath, save=True, plot=True, logScale=False):
        RawSignalPlotter.__init__(self, person, eegData, signals, filePath, save, plot, logScale, name="processed")
        self.chain = SignalProcessor()

    def _getData(self, signal):
        raw = self.eegData.getColumn(signal)
        qual = self.eegData.getQuality(signal)
        raw, _ = self.chain.process(raw, qual)
        return raw
class DeltaSignalPlotter(RawSignalPlotter):
    def __init__(self, person, eegData, signals, filePath, save=True, plot=True, logScale=False):
        RawSignalPlotter.__init__(self, person, eegData, signals, filePath, save, plot, logScale, name="delta")
        self.chain = SignalProcessor()
        self.eegUtil = EEGUtil()

    def _getData(self, signal):
        raw = self.eegData.getColumn(signal)
        qual = self.eegData.getQuality(signal)
        samplingRate = self.eegData.getSamplingRate()

        proc, _ = self.chain.process(raw, qual)
        proc = QualityUtil().replaceNans(proc)
        return self.eegUtil.getDeltaWaves(proc, samplingRate)
Beispiel #4
0
    def __init__(self, inputQueue, outputQueue):
        config = ConfigProvider()
        self.eegFields = config.getEmotivConfig()["eegFields"]
        self.gyroFields = config.getEmotivConfig()["gyroFields"]
        self.samplingRate = config.getEmotivConfig()["samplingRate"]
        
        self.processingConfig = config.getProcessingConfig()
        self.preProcessor = SignalPreProcessor()
        self.signalProcessor = SignalProcessor()
        self.fftProcessor = FFTProcessor()

        self.inputQueue = inputQueue
        self.outputQueue = outputQueue
        self.runProcess = True
        self.totalInvalid = 0
        self.totalCount = 0
Beispiel #5
0
class DataProcessor(object):
    
    def __init__(self, inputQueue, outputQueue):
        config = ConfigProvider()
        self.eegFields = config.getEmotivConfig()["eegFields"]
        self.gyroFields = config.getEmotivConfig()["gyroFields"]
        self.samplingRate = config.getEmotivConfig()["samplingRate"]
        
        self.processingConfig = config.getProcessingConfig()
        self.preProcessor = SignalPreProcessor()
        self.signalProcessor = SignalProcessor()
        self.fftProcessor = FFTProcessor()

        self.inputQueue = inputQueue
        self.outputQueue = outputQueue
        self.runProcess = True
        self.totalInvalid = 0
        self.totalCount = 0

    def close(self):
        self.runProcess = False

    def processData(self):
        while self.runProcess:
            try:
                data = self.inputQueue.get(timeout=1)
                procData, procInvalid = self.process(data)
                if not procInvalid:
                    self.outputQueue.put(procData)
            except Empty:
                pass

    def process(self, data):
        #TODO make me fast and nice
        eegRaw, gyroRaw = self.splitData(data)
        eegProc, eegInvalid = self.processEEGData(eegRaw)
        gyroProc, gyroIvalid = self.processGyroData(gyroRaw)
        eegProc.update(gyroProc)
        return eegProc, (eegInvalid or gyroIvalid)

    def splitData(self, data):
        '''split eeg and gyro data
        
        :param data: all values as dict
        
        :return: 
            eegData: eeg values as dict
            gyroData: gyro values as dict
        '''
        #TODO handle data except eeg and gyro?
        eegData = {x: data[x] for x in data if x in self.eegFields}
        gyroData = {x: data[x] for x in data if x in self.gyroFields}
        return eegData, gyroData

    def processEEGData(self, eegData):

        invalidCount = 0
        for _, signal in eegData.iteritems():
            raw = array(signal["value"])
            quality = array(signal["quality"])

            proc = self.preProcessor.process(raw)
            proc, _ = self.signalProcessor.process(proc, quality)

            chan, fInvalid = self.fftProcessor.process(proc)
            signal["theta"] = chan["theta"]
            invalidCount += sum([fInvalid])
        if invalidCount > 0:
            self.totalInvalid += 1
        self.totalCount += 1
        return eegData, (invalidCount > 0)

    def processGyroData(self, gyroData):
        return gyroData, False
Beispiel #6
0
class TestSimpleChain(unittest.TestCase):

    def setUp(self):
        self.chain = SignalProcessor()
        self.qualUtil = QualityUtil()
        config = ConfigProvider().getProcessingConfig()
        self.upperBound = config.get("upperBound")
        self.lowerBound = config.get("lowerBound")
        self.minQuality = config.get("minQual")
        self.maxNaNValues = config.get("maxNaNValues")

    def _checkValidData(self, data, invalid):
        self.assertEqual(invalid, self.maxNaNValues < count_nonzero(isnan(data)))

    def test_process_sunshine(self):
        data = [-2.0, -1.0, 0, 1.0, 2.0]
        qual = [15, 15, 15, 15, 15]

        proc, invalidData = self.chain.process(data, qual)
        self._checkValidData(proc, invalidData)
        assert_allclose(proc, [-1.0, -0.5, 0, 0.5, 1])

    def test_process_badQuality(self):
        data = [-2.0, -1.0, 0, 1.0, 2.0]
        qual = [15, 0, self.minQuality-1, self.minQuality, self.minQuality+1]

        proc, invalidData = self.chain.process(data, qual)
        self._checkValidData(proc, invalidData)
        assert_allclose(proc, [-1.0, NaN, NaN, 0.5, 1])

    def test_process_replaceSequences(self):
        data = [1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 4.0]
        qual = [15, 15,15, 15, 15, 15, 15]

        proc, invalidData = self.chain.process(data, qual)
        self._checkValidData(proc, invalidData)
        assert_allclose(proc, [NaN, NaN, NaN, NaN, NaN, 0.5, 1.0])

    def test_process_replaceOutliners(self):
        data = [-5000, self.lowerBound-1, self.lowerBound, self.lowerBound+1, self.upperBound-1, self.upperBound, self.upperBound+1, 5000]
        qual = [15, 15, 15, 15, 15, 15, 15, 15]

        proc, invalidData = self.chain.process(data, qual)
        self._checkValidData(proc, invalidData)
        self.assertEquals(count_nonzero(isnan(proc)), 4)

    def test_process_allTogether(self):
        data = [3.0, 1.0, 1.0, 1.0, 1.0, 1.0, self.lowerBound-1, self.upperBound+1, -8, -4.0, 2.0, 4.0]
        cp = copy(data[:])
        qual = [self.minQuality-1, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15]

        proc, invalidData = self.chain.process(data, qual)
        self._checkValidData(proc, invalidData)
        #make sure we work on copies only
        assert_allclose(cp, data)
        assert_allclose(proc, [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, -1.0, -0.5, 0.25, 0.5])

    def test_checkValid(self):
        maxNaNValues = self.maxNaNValues
        for length in range(0, maxNaNValues+1):
            data = self._getNaNList(length)
            qual = [15]*length
            _, invalidData = self.chain.process(data, qual)
            self.assertFalse(invalidData, "length %d" % length)
        
        for length in range(maxNaNValues+1, maxNaNValues+5):
            data = self._getNaNList(length)
            qual = [15]*length
            _, invalidData = self.chain.process(data, qual)
            self.assertTrue(invalidData, "length %d" % length)

    def _getNaNList(self, length):
        return array([NaN]*length)
 def __init__(self, person, eegData, signals, filePath, save=True, plot=True, logScale=False):
     RawSignalPlotter.__init__(self, person, eegData, signals, filePath, save, plot, logScale, name="processed")
     self.chain = SignalProcessor()