mirror of
https://github.com/SDRSharpR/SDRSharper.git
synced 2026-01-04 23:40:00 +01:00
112 lines
2.1 KiB
C#
112 lines
2.1 KiB
C#
namespace SDRSharp.Radio
|
|
{
|
|
public sealed class PmDetector
|
|
{
|
|
private const int PllDefaultFrequency = 57000;
|
|
|
|
private float _angState;
|
|
|
|
private float _meanAng;
|
|
|
|
private float _freqErr;
|
|
|
|
private float _avgMin;
|
|
|
|
private float _avgMax;
|
|
|
|
private float _avgMod;
|
|
|
|
private float _old;
|
|
|
|
private double _sampleRate;
|
|
|
|
public float FreqErr => this._freqErr;
|
|
|
|
public double SampleRate
|
|
{
|
|
set
|
|
{
|
|
this._sampleRate = value;
|
|
}
|
|
}
|
|
|
|
public unsafe void Demodulate(Complex* iq, float* audio, int length)
|
|
{
|
|
float num = 3.14159274f;
|
|
float num2 = 2f * num;
|
|
int num3 = Utils.PhaseGain;
|
|
if (this._sampleRate < 8000.0)
|
|
{
|
|
num3 /= 8;
|
|
}
|
|
else if (this._sampleRate < 24000.0)
|
|
{
|
|
num3 /= 4;
|
|
}
|
|
else if (this._sampleRate < 96000.0)
|
|
{
|
|
num3 /= 2;
|
|
}
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
float num4 = iq[i].Modulus();
|
|
this._avgMod = (this._avgMod * 999f + num4) / 1000f;
|
|
float num5 = iq[i].Argument();
|
|
float num6 = num5 - this._angState;
|
|
this._angState = num5;
|
|
if (num6 >= num)
|
|
{
|
|
num6 -= num2;
|
|
}
|
|
else if (num6 <= 0f - num)
|
|
{
|
|
num6 += num2;
|
|
}
|
|
if (num6 < 0f)
|
|
{
|
|
this._avgMin = (this._avgMin * 99f + num6) / 100f;
|
|
if (Utils.ChkAver && num6 < this._avgMin * 2f)
|
|
{
|
|
num6 = this._avgMin * 2f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this._avgMax = (this._avgMax * 99f + num6) / 100f;
|
|
if (Utils.ChkAver && num6 > this._avgMax * 2f)
|
|
{
|
|
num6 = this._avgMax * 2f;
|
|
}
|
|
}
|
|
if (num4 < this._avgMod / 2f)
|
|
{
|
|
num6 = this._old;
|
|
}
|
|
this._old = num6;
|
|
this._meanAng = (this._meanAng * (float)(Utils.PhaseAverage - 1) + num6) / (float)Utils.PhaseAverage;
|
|
float num7 = this._freqErr = this._meanAng * (float)num3;
|
|
audio[i] = this._freqErr * 5E-06f;
|
|
}
|
|
}
|
|
|
|
public unsafe void unwrap(float* ptr, int len)
|
|
{
|
|
float num = 6.28318548f;
|
|
float num2 = 0f;
|
|
for (int i = 1; i < len - 1; i++)
|
|
{
|
|
float num3 = ptr[i] - ptr[i - 1];
|
|
if ((double)num3 > 3.1415926535897931)
|
|
{
|
|
num2 -= num;
|
|
}
|
|
else if ((double)num3 <= 3.1415926535897931)
|
|
{
|
|
num2 += num;
|
|
}
|
|
ptr[i] += num2;
|
|
}
|
|
}
|
|
}
|
|
}
|