Wavelet transform. This video by Artem Kirsanov made it click immediately, to the point I could implement it in Python right after watching the video: https://www.youtube.com/watch?v=jnxqHcObNK4.
For the uninitiated, wavlet transform is basically Fourier transform on steroids. Not only does it tell you what frequencies are present in a signal, it also tells you when they are present giving you a time vs. frequency plot (similar to short-time Fourier transform). Of course there is a limit to how well you can know both at the same time (just like the Heisenberg uncertainty principle actually!), but it's a very useful tool for studying signals. In my specific case, I was analyzing signals from a pulse oximeter in order to extract the breathing rate from them (https://dl.acm.org/doi/fullHtml/10.1145/3460238.3460254), but it has applications in many other fields such as image processing and compression.
For the uninitiated, wavlet transform is basically Fourier transform on steroids. Not only does it tell you what frequencies are present in a signal, it also tells you when they are present giving you a time vs. frequency plot (similar to short-time Fourier transform). Of course there is a limit to how well you can know both at the same time (just like the Heisenberg uncertainty principle actually!), but it's a very useful tool for studying signals. In my specific case, I was analyzing signals from a pulse oximeter in order to extract the breathing rate from them (https://dl.acm.org/doi/fullHtml/10.1145/3460238.3460254), but it has applications in many other fields such as image processing and compression.