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