📄 ddcarriertracker.cpp
字号:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "DDCarrierTracker.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
__fastcall DDCarrierTracker::DDCarrierTracker()
{
//c_settings=GetSettings();
Pts.resize(32);
Mags.resize(32);
PowerMultiplyer=1;
SetStable();
}
double __fastcall DDCarrierTracker::Update(PtComplex x)
{
//Calculate rotation correction
PtComplex mindis;
PtComplex dis;
mindis.re=1000000000;
mindis.im=1000000000;
for(int i=0;i<(gSettings.DemodMajor.CMapQAMAmpsSize);i++)
{
dis.re=gSettings.DemodMajor.CMapQAMAmps[i]-x.re;
dis.re*=dis.re;
dis.im=gSettings.DemodMajor.CMapQAMAmps[i]-x.im;
dis.im*=dis.im;
if(dis.re<mindis.re)
{
mindis.re=dis.re;
RectifidedPoint.re=gSettings.DemodMajor.CMapQAMAmps[i];
RectifidedPointInt.re=i;
}
if(dis.im<mindis.im)
{
mindis.im=dis.im;
RectifidedPoint.im=gSettings.DemodMajor.CMapQAMAmps[i];
RectifidedPointInt.im=i;
}
}
PtSum.re-=Pts[Ptr].re;
PtSum.im-=Pts[Ptr].im;
Pts[Ptr].re=x.re*RectifidedPoint.re+x.im*RectifidedPoint.im;
Pts[Ptr].im=x.im*RectifidedPoint.re-x.re*RectifidedPoint.im;
PtSum.re+=Pts[Ptr].re;
PtSum.im+=Pts[Ptr].im;
Ptr++;Ptr%=Pts.size();
if(PtSum.re==0)Angle=0;
else Angle=PtSum.im/PtSum.re; //small angle approx
if((Angle>0.18)||(Angle<-0.18))Angle=0;
//Calculate Gain correction
//if(!(gSettings.DemodMinor.SlowLock))
if(!(gSettings.DemodMinor.Locked))
{
MagSum-=Mags[MagsPtr];
double b=(x.re*x.re+x.im*x.im);
if(b==0)b=1;
Mags[MagsPtr]=GetAngle.ApproxSqrt((RectifidedPoint.re*RectifidedPoint.re+RectifidedPoint.im*RectifidedPoint.im)/b);
MagSum+=Mags[MagsPtr];
MagsPtr++;MagsPtr%=Mags.size();
if(gSettings.DemodMinor.Locked)PowerMultiplyer+=((MagSum/Mags.size())-1)/100000;
else PowerMultiplyer+=((MagSum/Mags.size())-1)/10000;
}
return Angle;
}
void __fastcall DDCarrierTracker::SetStable()
{
for(unsigned int i=0;i<Mags.size();i++)
{
Mags[i]=PowerMultiplyer;
}
for(unsigned int i=0;i<Pts.size();i++)
{
Pts[i].re=0;
Pts[i].im=0;
}
Ptr=0;
MagsPtr=0;
MagSum=PowerMultiplyer*Mags.size();
PtSum.re=0;
PtSum.im=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -