Вот:
Код: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); } }