emflow-artifact / artifact / utils.py
utils.py
Raw
import scipy.signal as signal
from copy import deepcopy


def createCombFilter(mcu='arduino'):
    #dimensionless parameter that characterizes notch filter -3 dB bandwidth (bw) relative to the center frequency, Q=w0/bw, where w0=fundamental frequency of the comb filter
    qualityFactor = 30.0
    #the sample frequency of the collection oscope
    sampleFrequency = 2.5e9
    #the clock frequency is the one to remove
    if mcu=='arduino':
        clockFreqencyOfArduino = 16e6
        #we want a notch filter composed of bandstop filters, pass_zero is False because we want the notches set on the frequencies [0,w0,2*w0,...]
        b, a = signal.iircomb(clockFreqencyOfArduino, qualityFactor, ftype='notch', fs=sampleFrequency*4)
    elif mcu=='pico':
        clockFreqencyOfArduino = 32e6
        b, a = signal.iircomb(clockFreqencyOfArduino, qualityFactor, ftype='notch', fs=sampleFrequency*8)
    else:
        raise ValueError(f"Wrong value given for mcu -> {mcu}. Should be  'rpi' or 'arduino'.")


    return (b,a)

def applyFilterSingleSignal(filter,signal1,mcu='arduino'):
     #unpack the filter
    b = filter[0]
    a = filter[1]
    if b.any()=='gaussian':
        signal1 = gaussian_filter1d(signal1, a)
    else:
        #unpack the filter
        b = filter[0]
        a = filter[1]

        if mcu=='arduino':
            resampleFactor = 4
        elif mcu=='pico':
            resampleFactor = 8
        else:
            raise ValueError(f"Wrong value given for mcu {mcu}.")

        #up sample the file so the sampling frequency is a multiple of the fundamental frequency (the clock cycle)
        signal1Upsampled = deepcopy(signal1)
        signal1Upsampled = signal.resample_poly(signal1, resampleFactor, 1, axis=0, window=('kaiser', 5.0), padtype='constant', cval=None)


        filteredSignal1 = signal.filtfilt(b, a, signal1Upsampled,padlen=313)
        #downsample back
        signal1 = signal.resample_poly(filteredSignal1, 1, resampleFactor, axis=0, window=('kaiser', 5.0), padtype='constant', cval=None)
        return signal1