⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddcarriertracker.cpp

📁 QAM module to use in Java with an easy interface and powerful performance
💻 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 + -