?? mcma.cpp
字號:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "MCMA.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
PtComplex __fastcall MCMA::Update(PtComplex rec)
{
if(!IterateOnNextUpdate)
{
LastRecivedPt.re=rec.re;
LastRecivedPt.im=rec.im;
return rec;
}
int i;
for(i=0;i<numberofpoints-2;i++)
{
x[i]=x[i+2];
}
x[numberofpoints-1].re=rec.re;
x[numberofpoints-1].im=rec.im;
x[numberofpoints-2].re=LastRecivedPt.re;
x[numberofpoints-2].im=LastRecivedPt.im;
y.re=0;y.im=0;
for(i=0;i<numberofpoints;i++)
{
//x*w
y.re+=x[i].re*w[i].re-x[i].im*w[i].im;
y.im+=x[i].re*w[i].im+x[i].im*w[i].re;
}
return y;
}
__fastcall MCMA::MCMA()
{
w=0;x=0;
IterateOnNextUpdate=true;
numberofpoints=100;
w=new PtComplex[numberofpoints];
x=new PtComplex[numberofpoints];
for(int i=0;i<numberofpoints;i++){x[i].re=0;x[i].im=0;}
delta.re=0.3;
delta.im=0.3;
mu.re=0.003;
mu.im=0.003;
y.re=0;y.im=0;
ReInitLock();
}
__fastcall MCMA::~MCMA()
{
if(w)delete [] w;
if(x)delete [] x;
}
void __fastcall MCMA::Iterate()
{
PtComplex tmp;
PtComplex epsilon;
tmp.re=(y.re*y.re);
tmp.im=(y.im*y.im);
if((tmp.re+tmp.im)>10000000){ReInitLock();return;}
PtComplex tmindis;
PtComplex tdis;
tmindis.re=1000000000;
tmindis.im=1000000000;
for(int i=0;i<(gSettings.DemodMajor.CMapQAMAmpsSize);i++)
{
tdis.re=gSettings.DemodMajor.CMapQAMAmps[i]-y.re;
tdis.re*=tdis.re;
tdis.im=gSettings.DemodMajor.CMapQAMAmps[i]-y.im;
tdis.im*=tdis.im;
if(tdis.re<tmindis.re)
{
tmindis.re=tdis.re;
delta.re=gSettings.DemodMajor.CMapQAMAmps[i];
}
if(tdis.im<tmindis.im)
{
tmindis.im=tdis.im;
delta.im=gSettings.DemodMajor.CMapQAMAmps[i];
}
}
if(!(gSettings.DemodMinor.Ama))
{
delta.im=gSettings.DemodMajor.BetaSquared;
delta.re=gSettings.DemodMajor.BetaSquared;
epsilon.re=y.re*(tmp.re-delta.re);
epsilon.im=y.im*(tmp.im-delta.im);
}
else
{
epsilon.re=(y.re-delta.re);
epsilon.im=(y.im-delta.im);
if(gSettings.DemodMinor.SlowLock)
{
double mu2=mu.re/2.0;
for(int i=numberofpoints-1;i>=0;i--)
{
//w=w-mu*x_bar*e
w[i].re=w[i].re-mu2*(x[i].re*epsilon.re+x[i].im*epsilon.im);
w[i].im=w[i].im-mu2*(x[i].re*epsilon.im-x[i].im*epsilon.re);
}
return;
}
}
for(int i=numberofpoints-1;i>=0;i--)
{
//w=w-mu*x_bar*e
w[i].re=w[i].re-mu.re*(x[i].re*epsilon.re+x[i].im*epsilon.im);
w[i].im=w[i].im-mu.im*(x[i].re*epsilon.im-x[i].im*epsilon.re);
}
}
void __fastcall MCMA::ReInitLock()
{
for(int i=0;i<numberofpoints;i++){w[i].re=0.000;w[i].im=0.000;}
w[numberofpoints/2+1].re=1.0;
w[numberofpoints/2].im=0.0;
gSettings.DemodMinor.Ama=false;
gSettings.DemodMinor.SlowLock=false;
}
//---------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -