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