Пример #1
0
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
Пример #2
0
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
Пример #3
0
    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], ))
Пример #4
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
Пример #5
0
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
Пример #6
0
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))