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
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()
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()
def test_is_power_of_2_wrong_argument_type(): is_power_of_2("abc")
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
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
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