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 measurement(kind='playrec', samplingRate=None, freqMin=None, freqMax=None, device=None, inChannels=None, outChannels=None, *args, **kwargs): """ Generates a measurement object of type Recording, Playback and Recording, Transferfunction, with the proper initiation arguments, a sampling rate, frequency limits, audio input and output devices and channels >>> pytta.generate.measurement(kind, [lengthDomain, fftDegree, timeLength, excitation, outputAmplification], samplingRate, freqMin, freqMax, device, inChannels, outChannels, comment) The parameters between brackets are different for each value of the (kind) parameter. >>> msRec = pytta.generate.measurement(kind='rec') >>> msPlayRec = pytta.generate.measurement(kind='playrec') >>> msFRF = pytta.generate.measurement(kind='frf') The input arguments may be different for each measurement kind. Options for (kind='rec'): - lengthDomain: 'time' or 'samples', defines if the recording length will be set by time length, or number of samples; - timeLength: [s] used only if (domain='time'), set the duration of the recording, in seconds; - fftDegree: represents a power of two value that defines the number of samples to be recorded: >>> numSamples = 2**fftDegree - samplingRate: [Hz] sampling frequency of the recording; - freqMin: [Hz] smallest frequency of interest; - freqMax: [Hz] highest frequency of interest; - device: audio I/O device to use for recording; - inChannels: list of active channels to record; - comment: any commentary about the recording. Options for (kind='playrec'): - excitation: object of SignalObj class, used for the playback; - outputAmplification: output gain in dB; - samplingRate: [Hz] sampling frequency of the recording; - freqMin: [Hz] smallest frequency of interest; - freqMax: [Hz] highest frequency of interest; - device: audio I/O device to use for recording; - inChannels: list of active channels to record; - outChannels: list of active channels to send the playback signal, for M channels it is mandatory for the excitation signal to have M columns in the timeSignal parameter. - comment: any commentary about the recording. Options for (kind='frf'): - same as for (kind='playrec'); - regularization: [boolean] option for Kirkeby regularization """ # Code snippet to guarantee that generated object name is # the declared at global scope # for frame, line in traceback.walk_stack(None): for framenline in traceback.walk_stack(None): # varnames = frame.f_code.co_varnames varnames = framenline[0].f_code.co_varnames if varnames == (): break # creation_file, creation_line, creation_function, \ # creation_text = \ extracted_text = \ traceback.extract_stack(framenline[0], 1)[0] # traceback.extract_stack(frame, 1)[0] # creation_name = creation_text.split("=")[0].strip() creation_name = extracted_text[3].split("=")[0].strip() # Default Parameters if freqMin is None: freqMin = default.freqMin if freqMax is None: freqMax = default.freqMax if samplingRate is None: samplingRate = default.samplingRate if device is None: device = default.device if inChannels is None: inChannels = default.inChannel[:] if outChannels is None: outChannels = default.outChannel[:] # Kind REC if kind in ['rec', 'record', 'recording', 'r']: recordObj = RecMeasure(samplingRate=samplingRate, freqMin=freqMin, freqMax=freqMax, device=device, inChannels=inChannels, **kwargs) if ('lengthDomain' in kwargs) or args: if kwargs.get('lengthDomain') == 'time': recordObj.lengthDomain = 'time' try: recordObj.timeLength = kwargs.get('timeLength') except KeyError: recordObj.timeLength = default.timeLength elif kwargs.get('lengthDomain') == 'samples': recordObj.lengthDomain = 'samples' try: recordObj.fftDegree = kwargs.get('fftDegree') except KeyError: recordObj.fftDegree = default.fftDegree else: recordObj.lengthDomain = 'samples' recordObj.fftDegree = default.fftDegree recordObj.creation_name = creation_name return recordObj # Kind PLAYREC elif kind in ['playrec', 'playbackrecord', 'pr']: if 'outputAmplification' in kwargs: outputAmplification = kwargs.get('outputAmplification') kwargs.pop('outputAmplification', None) else: outputAmplification = 0 if ('excitation' in kwargs.keys()) or args: signalIn = kwargs.get('excitation') or args[0] kwargs.pop('excitation', None) else: signalIn = sweep(samplingRate=samplingRate, freqMin=freqMin, freqMax=freqMax, **kwargs) playRecObj = PlayRecMeasure(excitation=signalIn, outputAmplification=outputAmplification, device=device, inChannels=inChannels, outChannels=outChannels, freqMin=freqMin, freqMax=freqMax, **kwargs) playRecObj.creation_name = creation_name return playRecObj # Kind FRF elif kind in ['tf', 'frf', 'transferfunction', 'freqresponse']: if 'regularization' in kwargs: regularization = kwargs.get('regularization') kwargs.pop('regularization', None) else: regularization = True if 'outputAmplification' in kwargs: outputAmplification = kwargs.get('outputAmplification') kwargs.pop('outputAmplification', None) else: outputAmplification = 0 if ('excitation' in kwargs) or args: signalIn = kwargs.get('excitation') or args[0] kwargs.pop('excitation', None) else: signalIn = sweep(samplingRate=samplingRate, freqMin=freqMin, freqMax=freqMax, **kwargs) frfObj = FRFMeasure(excitation=signalIn, outputAmplification=outputAmplification, device=device, inChannels=inChannels, outChannels=outChannels, freqMin=freqMin, freqMax=freqMax, regularization=regularization, **kwargs) frfObj.creation_name = creation_name return frfObj