예제 #1
0
 def __init__(self, verbose=False):
     config = ConfigProvider().getProcessingConfig()
     self.maxNaNValues = config.get("maxNaNValues")
     self.lowerFreq = config.get("lowerFreq")
     self.upperFreq = config.get("upperFreq")
     self.samplingRate = ConfigProvider().getEmotivConfig().get("samplingRate")
     self.qualUtil = QualityUtil()
     self.sigUtil = SignalUtil()
     self.verbose = verbose
예제 #2
0
class SignalProcessor(object):
    def __init__(self, verbose=False):
        config = ConfigProvider().getProcessingConfig()
        self.maxNaNValues = config.get("maxNaNValues")
        self.lowerFreq = config.get("lowerFreq")
        self.upperFreq = config.get("upperFreq")
        self.samplingRate = ConfigProvider().getEmotivConfig().get("samplingRate")
        self.qualUtil = QualityUtil()
        self.sigUtil = SignalUtil()
        self.verbose = verbose

    def process(self, raw, quality):
        raw = self._replaceBadQuality(raw, quality)
        raw = self._replaceSequences(raw)
        raw = self._replaceOutliners(raw)
        raw = self._normalize(raw)
        invalid = self.qualUtil.isInvalidData(raw)
        return raw, invalid

    def _replaceBadQuality(self, raw, quality):
        if self.verbose:
            print "badQuality: %d" % self.qualUtil.countBadQuality(raw, quality)
        raw = self.qualUtil.replaceBadQuality(raw, quality, NaN)
        self._printNaNCount(raw)
        return raw

    def _replaceSequences(self, raw):
        if self.verbose:
            print "sequences: %d" % self.qualUtil.countSequences(raw)
        raw = self.qualUtil.replaceSequences(raw)
        self._printNaNCount(raw)
        return raw

    def _replaceOutliners(self, raw):
        if self.verbose:
            print "outliners: %d" % self.qualUtil.countOutliners(raw)
        raw = self.qualUtil.replaceOutliners(raw, NaN)
        self._printNaNCount(raw)
        return raw

    def _normalize(self, raw):
        if self.verbose:
            print "normalize: min %.2f max %.2f" % (self.sigUtil.minimum(raw),self.sigUtil.maximum(raw)) 
        raw = self.sigUtil.normalize(raw)
        if self.verbose:
            print "normalize: min %.2f max %.2f" % (self.sigUtil.minimum(raw),self.sigUtil.maximum(raw)) 
        self._printNaNCount(raw)
        return raw

    def _printNaNCount(self, raw):
        if self.verbose:
            print "NaN count: %s" % self.qualUtil.countNans(raw)
예제 #3
0
class FFTProcessor(object):
    def __init__(self, verbose=False):
        self.samplingRate = ConfigProvider().getEmotivConfig().get("samplingRate")
        self.qualUtil = QualityUtil()
        self.fftUtil = FFTUtil()
        self.verbose = verbose

    def process(self, proc):
        fft = self.fftUtil.fft(proc)
        invalid = self.qualUtil.isInvalidData(fft)
        return fft, invalid
예제 #4
0
class EEGProcessor(object):
    def __init__(self, verbose=False):
        self.samplingRate = ConfigProvider().getEmotivConfig().get("samplingRate")
        self.qualUtil = QualityUtil()
        self.eegUtil = EEGUtil()
        self.verbose = verbose

    def process(self, proc):
        alpha = self.eegUtil.getAlphaWaves(proc, self.samplingRate)
        invalid = self.qualUtil.isInvalidData(alpha)
        return alpha, invalid
예제 #5
0
 def __init__(self, verbose=False):
     self.samplingRate = ConfigProvider().getEmotivConfig().get("samplingRate")
     self.qualUtil = QualityUtil()
     self.fftUtil = FFTUtil()
     self.verbose = verbose
예제 #6
0
 def setUp(self):
     self.util = QualityUtil()
