Вот:
Код:private double last_phase; // тут хранится значение фазы между вызовами
private const double TWO_PI = 2D * Math.PI;
public void Demodulate(Complex* iq, float* audio, int length)
{
var gain = FMGain;
if (_mode == FmMode.Narrow)
gain *= NarrowAFGain;
for (var i = 0; i < length; i++)
{
// Angle estimate
var phase = Math.Atan2(iq[i].Imag, iq[i].Real);
var dphase = phase - last_phase;
if (dphase < -Math.PI) dphase += TWO_PI;
if (dphase > Math.PI) dphase -= TWO_PI;
dphase /= Math.PI;
last_phase = phase;
// Scale
audio[i] = (float)(dphase * gain);
}
}