# How to find a certain frequency in a signal that varies in time?

I have an EEG signal. It is amplitude verses time. I want to find out how certain frequencies in that signal vary with time.

One way I think I can do this is to do a short-time-Fourier-transform on it (that is, split it in small pieces and do a Fourier transform on each piece), then track the frequency I am interested in across the slices.

Is there a different/standard way of doing this? I only ask because Its going to be a lot of processing overhead doing it my way and I'm doing this in python.

thanks in advance

cleerline

• have you thought about time-frequency algorithm, such as Hilbert-Transform or Teager-Kaiser energy operator? What I would suggest is an Empirical Mode Decomposition (EMD).
– fpe
Commented Jul 24, 2015 at 11:43
• If you're only interested in a single frequency, then a narrow bandpass filter around the frequency of interest can tell you how it varies in amplitude and phase versus time. Commented Jul 24, 2015 at 12:24
• Another option would be to use an adaptive notch filtering algorithm (see e.g. here). This filter tracks the frequency with the highest power in the vicinity of an initialization frequency automatically. By examining the filter coefficients you can determine the variation of frequency and by examining the power of the removed part of the signal you can determine the change in power. Commented Aug 24, 2015 at 10:38

## 2 Answers

A simple solution, and possibly acceptable in your application, is to use a Goertzel filter. It's essentially a simple 2nd-order IIR bandpass filter whose center frequency is controlled by you. There's much info on the Internet regarding Goertzel filters. Good luck.

If I understood it right, you intend to figure out how some frequency content of a given signal evolves in time.

Next to short time Fast Fourier Transform, you have the opportunity to make use of a time-frequency analysis. I would suggest you to use either the Hilbert Transform (https://en.wikipedia.org/wiki/Hilbert_transform) or the Teager-Kaiser energy operator (http://folk.uio.no/eivindkv/ek-thesis-2003-05-12-final-2.pdf). Both methods are able to make estimation of istantaneous magnitude and frequency of a signal over time. I assume that your signal is multicomponent, therefore you should first isolate the frequency components you want to analyze by means e.g. of a filter-bank and then apply one of the two mentioned methods. Otherwise, you could directly go for an Empirical Mode Decomposition (https://en.wikipedia.org/wiki/Hilbert%E2%80%93Huang_transform). Such a method will decompose the signal in terms of frequency components: after that you can again apply Hilbert or Teager-Kaiser methods to check how your target-frequency develops over time.