Continuous DTFT: use derivative == 0

This commit is contained in:
Eric Teunis de Boone 2022-11-14 11:41:35 +01:00
parent 0966be97b9
commit 25fb4444d0

View file

@ -13,7 +13,7 @@ if __name__ == "__main__":
t = np.linspace(0, 100, n_samples+1) t = np.linspace(0, 100, n_samples+1)
phi_in = np.linspace(0, 2*np.pi, nphi) phi_in = np.linspace(0, 2*np.pi, nphi)
test_freqs = f_beacon + np.linspace(-0.1, 0.1, 300+1) test_freqs = f_beacon + 0.1 * np.linspace(-1, 1, 100+1)
phi_out = np.zeros( (len(phi_in), len(test_freqs)) ) phi_out = np.zeros( (len(phi_in), len(test_freqs)) )
@ -80,13 +80,13 @@ if __name__ == "__main__":
# Single Amplitude / Frequency plot showing frequency fitting # Single Amplitude / Frequency plot showing frequency fitting
freq_out = None freq_out = None
if True: if True:
from numpy.polynomial import Polynomial from numpy.polynomial import Polynomial as P
freq_out = np.zeros(len(phi_in)) freq_out = np.zeros(len(phi_in))
amp_cut = 0.8 amp_cut = 0.8
fig, ax = plt.subplots() fig, ax = plt.subplots()
ax.set_title("Frequency estimation by parabola fitting.") ax.set_title("Frequency estimation by parabola fitting.\nStars are used for the parabola fit, vertical line is where $\\partial_f = 0 $")
ax.set_xlabel("Frequency") ax.set_xlabel("Frequency")
ax.set_ylabel("Amplitude") ax.set_ylabel("Amplitude")
@ -100,28 +100,33 @@ if __name__ == "__main__":
# filter amplitudes below amp_cut*max_amp # filter amplitudes below amp_cut*max_amp
valid_idx = amp >= amp_cut*max_amp valid_idx = amp >= amp_cut*max_amp
p_fit = Polynomial.fit(test_freqs[valid_idx], amp[valid_idx], 2) p_fit = P.fit(test_freqs[valid_idx], amp[valid_idx], 2)
func = p_fit.convert() func = p_fit.convert()
tmp_test_freqs = test_freqs[max_amp_idx] + 0.05*np.linspace(-1,1,101, endpoint=True) # Find frequency of derivative == 0
func_amps = func(tmp_test_freqs) deriv = func.deriv(1)
freq_id = np.argmax(func_amps) freq = deriv.roots()[0]
freq_out[j] = freq
freq_out[j] = tmp_test_freqs[freq_id]
# plot tmp_test_freqs and freq_id l = ax.plot(test_freqs, amp, marker='.')
func_amps_idx = func_amps > 0 ax.plot(test_freqs[valid_idx], amp[valid_idx], marker='*', color=l[0].get_color())
func_amps = func_amps[func_amps_idx]
tmp_test_freqs = tmp_test_freqs[func_amps_idx]
ax.plot(test_freqs, amp, marker='o')
l = ax.plot(tmp_test_freqs, func_amps)
ax.axvline(freq_out[j], color=l[0].get_color()) ax.axvline(freq_out[j], color=l[0].get_color())
if True: # plot the fit
tmp_test_freqs = test_freqs[max_amp_idx] + 0.05*np.linspace(-1,1,101, endpoint=True)
func_amps = func(tmp_test_freqs)
func_amps_idx = func_amps > 0
func_amps = func_amps[func_amps_idx]
tmp_test_freqs = tmp_test_freqs[func_amps_idx]
ax.plot(tmp_test_freqs, func_amps, ls='dotted', color=l[0].get_color())
# Amplitudes figure # Amplitudes figure
if True: if not True:
fig, ax = plt.subplots() fig, ax = plt.subplots()
ax.set_ylabel("Amplitude") ax.set_ylabels("Amplitude")
ax.set_xlabel("Frequency") ax.set_xlabel("Frequency")
if True: if True:
for j, amp in enumerate(amp_out.T): for j, amp in enumerate(amp_out.T):