I have created a Common Lisp Library to receive samples of an FM signal from BladeRF1 SDR. I want to write a subroutine to implement FM demodulation. The input should be in the format of IQ data.
What is the algorithm for demodulating an FM signal?
I have created a Common Lisp Library to receive samples of an FM signal from BladeRF1 SDR. I want to write a subroutine to implement FM demodulation. The input should be in the format of IQ data.
What is the algorithm for demodulating an FM signal?
Assuming you understand how the FM signal is theoretically generated, here is a simplified strategy to start with. In an FM Signal (https://en.wikipedia.org/wiki/Frequency_modulation), the frequency of the carrier is modulated according to the message signal (mostly audio). The instantaneous frequency $f_c(t)$
$ f_c(t) = k*m(t) + f_0$
where $k$ is a modulation constant. The phase of the carrier as a function of time is
$\phi(t) = \int f_c(t) = k t m(t) + f_0 t + \phi_0$.
Theoretically you FM signal have infinite BW but as per the Carson's rule most of the BW is concentrated around $f_c$. You have to make sure that the IQ samples had sufficient BW around $f_c$. Once you extract the phase information from IQ samples, you can take first differential $\phi_n - \phi_{n-1}$ to get the instantaneous frequency information $f[n]$. The message signal $m[n]$ will be a proportionate of $f[n]$. With the knowledge of $k$ you should be able to get back (demodulate) the message signal. There are a lot of assumptions here though. You should be aware of $k$, Bandwidth of message signal, $f_c$ the center frequency etc.