def downSampleAnalogSignal(analogSignal, downSampleFactor): ''' Downsamples the input analogsignal, with the downsampled signal having the same t_start as analogsignal :param analogSignal: neo.analogsignal :param downSampleFactor: int, must be at least 1 :return: analogSignalDown, neo.analogsignal with sampling rate = analogsignal.sampling_rate/factor and analogSignalDown.t_start = analogSignal.t_start ''' assert type(downSampleFactor) == int, 'downsample factor must be an int' assert downSampleFactor >= 1, 'downsample factor must be atleast 1' if downSampleFactor == 1: return analogSignal.copy() else: newSamplingRate = analogSignal.sampling_rate / downSampleFactor downSamplingIndices = range(0, analogSignal.shape[0], downSampleFactor) analogSignalMagnitude = analogSignal.magnitude[downSamplingIndices] analogSignalDown = AnalogSignal(signal=analogSignalMagnitude, units=analogSignal.units, sampling_rate=newSamplingRate, t_start=analogSignal.t_start) analogSignalDown = analogSignalDown.reshape( (analogSignalDown.shape[0], )) return analogSignalDown
def calibrateSignal(inputSignal, calibString, calibUnitStr, forceUnits=None): if calibString.find(';') > 0: calibStrings = calibString.split(';') elif calibString.find(':') > 0: calibStrings = calibString.split(':') elif all([x.isdigit() or x == '.' for x in calibString]): calibStrings = [calibString] else: raise (ValueError( "Improper Calibration string {}".format(calibString))) ipSignalMag = inputSignal.magnitude.copy() ipSigUnits = inputSignal.units for calibString in calibStrings: calib, startTime, endTime = parseCalibString(calibString, calibUnitStr) if endTime is None: endTime = inputSignal.t_stop if startTime is None: startTime = inputSignal.t_start startIndex = int( (startTime - inputSignal.t_start) * inputSignal.sampling_rate) endIndex = int( (endTime - inputSignal.t_start) * inputSignal.sampling_rate) ipSignalMag[startIndex:endIndex] *= calib.magnitude if forceUnits is not None: ipSigUnits = forceUnits else: if ipSigUnits == qu.Quantity(1): ipSigUnits = calib.units elif ipSigUnits != calib.units: raise (Exception('CalibStrings given don\'t have the same units')) outputSignal = AnalogSignal(signal=ipSignalMag, units=ipSigUnits, sampling_rate=inputSignal.sampling_rate, t_start=inputSignal.t_start) outputSignal = outputSignal.reshape((outputSignal.shape[0], )) return outputSignal
def downSampleVibSignal(self): self.downSamplingFactor = int( round(self.vibrationSignal.sampling_rate / (4 * self.maximumFreq))) newSamplingRate = self.vibrationSignal.sampling_rate / self.downSamplingFactor downSamplingIndices = range(0, self.vibrationSignal.shape[0], self.downSamplingFactor) vibSigDownMag = self.vibrationSignal.magnitude[downSamplingIndices] vibSigDownMag -= np.median(vibSigDownMag) self.vibrationSignalDownStdDev = np.std( vibSigDownMag) * self.vibrationSignal.units temp = AnalogSignal(signal=vibSigDownMag, units=self.vibrationSignal.units, sampling_rate=newSamplingRate, t_start=self.vibrationSignal.t_start) self.vibrationSignalDown = temp.reshape((temp.shape[0], ))
def downSampleVoltageSignal(self, downSamplingFactor=None): if downSamplingFactor is None: downSamplingFactor = self.downSamplingFactor newSamplingRate = self.voltageSignal.sampling_rate / downSamplingFactor downSamplingIndices = range(0, self.voltageSignal.shape[0], downSamplingFactor) voltageSignalDown = AnalogSignal( signal=self.voltageSignal.magnitude[downSamplingIndices], units=self.voltageSignal.units, sampling_rate=newSamplingRate, t_start=self.voltageSignal.t_start) voltageSignalDown = voltageSignalDown.reshape( (voltageSignalDown.shape[0], )) return voltageSignalDown
def filterButterworth(analogSignal, cutoff=100, transitionWidth=40, rippleDB=20): cutoff *= qu.Hz nyqFreq = analogSignal.sampling_rate / 2 # b, a = iirfilter(order, cutoff / nyqFreq, btype='highpass', ftype='butter') transitionWidth = transitionWidth * qu.Hz N, beta = kaiserord(rippleDB, transitionWidth / nyqFreq) tapsLP = firwin(N, cutoff / nyqFreq, window=('kaiser', beta)) temp = np.zeros((N,)) temp[(N - 1) / 2] = 1 tapsHP = temp - tapsLP delay = (N - 1) * 0.5 * analogSignal.sampling_period w, h = freqz(tapsHP, 1.0, int(nyqFreq)) f = w * (nyqFreq) / (2 * PI) sigM = analogSignal.magnitude sigM = sigM.reshape((sigM.shape[0],)) sigMFiltered = lfilter(tapsHP, 1.0, sigM) temp = AnalogSignal( signal=sigMFiltered, sampling_rate=analogSignal.sampling_rate, units=analogSignal.units, t_start=analogSignal.t_start - delay ) filteredSignal = temp.reshape((temp.shape[0],)) # from scipy.fftpack import fft # plt.ion() # fig1 = plt.figure() # # plt.plot(f, h, 'b-o') # plt.xlabel('Frequency(Hz)') # plt.ylabel('Gain') # plt.draw() # # fig2 = plt.figure() # # # plt.plot(analogSignal.times, analogSignal, 'r') # plt.plot(filteredSignal.times, filteredSignal, 'b') # plt.legend(['Original Signal', 'Filtered Signal']) # plt.xlabel('Time in ' + analogSignal.sampling_period.dimensionality.string) # plt.draw() # # fig3 = plt.figure() # # # freqResolution = 5 * qu.Hz # NFFT = np.ceil(2 * nyqFreq / freqResolution).simplified # NFFT = int(np.ceil(NFFT / 2) * 2) # actualFreqResolution = 2 * nyqFreq / NFFT # frequencies = np.arange(int(NFFT/2)) * actualFreqResolution # # # outSig = filteredSignal.magnitude # # # origFFT = fft(sigM, NFFT) # origFFT[0] = 0 # plt.plot(frequencies, np.abs(origFFT)[:int(NFFT/2)]) # # filtFFT = fft(outSig, NFFT) # plt.plot(frequencies, np.abs(filtFFT)[:int(NFFT/2)]) # # plt.legend(['FFT of Original Signal', 'FFT of Filtered Signal']) # plt.xlabel('Frequency(Hz)') # plt.draw() # raw_input() # plt.close(fig1.number) # plt.close(fig2.number) # plt.close(fig3.number) return filteredSignal
blk = nixFile.blocks["Simulation Traces"] dlint1MemV = blk.data_arrays["DLInt1 MemV"] dlint1SpikesMT = blk.multi_tags["DLInt1 Spikes"] dlint2MemV = blk.data_arrays["DLInt2 MemV"] dlint2SpikesMT = blk.multi_tags["DLInt2 Spikes"] sinInput = blk.data_arrays["Input Vibration Signal"] joSpikesMT = blk.multi_tags["JO Spikes"] dlint1MemVAS = dataArray2AnalogSignal(dlint1MemV) dlint2MemVAS = dataArray2AnalogSignal(dlint2MemV) temp = dataArray2AnalogSignal(sinInput) sinInputAS = AnalogSignal(signal=15 * temp.magnitude, units=temp.units, t_start=temp.t_start, sampling_period=temp.sampling_period) sinInputAS = sinInputAS.reshape((sinInputAS.shape[0], )) dlint1SpikesST = multiTag2SpikeTrain(dlint1SpikesMT, sinInputAS.t_start, sinInputAS.t_stop) dlint2SpikesST = multiTag2SpikeTrain(dlint2SpikesMT, sinInputAS.t_start, sinInputAS.t_stop) joSpikesST = multiTag2SpikeTrain(joSpikesMT, sinInputAS.t_start, sinInputAS.t_stop) # fig0, ax0 = plt.subplots(figsize=(2.5, 1.5)) # fig1, ax1 = plt.subplots(figsize=(2.5, 1.5)) # fig2, ax2 = plt.subplots(figsize=(2.5, 1.75)) # fig0, ax0 = plt.subplots(figsize=(2.85, 1.5)) fig1, ax1 = plt.subplots(figsize=(2.85, 1.5)) fig2, ax2 = plt.subplots(figsize=(2.85, 1.75))