📄 demodulator.cpp
字号:
}
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 + -