def merge(signal1, *signalObjects): """Gather all channels of the signalObjs given as input arguments into a single SignalObj.""" j = 1 freqMin = cp.deepcopy(signal1.freqMin) freqMax = cp.deepcopy(signal1.freqMax) comment = cp.deepcopy(signal1.comment) channels = cp.deepcopy(signal1.channels) timeSignal = cp.deepcopy(signal1.timeSignal) for inObj in signalObjects: if signal1.samplingRate != inObj.samplingRate: message = '\ \n To merge signals they must have the same sampling rate!\ \n SignalObj 1 and ' + str(j + 1) + ' have different sampling rates.' raise AttributeError(message) if signal1.numSamples != inObj.numSamples: message = '\ \n To merge signals they must have the same length!\ \n SignalObj 1 and ' + str(j + 1) + ' have different lengths.' raise AttributeError(message) comment = comment + ' / ' + inObj.comment for ch in inObj.channels._channels: channels.append(ch) timeSignal = np.hstack((timeSignal, inObj.timeSignal)) j += 1 newSignal = SignalObj(timeSignal, domain='time', samplingRate=signal1.samplingRate, freqMin=freqMin, freqMax=freqMax, comment=comment) channels.conform_to() newSignal.channels = channels return newSignal
def __parse_load(className): name = className.split('.')[0] jsonFile = open(className, 'r') openJson = json.load(jsonFile) if name == 'SignalObj': openMat = sio.loadmat(openJson['timeSignalAddress']) out = SignalObj(openMat['timeSignal'], domain=openJson['lengthDomain'], samplingRate=openJson['samplingRate'], freqMin=openJson['freqLims'][0], freqMax=openJson['freqLims'][1], comment=openJson['comment']) out.channels = __parse_channels(openJson['channels'], out.channels) os.remove(openJson['timeSignalAddress']) elif name == 'ImpulsiveResponse': ir = pytta_load(openJson['SignalAddress']['ir']) out = ImpulsiveResponse(ir=ir, **openJson['methodInfo']) os.remove(openJson['SignalAddress']['ir']) elif name == 'RecMeasure': inch = list(np.arange(len(openJson['inChannels']))) out = RecMeasure(device=openJson['device'], inChannels=inch, lengthDomain='samples', fftDegree=openJson['fftDegree']) out.inChannels = __parse_channels(openJson['inChannels'], out.inChannels) elif name == 'PlayRecMeasure': inch = list(1 + np.arange(len(openJson['inChannels']))) excit = pytta_load(openJson['excitationAddress']) out = PlayRecMeasure(excitation=excit, device=openJson['device'], inChannels=inch) out.inChannels = __parse_channels(openJson['inChannels'], out.inChannels) os.remove(openJson['excitationAddress']) elif name == 'FRFMeasure': inch = list(1 + np.arange(len(openJson['inChannels']))) excit = pytta_load(openJson['excitationAddress']) out = FRFMeasure(excitation=excit, device=openJson['device'], inChannels=inch) out.inChannels = __parse_channels(openJson['inChannels'], out.inChannels) os.remove(openJson['excitationAddress']) elif name == 'Meta': out = [] for val in openJson.values(): out.append(pytta_load(val)) os.remove(val) os.remove(className) jsonFile.close() return out
def filter(self, sigobj): """ Filter the signal object. For each channel inside the input signalObj, will be generated a new SignalObj with the channel filtered signal. Args: sigobj: SignalObj Return: output: List A list containing one SignalObj with the filtered data for each channel in the original signalObj. """ if self.samplingRate != sigobj.samplingRate: raise ValueError( "SignalObj must have same sampling rate of filter to be filtered." ) n = self.sos.shape[2] output = [] chl = [] for ch in range(sigobj.numChannels): sobj = sigobj[ch] filtered = np.zeros((sobj.numSamples, n)) for k in range(n): cContigousArray = sobj.timeSignal[:].copy(order='C') filtered[:, k] = ss.sosfilt(self.sos[:, :, k].copy(order='C'), cContigousArray, axis=0).T chl.append(copy(sobj.channels[sobj.channels.mapping[0]])) chl[-1].num = k + 1 chl[-1].name = f'Band {k+1}' chl[-1].code = f'B{k+1}' signalDict = { 'signalArray': filtered, 'domain': 'time', 'samplingRate': self.samplingRate, 'freqMin': sigobj.freqMin, 'freqMax': sigobj.freqMax, } out = SignalObj(**signalDict) out.channels = ChannelsList(chl) # out.timeSignal = out.timeSignal * out.channels.CFlist() output.append(out) chl.clear() return output
def __h5_unpack(objH5Group): """ Unpack an HDF5 group into its respective PyTTa object """ if objH5Group.attrs['class'] == 'SignalObj': # PyTTaObj attrs unpacking samplingRate = objH5Group.attrs['samplingRate'] freqMin = _h5.none_parser(objH5Group.attrs['freqMin']) freqMax = _h5.none_parser(objH5Group.attrs['freqMax']) lengthDomain = objH5Group.attrs['lengthDomain'] comment = objH5Group.attrs['comment'] # SignalObj attr unpacking channels = eval(objH5Group.attrs['channels']) # Added with an if for compatibilitie issues if 'signalType' in objH5Group.attrs: signalType = _h5.attr_parser(objH5Group.attrs['signalType']) else: signalType = 'power' # Creating and conforming SignalObj SigObj = SignalObj(signalArray=np.array(objH5Group['timeSignal']), domain='time', signalType=signalType, samplingRate=samplingRate, freqMin=freqMin, freqMax=freqMax, comment=comment) SigObj.channels = channels SigObj.lengthDomain = lengthDomain return SigObj elif objH5Group.attrs['class'] == 'ImpulsiveResponse': systemSignal = __h5_unpack(objH5Group['systemSignal']) method = objH5Group.attrs['method'] winType = objH5Group.attrs['winType'] winSize = objH5Group.attrs['winSize'] overlap = objH5Group.attrs['overlap'] IR = ImpulsiveResponse(method=method, winType=winType, winSize=winSize, overlap=overlap, ir=systemSignal) return IR elif objH5Group.attrs['class'] == 'RecMeasure': # PyTTaObj attrs unpacking samplingRate = objH5Group.attrs['samplingRate'] freqMin = _h5.none_parser(objH5Group.attrs['freqMin']) freqMax = _h5.none_parser(objH5Group.attrs['freqMax']) comment = objH5Group.attrs['comment'] lengthDomain = objH5Group.attrs['lengthDomain'] fftDegree = objH5Group.attrs['fftDegree'] timeLength = objH5Group.attrs['timeLength'] # Measurement attrs unpacking device = _h5.list_w_int_parser(objH5Group.attrs['device']) inChannels = eval(objH5Group.attrs['inChannels']) blocking = objH5Group.attrs['blocking'] # Recreating the object rObj = measurement(kind='rec', device=device, inChannels=inChannels, blocking=blocking, samplingRate=samplingRate, freqMin=freqMin, freqMax=freqMax, comment=comment, lengthDomain=lengthDomain, fftDegree=fftDegree, timeLength=timeLength) return rObj elif objH5Group.attrs['class'] == 'PlayRecMeasure': # PyTTaObj attrs unpacking samplingRate = objH5Group.attrs['samplingRate'] freqMin = _h5.none_parser(objH5Group.attrs['freqMin']) freqMax = _h5.none_parser(objH5Group.attrs['freqMax']) comment = objH5Group.attrs['comment'] lengthDomain = objH5Group.attrs['lengthDomain'] fftDegree = objH5Group.attrs['fftDegree'] timeLength = objH5Group.attrs['timeLength'] # Measurement attrs unpacking device = _h5.list_w_int_parser(objH5Group.attrs['device']) inChannels = eval(objH5Group.attrs['inChannels']) outChannels = eval(objH5Group.attrs['outChannels']) blocking = objH5Group.attrs['blocking'] # PlayRecMeasure attrs unpacking excitation = __h5_unpack(objH5Group['excitation']) outputAmplification = objH5Group.attrs['outputAmplification'] # Recreating the object prObj = measurement(kind='playrec', excitation=excitation, outputAmplification=outputAmplification, device=device, inChannels=inChannels, outChannels=outChannels, blocking=blocking, samplingRate=samplingRate, freqMin=freqMin, freqMax=freqMax, comment=comment) return prObj elif objH5Group.attrs['class'] == 'FRFMeasure': # PyTTaObj attrs unpacking samplingRate = objH5Group.attrs['samplingRate'] freqMin = _h5.none_parser(objH5Group.attrs['freqMin']) freqMax = _h5.none_parser(objH5Group.attrs['freqMax']) comment = objH5Group.attrs['comment'] lengthDomain = objH5Group.attrs['lengthDomain'] fftDegree = objH5Group.attrs['fftDegree'] timeLength = objH5Group.attrs['timeLength'] # Measurement attrs unpacking device = _h5.list_w_int_parser(objH5Group.attrs['device']) inChannels = eval(objH5Group.attrs['inChannels']) outChannels = eval(objH5Group.attrs['outChannels']) blocking = objH5Group.attrs['blocking'] # PlayRecMeasure attrs unpacking excitation = __h5_unpack(objH5Group['excitation']) outputAmplification = objH5Group.attrs['outputAmplification'] # FRFMeasure attrs unpacking method = _h5.none_parser(objH5Group.attrs['method']) winType = _h5.none_parser(objH5Group.attrs['winType']) winSize = _h5.none_parser(objH5Group.attrs['winSize']) overlap = _h5.none_parser(objH5Group.attrs['overlap']) # Recreating the object frfObj = measurement(kind='frf', method=method, winType=winType, winSize=winSize, overlap=overlap, excitation=excitation, outputAmplification=outputAmplification, device=device, inChannels=inChannels, outChannels=outChannels, blocking=blocking, samplingRate=samplingRate, freqMin=freqMin, freqMax=freqMax, comment=comment) return frfObj elif objH5Group.attrs['class'] == 'Analysis': # Analysis attrs unpacking anType = _h5.attr_parser(objH5Group.attrs['anType']) nthOct = _h5.attr_parser(objH5Group.attrs['nthOct']) minBand = _h5.attr_parser(objH5Group.attrs['minBand']) maxBand = _h5.attr_parser(objH5Group.attrs['maxBand']) comment = _h5.attr_parser(objH5Group.attrs['comment']) title = _h5.attr_parser(objH5Group.attrs['title']) dataLabel = _h5.attr_parser(objH5Group.attrs['dataLabel']) errorLabel = _h5.attr_parser(objH5Group.attrs['errorLabel']) xLabel = _h5.attr_parser(objH5Group.attrs['xLabel']) yLabel = _h5.attr_parser(objH5Group.attrs['yLabel']) # Analysis data unpacking data = np.array(objH5Group['data']) # If error in save moment was None no group was created for it if 'error' in objH5Group: error = np.array(objH5Group['error']) else: error = None # Recreating the object anObject = Analysis(anType=anType, nthOct=nthOct, minBand=minBand, maxBand=maxBand, data=data, dataLabel=dataLabel, error=error, errorLabel=errorLabel, comment=comment, xLabel=xLabel, yLabel=yLabel, title=title) return anObject elif objH5Group.attrs['class'] == 'dict': dictObj = {} for PyTTaObjName, PyTTaObjH5Group in objH5Group.items(): dictObj[PyTTaObjName] = __h5_unpack(PyTTaObjH5Group) return dictObj elif objH5Group.attrs['class'] == 'list': dictObj = {} for idx, PyTTaObjH5Group in objH5Group.items(): dictObj[int(idx)] = __h5_unpack(PyTTaObjH5Group) idxs = [int(item) for item in list(dictObj.keys())] maxIdx = max(idxs) listObj = [] for idx in range(maxIdx + 1): listObj.append(dictObj[idx]) return listObj else: raise NotImplementedError