IQ FM Demodulation of Wow and Flutter Signal in Software Background:

I have a recording device that exhibits Wow and Flutter, or periodic frequency deviation. I use this device to record a calibrated 3.15kHz test tone from a tape film to generate a .wav file on my PC.

In an ideal world, an FFT on the data contained in the .wav file would result in a single sharp peak at 3.15kHz. In the real world, there is deviation in this frequency due to mechanical errors such as head scrape, non-concentric film rollers, motor vibration which all cause the tape film to either speed up or slow down slightly.

These deviations are called Wow and Flutter, and appear as errors frequency modulated by the 3.15kHz test tone.

What I would like to do:

Assume I have the .wav file, sampled at 48kHz. Let's say it contains an FM waveform with carrier frequency at 3.15kHz, and a message signal with bandwidth ~200Hz.

I'd like to build a python script to analyse and demodulate the signal to give me just the 200Hz signal. I've tried several models across the internet simulating PLLs, slope detectors etc. But these are all hard coded difficult to understand and I just can't seem to mould them to be used in my application.

I want to try implementing an IQ FM demodulator but I am unable to find a good reference to how FM waves are modulated via IQ signals and I definitely can't find one for demodulation.

Can someone point me in the right direction and let me know off the bat if there are any problems or roadblocks with what I'm trying to do?
Frequency is the derivative (or 1st difference) of phase.  To get an IQ signal from which you can get phase angles, first multiply your wave file samples by a cosine at 3.15kHz and a sinewave at a frequency of 3.15kHz.  That will hetrodyne your signal down to baseband IQ.  Use atan2 of the IQ array to get an array of  angles, take the 1st difference between successive angles, and note that big jumps in phase differences will likely need to be unwrapped to a smaller range.  Then low pass filter (with a 200 Hz cutoff) the result. That's a simplified FM demodulator .  See if that looks close to what you are looking for.