first working state

This commit is contained in:
Valentin Boettcher 2024-08-08 18:06:17 -04:00
parent 1df783ab2d
commit ebc2637639
3 changed files with 56 additions and 62 deletions

View file

@ -58,7 +58,7 @@ def process_shots(t, solutions, noise_amplitude, params):
freq, fft = fourier_transform( freq, fft = fourier_transform(
t, t,
signal, signal,
low_cutoff=0.0 * params.Ω, low_cutoff=0.5 * params.Ω,
high_cutoff=params.Ω * (params.N + 1), high_cutoff=params.Ω * (params.N + 1),
window=window, window=window,
) )
@ -75,41 +75,57 @@ def process_shots(t, solutions, noise_amplitude, params):
def plot_power_spectrum(ax_spectrum, freq, average_power_spectrum, params): def plot_power_spectrum(ax_spectrum, freq, average_power_spectrum, params):
offset = np.median(average_power_spectrum) offset = np.median(average_power_spectrum)
ax_spectrum.plot(freq, average_power_spectrum) # ax_spectrum.plot(freq, average_power_spectrum)
# runtime = RuntimeParams(params)
# lorentz_freqs = np.linspace(freq.min(), freq.max(), 10000)
# fake_spectrum = np.zeros_like(lorentz_freqs)
runtime = RuntimeParams(params) # for i, peak_freq in enumerate(runtime.Ωs):
lorentz_freqs = np.linspace(freq.min(), freq.max(), 10000) # pos = np.abs(
fake_spectrum = np.zeros_like(lorentz_freqs) # params.measurement_detuning
# - peak_freq.real / (2 * np.pi)
# + params.δ * params.Ω
# + params.laser_detuning,
# )
for i, peak_freq in enumerate(runtime.Ωs): # ax_spectrum.axvline(
pos = np.abs( # pos,
params.measurement_detuning # color="red",
- peak_freq.real / (2 * np.pi) # linestyle="--",
+ params.δ * params.Ω # zorder=-100,
+ params.laser_detuning, # )
# amplitude = average_power_spectrum[np.argmin(abs(freq - pos))] - offset
# ax_spectrum.annotate(
# mode_name(i),
# (
# pos + 0.1,
# (amplitude + offset) * (1 if peak_freq.real < 0 else 1.1),
# ),
# )
# fake_spectrum += lorentzian(
# lorentz_freqs, amplitude, pos, peak_freq.imag / np.pi
# )
# ax_spectrum.plot(lorentz_freqs, fake_spectrum + offset)
ringdown_params = RingdownParams(
fω_shift=params.measurement_detuning,
mode_window=(5, 5),
fΩ_guess=params.Ω,
fδ_guess=params.Ω * params.δ,
η_guess=0.5,
absolute_low_cutoff=1,
) )
ax_spectrum.axvline( peak_info = find_peaks(
pos, freq, average_power_spectrum, ringdown_params, prominence=0.001
color="red",
linestyle="--",
zorder=-100,
) )
peak_info = refine_peaks(peak_info, ringdown_params)
amplitude = average_power_spectrum[np.argmin(abs(freq - pos))] - offset peak_info.power = average_power_spectrum
ax_spectrum.annotate( plot_spectrum_and_peak_info(ax_spectrum, peak_info, ringdown_params, annotate=True)
mode_name(i), print(peak_info.peak_freqs)
(
pos + 0.1,
(amplitude + offset) * (1 if peak_freq.real < 0 else 1.1),
),
)
fake_spectrum += lorentzian(
lorentz_freqs, amplitude, pos, peak_freq.imag / np.pi
)
ax_spectrum.plot(lorentz_freqs, fake_spectrum + offset)
def generate_data( def generate_data(
@ -180,6 +196,8 @@ def generate_data(
plot_power_spectrum(ax_single, freq, spectrum_on_resonance, params) plot_power_spectrum(ax_single, freq, spectrum_on_resonance, params)
runtime = RuntimeParams(params) runtime = RuntimeParams(params)
print(runtime.Ωs.real / (2 * np.pi) - params.laser_detuning)
# ax_spectrum.set_yscale(yscale) # ax_spectrum.set_yscale(yscale)
return fig return fig
@ -190,10 +208,10 @@ if __name__ == "__main__":
fig = generate_data( fig = generate_data(
g_0=1, g_0=1,
η_factor=5, η_factor=5,
noise_amplitude=0.25, noise_amplitude=0.25 * 0,
N=2, N=2,
eom_ranges=(1.1, 1.3), eom_ranges=(1.1, 1.3),
eom_steps=100, eom_steps=20,
small_loop_detuning=0, small_loop_detuning=0,
laser_detuning=0, laser_detuning=0,
excitation_lifetimes=2, excitation_lifetimes=2,

View file

@ -111,9 +111,6 @@ class RingdownPeakData:
freq: np.ndarray freq: np.ndarray
"""The fft frequency array.""" """The fft frequency array."""
fft: np.ndarray
"""The fft amplitudes."""
power: np.ndarray power: np.ndarray
"""The power spectrum of the fft.""" """The power spectrum of the fft."""
@ -147,36 +144,26 @@ class RingdownPeakData:
def find_peaks( def find_peaks(
data: ScanData, freq: np.ndarray,
power_spectrum: np.ndarray,
params: RingdownParams, params: RingdownParams,
window: tuple[float, float],
prominence: float = 0.005, prominence: float = 0.005,
) -> RingdownPeakData: ) -> RingdownPeakData:
"""Determine the peaks of the power spectrum of the """Determine the peaks of the power spectrum of the
ringdown data. ringdown data.
:param data: The oscilloscope data. :param freq: The frequency axis data.
:params power_spectrum: The FFT power spectrum.
:param params: The ringdown parameters, see :any:`RingdownParams`. :param params: The ringdown parameters, see :any:`RingdownParams`.
:param window: The time window to consider. (to be automated)
:param prominence: The prominence (vertical distance of peak from :param prominence: The prominence (vertical distance of peak from
surrounding valleys) of the peaks. surrounding valleys) of the peaks.
""" """
freq, fft, t = fourier_transform(
data.time,
data.output,
window=window,
low_cutoff=params.low_cutoff,
high_cutoff=params.high_cutoff,
ret_time=True,
)
freq_step = freq[1] - freq[0] freq_step = freq[1] - freq[0]
power = np.abs(fft) ** 2
distance = params.fδ_guess / 2 / freq_step distance = params.fδ_guess / 2 / freq_step
peaks, peak_info = scipy.signal.find_peaks( peaks, peak_info = scipy.signal.find_peaks(
power / power.max(), power_spectrum / power_spectrum.max(),
distance=distance, distance=distance,
wlen=distance // 4, wlen=distance // 4,
prominence=prominence, prominence=prominence,
@ -186,11 +173,10 @@ def find_peaks(
return RingdownPeakData( return RingdownPeakData(
freq=freq, freq=freq,
fft=fft,
peaks=peaks, peaks=peaks,
peak_freqs=peak_freqs, peak_freqs=peak_freqs,
peak_info=peak_info, peak_info=peak_info,
power=power, power=power_spectrum,
) )

View file

@ -238,16 +238,6 @@ def plot_spectrum_and_peak_info(
ax_angle.clear() ax_angle.clear()
ax_angle.set_ylabel("Phase (rad)") ax_angle.set_ylabel("Phase (rad)")
unwrapped = np.unwrap(np.angle(peaks.fft) * 2) / 2
ax_angle.plot(
peaks.freq,
unwrapped,
linestyle="--",
alpha=0.5,
linewidth=0.5,
zorder=10,
)
if annotate: if annotate:
for i, (freq, height, lorentz) in enumerate( for i, (freq, height, lorentz) in enumerate(
zip(peaks.peak_freqs, peaks.power[peaks.peaks], peaks.lorentz_params) zip(peaks.peak_freqs, peaks.power[peaks.peaks], peaks.lorentz_params)