I first applied a 100 Hz lowpass filter to my data, which was recorded at 30000 Hz:
import numpy as np from scipy import signal as ss from scipy.signal import butter, lfilter, freqz import matplotlib.pyplot as plt def butter_lowpass(low_cutoff, fs, order=5): nyq = 0.5 * fs normal_low_cutoff = low_cutoff / nyq b_low, a_low = butter(order, normal_low_cutoff, btype='lowpass', analog=False) return b_low, a_low def butter_lowpass_filter(data, low_cutoff, fs, order=5): b_low, a_low = butter_lowpass(low_cutoff, fs, order=order) y_low = ss.lfilter(b_low, a_low, data) return y_low # Filter requirements. order = 5 fs = 30000 # sample rate, Hz low_cutoff = 100 # desired cutoff frequency of the filter, Hz print('Filtering data') filtered_array = butter_lowpass_filter(array, low_cutoff, fs, order)
Then I down sampled my data from 30000 Hz to 250 Hz
updated_array=ss.decimate(filtered_array, 12, ftype = 'fir') newarray = ss.decimate(updated_array,10, ftype = 'fir')
And then apply the decimated result to a spectrogram:
frequencies, time, Sxx = ss.spectrogram(newarray,sampling_rate, ss.get_window('hamming', bin_size), noverlap=0, nfft=sampling_rate*4)
However, the resulted plot showed some signal higher than 100Hz even though I already used a lowpass 100Hz filter earlier.
For reference, this is the plot if the filter was not sed before decimation:
Is there any explanation for this?
Thanks a lot!