Beispiel #1
0
def test_is_power_of_2():
    for x, is_pow_2 in [
            (0,True),
            (1,True),
            (2,True),
            (3,False),
            (4,True),
            (256, True),
            (8., True),
            (-2, True),
            (-3,False),
            ("2",False)]:
        yield lambda x,y: is_power_of_2(x) == y, x, is_pow_2
Beispiel #2
0
 def calculate_wt_power(self,data):
     """For given EEG-data, calculate baseline-corrected Wavelet-power"""
     #Checks
     data_len = dataset.samples_original.shape[1]
     if not is_power_of_2(data_len*2/3):
         raise ValueError("length of data must be 1.5 x a power of 2")
     # Shorthands 
     nwtt = self._num_wts_to_take
     # Calculate
     rv = np.zeros((data.shape),"d")
     for i_s in range(data.shape[0]):
         for i_ch in range(data.shape[2]):
             #TODO: Noch nicht implementiert
             rv[i_s,:,i_ch] = wt_power()
Beispiel #3
0
 def calculate_wt_power(self, data):
     """For given EEG-data, calculate baseline-corrected Wavelet-power"""
     #Checks
     data_len = dataset.samples_original.shape[1]
     if not is_power_of_2(data_len * 2 / 3):
         raise ValueError("length of data must be 1.5 x a power of 2")
     # Shorthands
     nwtt = self._num_wts_to_take
     # Calculate
     rv = np.zeros((data.shape), "d")
     for i_s in range(data.shape[0]):
         for i_ch in range(data.shape[2]):
             #TODO: Noch nicht implementiert
             rv[i_s, :, i_ch] = wt_power()
Beispiel #4
0
def test_is_power_of_2_wrong_argument_type():
    is_power_of_2("abc")
Beispiel #5
0
def wavepower_lin(x,wavelet,mode="per",level=None,return_sl=False,normalise=True,norm_fraction=None,as_dB=True): 
    """Performs a wavelet-decomposition using pywt.wavedec, but returns the power
    as one 1d-array.
    Uses different default-values for mode and level.

    If normalise==False, len(x) must be a power of two.

    If normalise==True, len(x)*2/3  must be a power of two.
    In this case two Wavelet-transforms are performed, one from 0 to 2/3 
    and one from 1/3 to 1. The center-value of the first wt-power is then used
    for normalization of the second wt-power. The normalization is performed for each 
    scale separately.

    norm_fraction: Not used anymore!
    
    If as_dB, convert normalised power to dB. Ignored if normalise=False
    """       
    assert len(x.shape) in [1,2], "Only 1d and 2d-arrays supported up to now!"
    if normalise:
        assert is_power_of_2(len(x)*2/3), "len(x)*2/3 must be a power of 2"
        if level == None:
            level = int(round(n.log2(x.shape[0]*2/3)))
    else:
        assert is_power_of_2(len(x)), "len(x) must be a power of 2"
        if level == None:
            level = int(round(n.log2(x.shape[0])))
    lx = x.shape[0]
    if len(x.shape) == 1:
        if normalise:
            wts_bl = wavedec(x[:lx*2/3],wavelet,mode=mode,level=level)
            wts = wavedec(x[lx/3:],wavelet,mode=mode,level=level)
        else:
            wts = wavedec(x[:],wavelet,mode=mode,level=level)
        sc_lengths = [len(x) for x in wts]
        rv = n.zeros((sum(sc_lengths)),"d")
        for j in range(len(wts)):
            wts_power = wts[j]**2
            if normalise:
                wts_power /= (wts_bl[j][len(wts_bl[j])/2])**2
                if as_dB:
                    wts_power[:] = 10 * n.log(wts_power)
            offset = sum(sc_lengths[:j])
            rv[offset:offset+sc_lengths[j]]=wts_power[:]
    else: #len(x.shape)==2
        # create array of return-values
        if normalise:
            wts = wavedec(x[lx/3:,0],wavelet,mode=mode,level=level)
        else:
            wts = wavedec(x[:,0],wavelet,mode=mode,level=level)
        sc_lengths = [len(i) for i in wts]
        rv = n.zeros((sum(sc_lengths),x.shape[1]),"d")
        #iterate over dim1
        for i in range(x.shape[1]):
            if i>0:
                # for ch0, wts was already calculated
                if normalise:
                    wts = wavedec(x[lx/3:,i],wavelet,mode=mode,level=level)
                else:
                    wts = wavedec(x[:,i],wavelet,mode=mode,level=level)
            for j in range(len(wts)):
                wts_power = wts[j]**2
                if normalise:
                    wts_bl = wavedec(x[:lx*2/3,i],wavelet,mode=mode,level=level)
                    wts_power /= (wts_bl[j][len(wts_bl[j])/2])**2
                    if as_dB:
                        wts_power[:] = 10 * n.log(wts_power)
                offset = sum(sc_lengths[:j])
                rv[offset:offset+sc_lengths[j],i]=wts_power[:]
    if return_sl:
        return rv, sc_lengths
    else:
        return rv