예제 #7
0
class TestQualityUtil(unittest.TestCase):

    def setUp(self):
        self.util = QualityUtil()

    def test_replaceOutliners_withNaN(self):
        value = np.NaN
        testList = np.array([-10.0, -4, -3, -2, 0, 4, 5, 6, 10])
        self.assertEqual(countOcc(testList, value), 0)
        procList = self.util.replaceOutliners(testList, value, -3, 5)
        self.assertEqual(np.count_nonzero(np.isnan(procList)), 4)

    def test_replaceOutliners_withValue(self):
        value = -99
        testList = np.array([-10, -4, -3, -2, 0, 4, 5, 6, 10])
        self.assertEqual(countOcc(testList, value), 0)
        procList = self.util.replaceOutliners(testList, value, -3, 5)
        self.assertEqual(countOcc(procList, value), 4)

    def test_replaceOutliners_withoutValue(self):
        testList = np.array([-10, -4, -3, -2, 0, 4, 5, 6, 10])
        self.assertEqual(countOcc(testList, -3), 1)
        self.assertEqual(countOcc(testList, 5), 1)
        
        procList = self.util.replaceOutliners(testList, None, -3, 5)

        self.assertEqual(countOcc(procList, -3), 3)
        self.assertEqual(countOcc(procList, 5), 3)

    def test_isInvalidData(self):
        maxNaNValues = self.util.maxNaNValues
        for length in range(maxNaNValues+1):
            testList = self._getNaNList(length)
            self.assertFalse(self.util.isInvalidData(testList))

        for length in range(maxNaNValues+1, maxNaNValues + 4):
            testList = self._getNaNList(length)
            self.assertTrue(self.util.isInvalidData(testList))

    def _getNaNList(self, length):
        return np.array([np.NaN]*length)

    def test_countOutliners(self):
        testList = np.array([-10.0, -4, -3, -2, 0, 4, 5, 6, 10])
        self.assertEqual(self.util.countOutliners(testList, -3, 5), 4)

    def test_countOutliners_defaultThreshold(self):
        lb = self.util.lowerBound
        ub = self.util.upperBound
        testList = np.array([lb-1, lb, lb+1, -2, 0, 4, ub-1, ub, ub+1])
        self.assertEqual(self.util.countOutliners(testList), 2)

    def test_countOutliners_noOccurence(self):
        testList = np.array([-10.0, -4, -3, -2, 0, 4, 5, 6, 10])
        self.assertEqual(self.util.countOutliners(testList, -11, 11), 0)

    def test_replaceBadQuality(self):
        value = 99
        testList = np.array([-10, -4, -3, -2, 0, 2, 4, 5, 6, 10])
        qualList = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
        
        procList = self.util.replaceBadQuality(testList, qualList, value, 4)
        self.assertEqual(len(qualList), len(procList))
        self.assertEqual(countOcc(procList, value), 4)

    def test_replaceBadQuality_withNaN(self):
        value = np.NaN
        testList = np.array([-10.0, -4, -3, -2, 0, 2, 4, 5, 6, 10])
        qualList = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
        
        procList = self.util.replaceBadQuality(testList, qualList, value, 4)
        self.assertEqual(len(qualList), len(procList))
        self.assertEqual(np.count_nonzero(np.isnan(procList)), 4)

    def test_replaceBadQuality_differentLengthError(self):
        value = np.NaN
        testList = np.array([-10.0, -4, -3, -2, 0, 2, 4, 5, 6, 10])
        qualList = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
        
        with self.assertRaises(ValueError):
            _ = self.util.replaceBadQuality(testList, qualList, value, 4)

    def test_countBadQuality(self):
        testList = np.array([-10.0, -4, -3, -2, 0, 2, 4, 5, 6, 10])
        qualList = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
        
        count = self.util.countBadQuality(testList, qualList, 4)
        self.assertEqual(len(qualList), len(testList))
        self.assertEqual(count, 4)

    def test_countBadQuality_defaultThreshold(self):
        testList = np.array([-10.0, -4, -3, -2, 0, 2, 4, 5, 6, 10])
        minQuality = self.util.minQuality
        qualList = np.array([0, minQuality-1, minQuality, minQuality+1, 15, 15, 15, 15, 15, 15])
        
        count = self.util.countBadQuality(testList, qualList)
        self.assertEqual(len(qualList), len(testList))
        self.assertEqual(count, 1)

    def test_zeros(self):
        countZeros = self.util.countZeros(TEST_DATA_ZERO)
        self.assertEqual(countZeros, 10)
        self.assertNotEqual(countZeros, len(TEST_DATA_ZERO))
    
    def test_nans(self):
        countNans = self.util.countNans(TEST_DATA_NAN)
        self.assertEqual(countNans, 4)
        self.assertEqual(countNans, len(TEST_DATA_NAN))

    def test_nans_mixed(self):
        countNans = self.util.countNans(TEST_DATA_MIXED)
        self.assertEqual(countNans, 2)
        self.assertNotEqual(countNans, len(TEST_DATA_MIXED))

    #TODO make this flexible to maxSeqLegth change
    @unittest.skip("fix leading zero is replaced")
    def test_replaceZeroSequences(self):
        zeros = np.array([0.0, -5.0, 0.0, 0, 2.0, 0.0, 0.0, 0.0, 3.5, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, 1.0, 1.0, 0, 0, 0, 0, 0, 0])
        l = self.util.replaceZeroSequences(zeros)
        self.assertNotEquals(self.util.countZeros(zeros), self.util.countZeros(l))
        self.assertEquals(self.util.countZeros(l), 6)
        self.assertEquals(self.util.countNans(l), 16)

    #TODO make this flexible to maxSeqLegth change
    def test_replaceAnySequences(self):
        zeros = np.array([0, 0.0, 0.0, 0, 0, 2.0, 0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0])
        l = self.util.replaceSequences(zeros)
        self.assertNotEquals(self.util.countZeros(zeros), self.util.countZeros(l))
        self.assertEquals(self.util.countZeros(l), 1)
        self.assertEquals(self.util.countNans(l), 10)

    def test_countAnySequences(self):
        a = np.array([0, 0.0, 0.0, 0, 2.0, 0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0])
        l = self.util.countSequences(a)
        self.assertEquals(l, 1)