I am not quite sure if you are asking how to perform the demodulation or how to down-mix a signal at some intermediate frequency to baseband prior to demodulation. I will assume the prior.
If you have the modulated signal it is quite easy to perform demodulation and recover the original signal.
Simply take the angle (atan2) of the output of a delay discriminator. If you are concerned with efficiency you can get fancier with your implementation. Example python code would look like the following:
# Calculate the complex vector between two adjacent data points
vectorDiff = data[1::1] * np.conjugate(data[0:-1:1]);
# Record the angle of the complex difference vectors
fmDemod = np.angle(tmp);
I recently wrote a blog post detailing an FM demodulator I wrote using Python. Here is a link. I used this project as an excuse to learn python and numpy.
** EDIT ** Quick and dirty way to perform down-conversion using the hilbert transform prior to FM demodulation (in python)
# Import the plotting library
from matplotlib import pyplot as plot
import scipy.signal
import numpy as np
# Define the setup
fCarrier = 10;
fAudio = 1;
fs = 1000;
timeEnd = 1;
time = np.linspace(0,2,fs*timeEnd);
# Create the signals
carrier = np.sin(2*np.pi*fCarrier*time);
audio = np.sin(2*np.pi*fAudio*time);
audioInt = -np.cos(2*np.pi*fAudio*time);
freqMod = np.sin(2*np.pi*fCarrier*time + 2*np.pi*1*audioInt);
# Downconvert
analyticSignal = scipy.signal.hilbert(freqMod); # wikipedia analytic signal
baseband = analyticSignal * np.exp(-2*np.pi*fCarrier*time*1j); # complex mixing
audioDemod = np.angle( baseband[1::1] * np.conjugate(baseband[0:-1:1]) ); # fm demod