Beispiel #6
0
def test_is_power_of_2_wrong_argument_type():
    is_power_of_2("abc")
Beispiel #7
0
def test_is_power_of_2():
    for x, is_pow_2 in [(0, True), (1, True), (2, True), (3, False), (4, True),
                        (256, True), (8., True), (-2, True), (-3, False),
                        ("2", False)]:
        yield lambda x, y: is_power_of_2(x) == y, x, is_pow_2
Beispiel #8
0
def wavepower_lin(x,
                  wavelet,
                  mode="per",
                  level=None,
                  return_sl=False,
                  normalise=True,
                  norm_fraction=None,
                  as_dB=True):
    """Performs a wavelet-decomposition using pywt.wavedec, but returns the power
    as one 1d-array.
    Uses different default-values for mode and level.

    If normalise==False, len(x) must be a power of two.

    If normalise==True, len(x)*2/3  must be a power of two.
    In this case two Wavelet-transforms are performed, one from 0 to 2/3 
    and one from 1/3 to 1. The center-value of the first wt-power is then used
    for normalization of the second wt-power. The normalization is performed for each 
    scale separately.

    norm_fraction: Not used anymore!
    
    If as_dB, convert normalised power to dB. Ignored if normalise=False
    """
    assert len(x.shape) in [1, 2], "Only 1d and 2d-arrays supported up to now!"
    if normalise:
        assert is_power_of_2(len(x) * 2 / 3), "len(x)*2/3 must be a power of 2"
        if level == None:
            level = int(round(n.log2(x.shape[0] * 2 / 3)))
    else:
        assert is_power_of_2(len(x)), "len(x) must be a power of 2"
        if level == None:
            level = int(round(n.log2(x.shape[0])))
    lx = x.shape[0]
    if len(x.shape) == 1:
        if normalise:
            wts_bl = wavedec(x[:lx * 2 / 3], wavelet, mode=mode, level=level)
            wts = wavedec(x[lx / 3:], wavelet, mode=mode, level=level)
        else:
            wts = wavedec(x[:], wavelet, mode=mode, level=level)
        sc_lengths = [len(x) for x in wts]
        rv = n.zeros((sum(sc_lengths)), "d")
        for j in range(len(wts)):
            wts_power = wts[j]**2
            if normalise:
                wts_power /= (wts_bl[j][len(wts_bl[j]) / 2])**2
                if as_dB:
                    wts_power[:] = 10 * n.log(wts_power)
            offset = sum(sc_lengths[:j])
            rv[offset:offset + sc_lengths[j]] = wts_power[:]
    else:  #len(x.shape)==2
        # create array of return-values
        if normalise:
            wts = wavedec(x[lx / 3:, 0], wavelet, mode=mode, level=level)
        else:
            wts = wavedec(x[:, 0], wavelet, mode=mode, level=level)
        sc_lengths = [len(i) for i in wts]
        rv = n.zeros((sum(sc_lengths), x.shape[1]), "d")
        #iterate over dim1
        for i in range(x.shape[1]):
            if i > 0:
                # for ch0, wts was already calculated
                if normalise:
                    wts = wavedec(x[lx / 3:, i],
                                  wavelet,
                                  mode=mode,
                                  level=level)
                else:
                    wts = wavedec(x[:, i], wavelet, mode=mode, level=level)
            for j in range(len(wts)):
                wts_power = wts[j]**2
                if normalise:
                    wts_bl = wavedec(x[:lx * 2 / 3, i],
                                     wavelet,
                                     mode=mode,
                                     level=level)
                    wts_power /= (wts_bl[j][len(wts_bl[j]) / 2])**2
                    if as_dB:
                        wts_power[:] = 10 * n.log(wts_power)
                offset = sum(sc_lengths[:j])
                rv[offset:offset + sc_lengths[j], i] = wts_power[:]
    if return_sl:
        return rv, sc_lengths
    else:
        return rv