import%20marimo%0A%0A__generated_with%20%3D%20%220.15.5%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20dataclasses%20import%20dataclass%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20from%20morletx%20import%20MorletFilterBank%0A%0A%20%20%20%20plt.style.use(%22seaborn-v0_8%22)%0A%20%20%20%20return%20MorletFilterBank%2C%20Path%2C%20dataclass%2C%20np%2C%20plt%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Load%20example%20signal%20data%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(dataclass%2C%20np)%3A%0A%20%20%20%20%40dataclass%0A%20%20%20%20class%20Signal%3A%0A%20%20%20%20%20%20%20%20times%3A%20np.ndarray%0A%20%20%20%20%20%20%20%20values%3A%20np.ndarray%0A%20%20%20%20%20%20%20%20fs%3A%20float%0A%0A%20%20%20%20%20%20%20%20%40property%0A%20%20%20%20%20%20%20%20def%20duration(self)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.times.max()%20-%20self.times.min()%0A%0A%20%20%20%20%20%20%20%20%40property%0A%20%20%20%20%20%20%20%20def%20num_samples(self)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20len(self.values)%0A%0A%20%20%20%20%20%20%20%20def%20__repr__(self)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20f%22Signal%20duration%3A%20%7Bself.duration%7D%20s%20%7C%20num.%20of%20samples%3A%20%7Bself.num_samples%7D%20%7C%20sampling%20frequency%3A%20%7Bself.fs%7D%22%0A%20%20%20%20return%20(Signal%2C)%0A%0A%0A%40app.cell%0Adef%20_(Path%2C%20Signal%2C%20np)%3A%0A%20%20%20%20npz_file%20%3D%20Path(__file__).parents%5B1%5D%20%2F%20%22data%22%20%2F%20%22fin_whale_song.npz%22%0A%20%20%20%20npz_data%20%3D%20np.load(npz_file)%0A%0A%20%20%20%20signal%20%3D%20Signal(%0A%20%20%20%20%20%20%20%20times%3Dnpz_data%5B%22times%22%5D%2C%20values%3Dnpz_data%5B%22values%22%5D%2C%20fs%3Dnpz_data%5B%22fs%22%5D%0A%20%20%20%20)%0A%0A%20%20%20%20print(signal)%0A%20%20%20%20return%20(signal%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Fin-Whale%20song%20recording%20signal%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(plt%2C%20signal)%3A%0A%20%20%20%20fig_sig%2C%20ax_sig%20%3D%20plt.subplots(figsize%3D(10%2C%206))%0A%20%20%20%20ax_sig.plot(signal.times%2C%20signal.values)%0A%20%20%20%20ax_sig.set(%0A%20%20%20%20%20%20%20%20xlabel%3D%22Time%20%5Bs%5D%22%2C%0A%20%20%20%20%20%20%20%20ylabel%3D%22Acoustic%20Amplitude%22%2C%0A%20%20%20%20%20%20%20%20title%3D%22Fin-Whale%20song%20recording%20%7C%20Bandpass%20filtered%2012%E2%80%9330%20Hz%22%2C%0A%20%20%20%20)%0A%20%20%20%20%23%20mo.mpl.interactive(fig_sig)%0A%20%20%20%20plt.gca()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Apply%20the%20CWT%20and%20compute%20scalogram%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(MorletFilterBank%2C%20signal)%3A%0A%20%20%20%20filt_bank%20%3D%20MorletFilterBank(%0A%20%20%20%20%20%20%20%20n_octaves%3D2%2C%0A%20%20%20%20%20%20%20%20n_intervals%3D10%2C%0A%20%20%20%20%20%20%20%20shape_ratio%3D5.0%2C%0A%20%20%20%20%20%20%20%20duration%3D1.0%2C%0A%20%20%20%20%20%20%20%20sampling_freq%3Dsignal.fs%2C%0A%20%20%20%20%20%20%20%20array_engine%3D%22numpy%22%2C%0A%20%20%20%20)%0A%0A%20%20%20%20mode%20%3D%20%22magnitude%22%0A%20%20%20%20scalogram%20%3D%20filt_bank.transform(signal.values%2C%20mode%3Dmode%2C%20detach_from_device%3DTrue)%0A%0A%20%20%20%20print(f%22Scalogram%20array%20shape%3A%20%7Bscalogram.shape%7D%22)%0A%20%20%20%20return%20filt_bank%2C%20mode%2C%20scalogram%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Display%20the%20scalogram%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(filt_bank%2C%20mode%2C%20plt%2C%20scalogram)%3A%0A%20%20%20%20fig_sgram%2C%20ax_sgram%20%3D%20plt.subplots(figsize%3D(10%2C%206))%0A%20%20%20%20filt_bank.plot_scalogram(%0A%20%20%20%20%20%20%20%20ax%3Dax_sgram%2C%0A%20%20%20%20%20%20%20%20scalogram%3Dscalogram%2C%0A%20%20%20%20%20%20%20%20mode%3Dmode%2C%0A%20%20%20%20)%0A%0A%20%20%20%20ax_sgram.grid(False)%0A%20%20%20%20%23%20mo.mpl.interactive(fig_sgram)%0A%20%20%20%20plt.gca()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Display%20the%20frequency%20responses%20of%20the%20filterbank%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(filt_bank%2C%20plt)%3A%0A%20%20%20%20fig_resps%2C%20ax_resps%20%3D%20plt.subplots(figsize%3D(10%2C%206))%0A%20%20%20%20filt_bank.plot_responses(ax_resps%2C%20n_fft%3D512)%0A%20%20%20%20%23%20mo.mpl.interactive(fig_resps)%0A%20%20%20%20plt.gca()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
559e493af1cff4beb1db87d2bde7bf1fdfb12984cbe7436621cf233bba30d6cb