Background: I was trying to remove the DC component of a load cell signal using a high-pass filter. I don't care about that anymore. I'm curious why a digital filter and an analog filter behave differently under the same conditions.
import numpy as np import math as m from scipy import signal from scipy import fftpack from myLib import myFFT import matplotlib.pyplot as plt # load data filename = "raw_data.txt" fSampling = 1E3 fNyquist = 0.5*fSampling data = np.loadtxt(filename,skiprows=0) i1 = 1000 i2 = 5000 t = data[:,0] x = data[:,3] # remove DC component fCutoff = 0.01/fNyquist bd, ad = signal.butter(4, fCutoff, 'high', analog=False) xd = signal.filtfilt(bd,ad,x) ba, aa = signal.butter(4, fCutoff, 'high', analog=True) xa = signal.filtfilt(ba,aa,x) # plot results f, axarr = plt.subplots(3, sharex=True) axarr.plot(t, x) axarr.set_title("raw") axarr.set_ylabel("x [-]") axarr.plot(t, xd) axarr.set_title("digital") axarr.set_ylabel("x [-]") axarr.plot(t, xa) axarr.set_title("analog") axarr.set_xlabel("t [s]") axarr.set_ylabel("x [-]") plt.show()
Why does the digital filter behave differently? Is something weird about my data, or do digital and analog filters behave differently? I'm new to signals processing (this all originated from me leaving the analog flag with the default "False"), but
I thought analog and digital filters were generally different means to the same end.
Edit: I did some research online, and I've learned that I should use a digital filter to filter regularly sampled data. I don't know why yet (digital filters perform better at a known range?), but this is just making even more curious why my digital filter increased the gain of my signal. I analyzed the frequency response of the digital filter, and theoretically I should get a gain of 0:
I want to chalk this up to numerical errors since the digital filter's numerator and denominator are so close, but so are the analog filter's numerator and denominator:
b digital = [ 0.99991791 -3.99967164 5.99950746 -3.99967164 0.99991791] a digital = [ 1. -3.99983581 5.99950745 -3.99950746 0.99983583] b analog = [ 1. 0. 0. 0. 0.] a analog = [ 1.00000000e+00 5.22625186e-05 1.36568542e-09 2.09050074e-14 1.60000000e-19]