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

📄 demodulator.cpp

📁 QAM module to use in Java with an easy interface and powerful performance
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        }
        if(SpectrumForm->Showing)spec.Update(Data,size);
}


//---------------------------------------------------------------------------

void __fastcall Demodulator::AcquisitionStateMachine()
{

        if((gSettings.DemodMinor.Acquisitionstage==WaitingForLossOfLock)||(gSettings.DemodMinor.Acquisitionstage==WaitingForFrame))
        {
                //
        }
         else
         {

                if((!gSettings.DemodMinor.Ama)&&(gSettings.DemodMinor.Acquisitionstage!=WaitingForLock)&&(TryingFreqSettingAMANotOnTimeoutCnt>0))TryingFreqSettingAMANotOnTimeoutCnt--;
         }


        switch(gSettings.DemodMinor.Acquisitionstage)
        {
                case Resetting:
                        Cma.ReInitLock();
                        gSettings.DemodMinor.Status="Waiting For Carrier";
                        gSettings.DemodMinor.StatusChanged=true;
                        gSettings.DemodMinor.Acquisitionstage=WaitingForCarrier;
                break;
                case WaitingForCarrier:
                        LockCnt=0;
                        AdjSpeed=0.0;


                        //--new bit to test 27/march/08
                        AdjSum=0.0;
                        AdjCnt=0;;
                        //AdjSpeed=0.0;
                        //LockCnt=0;
                        //gSettings.DemodMinor.DCD=false;
                        gSettings.DemodMinor.Locked=false;
                        //gSettings.DemodMinor.Acquisitionstage=Resetting;
                        datadeformatter->GotFrame=false;
                        gSettings.DemodMinor.Ama=false;
                        gSettings.DemodMinor.SlowLock=false;
                        if(gSettings.DemodMajor.ConstalationSize==64)
                        gSettings.SetDemodMajor
                        (
                                true,//bool Active
                                16,//int ConstalationSize
                                1.0,//double Alpha
                                gSettings.DemodMajor.Gamma,//double Gamma
                                gSettings.DemodMajor.Firsize,//int Firsize
                                gSettings.DemodMajor.Freq,//double Freq
                                200,//int InterleavingLength
                                10,//int RSErrorPercent
                                200//int FramePriod
                        );
                        //--

                        if(gSettings.DemodMinor.DCD)
                        {
                                gSettings.NumOfBadPkts=0ui64;
                                gSettings.NumOfPkts=0ui64;
                                gSettings.NumOfWebPkts=0ui64;
                                gSettings.NumOfUnrealPkts=0ui64;
                                gSettings.NumOfUDPPkts=0ui64;
                                gSettings.NumOfRS232Pkts=0ui64;

                                gSettings.DemodMinor.Status="Waiting For Lock";
                                gSettings.DemodMinor.StatusChanged=true;
                                gSettings.DemodMinor.Acquisitionstage=WaitingForLock;
                        }
                break;
                case WaitingForLock:
                        LockCnt++;
                        if(gSettings.DemodMinor.Locked)
                        {
                                Cma.ReInitLock();
                                gSettings.DemodMinor.Status="Waiting For CMA To Finish";
                                gSettings.DemodMinor.StatusChanged=true;
                                gSettings.DemodMinor.Acquisitionstage=WaitingForCMAToFinish;
                        }
                break;
                case WaitingForCMAToFinish:
                        datadeformatter->tcm.autorotate=true;
                        gSettings.DemodMinor.Acquisitionstage=WaitingForAutoRotationToFinishForCMA;
                break;
                case WaitingForAutoRotationToFinishForCMA:
                        if(!datadeformatter->tcm.autorotate)
                        {
                                datadeformatter->tcm.tcmmsesum=0;
                                datadeformatter->tcm.tcmmseptr=0;
                                datadeformatter->tcm.tcmmse=-1;
                                gSettings.DemodMinor.Acquisitionstage=WaitingForTCMResopceForCMA;
                        }
                break;
                case WaitingForTCMResopceForCMA:
                        if(datadeformatter->tcm.tcmmse>0)
                        {
                                if(datadeformatter->tcm.tcmmse>CmaFinishedThreshold)
                                {
                                        gSettings.DemodMinor.Ama=false;
                                        gSettings.DemodMinor.Acquisitionstage=WaitingForCMAToFinish;
                                }
                                 else
                                 {
                                        amatimeout=SettingsForm->JvValidateEditAMATimeOut->Value;; // finish ama if we get more than 100000 symbols
                                        smse=datadeformatter->tcm.tcmmse;
                                        gSettings.DemodMinor.Status="Waiting For AMA To Finish";
                                        gSettings.DemodMinor.StatusChanged=true;
                                        gSettings.DemodMinor.Ama=true;
                                        gSettings.DemodMinor.Acquisitionstage=WaitingForAMAToFinish;
                                 }
                        }
                break;
                case WaitingForAMAToFinish:
                        datadeformatter->tcm.autorotate=true;
                        gSettings.DemodMinor.Acquisitionstage=WaitingForAutoRotationToFinishForAMA;
                break;
                case WaitingForAutoRotationToFinishForAMA:
                        if(!datadeformatter->tcm.autorotate)
                        {
                                datadeformatter->tcm.tcmmsesum=0;
                                datadeformatter->tcm.tcmmseptr=0;
                                datadeformatter->tcm.tcmmse=-1;
                                gSettings.DemodMinor.Acquisitionstage=WaitingForTCMMSEResponceForAMA;
                        }
                break;
                case WaitingForTCMMSEResponceForAMA:
                        if(amatimeout>0)amatimeout--;
                        if(datadeformatter->tcm.tcmmse>0)
                        {

                               // prob when sig pulses can fail ama cos goes above CmaFinishedThreshold
                               /*

                                if(datadeformatter->tcm.tcmmse>CmaFinishedThreshold)
                                {
                                        Cma.ReInitLock();
                                        gSettings.DemodMinor.Ama=false;
                                        gSettings.DemodMinor.Acquisitionstage=WaitingForCMAToFinish;
                                        break;
                                }  */

                                if((datadeformatter->tcm.tcmmse>AmaFinishedThreshold)&&(amatimeout>0))
                                {
                                        gSettings.DemodMinor.Acquisitionstage=WaitingForAMAToFinish;
                                }
                                 else
                                 {
                                        double msediff=datadeformatter->tcm.tcmmse-smse;
                                        smse=datadeformatter->tcm.tcmmse;
                                        if(fabs(msediff)<1.0)
                                        {
                                                gSettings.DemodMinor.Status="Waiting For Frame";
                                                gSettings.DemodMinor.StatusChanged=true;
                                                gSettings.DemodMinor.SlowLock=true;
                                                lockoffcntdown=100000;
                                                TryingFreqSettingAMANotOnTimeoutCnt=SettingsForm->JvValidateEditCMATimeOut->Value;
                                                SymbolCnt=0;
                                                gSettings.DemodMinor.Acquisitionstage=WaitingForFrame;
                                        }
                                         else
                                         {
                                                gSettings.DemodMinor.Acquisitionstage=WaitingForAMAToFinish;
                                         }
                                 }
                        }
                break;
                case WaitingForFrame:
                        if(datadeformatter->tcm.tcmmse>CmaFinishedThreshold)
                        {
                                if(lockoffcntdown>0)lockoffcntdown--;
                                 else
                                 {
                                        gSettings.DemodMinor.DCD=false;
                                        AdjSpeed=0.0;
                                        gSettings.DemodMinor.Locked=false;
                                        gSettings.DemodMinor.Acquisitionstage=Resetting;
                                        datadeformatter->GotFrame=false;
                                        gSettings.DemodMinor.Ama=false;
                                        gSettings.DemodMinor.SlowLock=false;
                                 }
                        }
                         else lockoffcntdown=100000;
                        if(datadeformatter->GotFrame)
                        {
                                N2=(gSettings.DemodMajor.InterleavingLength)*(gSettings.DemodMajor.InterleavingLength);
                                if(gSettings.DemodMajor.ConstalationSize==16)N2=(int)((double)N2*2.67);
                                 else N2=(int)((double)N2*1.6);
                                if(SymbolCnt==0)
                                {
                                        gSettings.DemodMinor.Status="Waiting For Interleaver To Fill";
                                        gSettings.DemodMinor.StatusChanged=true;
                                }
                                if(SymbolCnt>N2)
                                {
                                        gSettings.NumOfBadPkts=0ui64;
                                        gSettings.NumOfPkts=0ui64;
                                        gSettings.NumOfWebPkts=0ui64;
                                        gSettings.NumOfUnrealPkts=0ui64;
                                        gSettings.NumOfUDPPkts=0ui64;
                                        gSettings.NumOfRS232Pkts=0ui64;



                                        NumOfBadPkts=0;
                                        PktsTimer=0;
                                        BadBitsCountDown=0;
                                        gSettings.DemodMinor.Status="Waiting For Loss Of Lock";
                                        gSettings.DemodMinor.StatusChanged=true;
                                        gSettings.DemodMinor.Acquisitionstage=WaitingForLossOfLock;
                                }
                                 else SymbolCnt++;
                        }
                break;
                case WaitingForLossOfLock:
                        //gSettings.DemodMinor.Status=(AnsiString)"bad#="+gSettings.NumOfBadPkts+" #="+gSettings.NumOfPkts;
                        //gSettings.DemodMinor.StatusChanged=true;
                        if(PktsTimer>20000)
                        {
                                double dBadBits;
                                if(gSettings.DemodMajor.ConstalationSize==16)dBadBits=((double)NumOfBadPkts)/3.0;
                                 else dBadBits=((double)NumOfBadPkts)/5.0;
                                //gSettings.DemodMinor.Status=(AnsiString)"bad#="+gSettings.NumOfBadPkts+" #="+gSettings.NumOfPkts+" dBadBits="+dBadBits;
                                //gSettings.DemodMinor.StatusChanged=true;
                                if(dBadBits>30.0)
                                {
                                        BadBitsCountDown++;
                                        if(BadBitsCountDown>((N2/PktsTimer)+5))
                                        {
                                                gSettings.DemodMinor.DCD=false;
                                                AdjSpeed=0.0;
                                                gSettings.DemodMinor.Locked=false;
                                                gSettings.DemodMinor.Acquisitionstage=Resetting;
                                                datadeformatter->GotFrame=false;
                                                gSettings.DemodMinor.Ama=false;
                                                gSettings.DemodMinor.SlowLock=false;
                                        }
                                }
                                 else BadBitsCountDown=0;
                                NumOfBadPkts=0;
                                PktsTimer=0;
                        }
                        PktsTimer++;
                        if((datadeformatter->tcm.tcmmse>CmaFinishedThreshold))
                        {
                                if(lockoffcntdown>0)lockoffcntdown--;
                                 else
                                 {
                                        gSettings.DemodMinor.DCD=false;
                                        AdjSpeed=0.0;
                                        gSettings.DemodMinor.Locked=false;
                                        gSettings.DemodMinor.Acquisitionstage=Resetting;
                                        datadeformatter->GotFrame=false;
                                        gSettings.DemodMinor.Ama=false;
                                        gSettings.DemodMinor.SlowLock=false;
                                 }
                        }
                         else lockoffcntdown=100000;
                break;
        }

}


