Time for action – fitting to a sine
In the previous Time for action section, we created a simple filter for detrended data. Now, let's use a more restrictive filter that will leave us only with the main frequency component. We will fit a sinusoidal pattern to it and plot our results. This model has four parameters—amplitude, frequency, phase, and vertical offset.
Define a residuals function based on a sine wave model:
def residuals(p, y, x): A,k,theta,b = p err = y-A * np.sin(2* np.pi* k * x + theta) + b return err
Transform the filtered signal back to the original domain:
filtered = -fftpack.irfft(fftpack.ifftshift(amps))
Guess the values of the parameters of which we are trying to estimate a transformation from the time domain into the frequency domain:
N = len(qqq) f = np.linspace(-N/2, N/2, N) p0 = [filtered.max(), f[amps.argmax()]/(2*N), 0, 0] print("P0", p0)
The initial values appear as follows:
P0 [2.6679532410065212, 0.00099598469163686377, 0, 0]
Call the
leastsq()
function:plsq...