void __fastcall Demodulator::SettingsHaveChanged(NotificationEventType WhatHasChanged)
{


        if(gSettings.DemodMajor.ConstalationSize==16)
        {
                BuffSize=gSettings.DemodMajor.Firsize+1;
                BuffPtr=0;
                Buff.resize(BuffSize);
                for(int i=0;i<BuffSize;i++){Buff[i].re=0;Buff[i].im=0;}

                RootRaisedCosine *rrc;
                h.resize(gSettings.DemodMajor.Firsize);
                rrc=new RootRaisedCosine(gSettings.DemodMajor.Firsize,gSettings.DemodMajor.Symbol_Freq,gSettings.DemodMajor.Alpha,h.begin());
                delete rrc;

                Wt.SetFreq(gSettings.DemodMajor.Freq);

                st.SetCallsPerSymbol(4);


                AdjSum=0.0;
                AdjCnt=0;;
                AdjSpeed=0.0;
                LockCnt=0;

                gSettings.DemodMinor.DCD=false;
                gSettings.DemodMinor.Locked=false;
                gSettings.DemodMinor.Acquisitionstage=Resetting;
                datadeformatter->GotFrame=false;
                gSettings.DemodMinor.Ama=false;
                gSettings.DemodMinor.SlowLock=false;
        }


        TryingFreqSettingAMANotOnTimeoutCnt=SettingsForm->JvValidateEditCMATimeOut->Value;

        switch(gSettings.DemodMajor.ConstalationSize)
        {
                case 16:
                        CmaFinishedThreshold=SettingsForm->JvValidateEditQAM16CMAThreshold->Value;
                        AmaFinishedThreshold=SettingsForm->JvValidateEditQAM16AMAThreshold->Value;
                break;
                case 64:
                        CmaFinishedThreshold=SettingsForm->JvValidateEditQAM64CMAThreshold->Value;
                        AmaFinishedThreshold=SettingsForm->JvValidateEditQAM64AMAThreshold->Value;
                break;
        };

        Cma.mu.re=SettingsForm->JvValidateEditEqualizerStepSize->Value;
        Cma.mu.im=SettingsForm->JvValidateEditEqualizerStepSize->Value;
        FirSizeFactor=200000;
        if(SettingsForm->JvComboBoxFIRSize->ItemIndex==1)FirSizeFactor=400000;
        if(SettingsForm->JvComboBoxFIRSize->ItemIndex==2)FirSizeFactor=800000;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -