📄 demod.cpp
字号:
int F288_FROZE_LOCK;
F288_FROZE_LOCK=flag;
int address=0x50;
register_[address]&=0xDF;
register_[address]|=(F288_FROZE_LOCK<<5);
demod_setdata(address,register_[address]);
}
void Cdemod::demod_288_fine(long Symbolrate_Bds, long Known, int *register_)
{
int address;
long i=0;
long fmin=0;
long fmax=0;
long MasterClock_Hz;
MasterClock_Hz=demod_288_get_mclk_freq(register_);
CString t;
if(Known)
{
//仠曄峏[060529]丗1Msps懳墳丂僔儞儃儖儗乕僩堷偒崬傒斖埻傪嫹傔傞偲岠壥偁傞丠丠
/* +/- 1% search range */
fmin=long( ((Symbolrate_Bds/1000)*0.99*32768) /(MasterClock_Hz/1000)); /* 2^15=32768*/
fmax=long( ((Symbolrate_Bds/1000)*1.01*32768) /(MasterClock_Hz/1000));
// /* +/- 5% search range */
// fmin=long( ((Symbolrate_Bds/1000)*0.95*32768) /(MasterClock_Hz/1000)); /* 2^15=32768*/
// fmax=long( ((Symbolrate_Bds/1000)*1.05*32768) /(MasterClock_Hz/1000));
//t.Format("::demod_288_fine[仠Known]/fmin=%.4X,fmax=%.4X",fmin,fmax); message(t);
}
else
{
//僆儕僕僫儖
/* +/- 15% search range */
fmin=long(((Symbolrate_Bds/1000)*0.85*32768)/(MasterClock_Hz/1000)); /* 2^15=32768*/
fmax=long(((Symbolrate_Bds/1000)*1.15*32768)/(MasterClock_Hz/1000));
/* fine loop start from high limit when symbol rate is unknown */
demod_288_set_symbolrate(long(Symbolrate_Bds*1.1),register_);
}
address=0x53;
register_[address]=(1<<7)|MSB(fmin); //F288_STOP_ON_FMIN=1
demod_setdata(address,register_[address]);
address+=1;
register_[address]=LSB(fmin);
demod_setdata(address,register_[address]);
address+=1;
register_[address]=MSB(fmax);
demod_setdata(address,register_[address]);
address+=1;
register_[address]=LSB(fmax);
demod_setdata(address,register_[address]);
address+=1;
register_[address]=MAX( (Symbolrate_Bds/1000000),1 );
demod_setdata(address,register_[address]);
demod_288_start_fine_algorithm(1,register_); /* start fine algorithm */
i=0;
int F288_FINE;
int flag;
address=0x50;
do
{
//V0.04[061109] [STB0288+ix2410]
//1ms -> 10ms
WAIT_N_MS(10); //<---
// // WAIT_N_MS(1);
// WAIT_N_MS(1); //test?? 060525
message("WAIT_N_MS(10)");
//message("WAIT_N_MS(1)");
i++;
demod_getdata(address,&F288_FINE);
flag=(F288_FINE>>1)&0x01;
t.Format(" (demod_288_fine/[%d] flag=%ld)",i,flag); message(t);
//仠曄峏丗僒乕僠夞悢惂尷捛壛:100夞
}while( (flag) && (i<100) ); /* wait for end of fine algorithm */
// <- loop num is 100 times in spite of wait time modified :1ms -> 10ms
//}while(flag); /* wait for end of fine algorithm */
demod_288_start_fine_algorithm(0,register_); /* stop fine algorithm */
}
long Cdemod::demod_288_autocenter(int *register_)
{
CString t;
long timeout=0,timing;
// int address;
// address=0x22;
// int F288_TIMING_LOOP_FREQ_MSB;
// int F288_TIMING_LOOP_FREQ_LSB;
demod_288_start_autocenter_algorithm(1,register_); /* Start autocentre algorithm */
do
{
t.Format(" (%.3d )",timeout); message(t);
WAIT_N_MS(10); /* wait 10 ms */
message("WAIT_N_MS(10)");
timeout++;
timing=demod_288_get_timing_loop(register_);
// demod_getdata(address,&F288_TIMING_LOOP_FREQ_MSB);
// demod_getdata(address+1,&F288_TIMING_LOOP_FREQ_LSB);
// timing=BYTES2WORD(F288_TIMING_LOOP_FREQ_MSB,F288_TIMING_LOOP_FREQ_LSB);
//t.Format(" (demod_288_autocenter: timing=%ld \t(%.8X) )",timing,timing); message(t);
// //仠曄峏丗亄亅嬌惈愝掕
// if(timing>0x10000/2) { //2's complement
// timing=0x10000-timing;
// timing*=-1;
// }
t.Format(" (demod_288_autocenter: timing=%ld \t(%.8X) )",timing,timing); message(t);
}while((ABS(timing)>300) && (timeout<100)); /* timing loop is centered or timeout limit is reached */
demod_288_start_autocenter_algorithm(0,register_); /* Stop autocentre algorithm */
return timing;
}
void Cdemod::demod_288_start_autocenter_algorithm(int flag, int *register_)
{
int address=0x50;
register_[address]&=0xFB;
register_[address]|=(flag<<2);
demod_setdata(address,register_[address]);
}
int Cdemod::demod_288_get_cf(int *register_)
{
int CF;
int address=0x24,data;
demod_getdata(address,&data);
CF=(data>>7)&0x01;
return CF;
}
long Cdemod::demod_288_data_timing_constant(long SymbolRate, int *register_)
{
int address;
int data;
long Tviterbi = 0,
TimeOut = 0,
THysteresis = 0,
Tdata = 0,
PhaseNumber[6] = {2,6,4,6,14,8},
averaging[4] = {1024,4096,16384,65536},
InnerCode = 1000,
HigherRate = 1000;
long i;
int Pr,Sn,To,Hy;
/*=======================================================================
-- Data capture time (in ms)
-- -------------------------
-- This time is due to the Viterbi synchronisation.
--
-- For each authorized inner code, the Viterbi search time is calculated,
-- and the results are cumulated in ViterbiSearch.
-- InnerCode is multiplied by 1000 in order to obtain timings in ms
=======================================================================*/
//Pr=ChipGetOneRegister(hDemod,R288_PR);
address=0x37;
demod_getdata(address,&Pr);
address=0x38;
demod_getdata(address,&data);
Sn=(data>>4)&0x03;
To=(data>>2)&0x03;
Hy=data&0x03;
for(i=0;i<6;i++)
{
if (((Pr >> i)& 0x01) == 0x01)
{
switch(i)
{
case 0: /* inner code 1/2 */
InnerCode = 2000; /* 2.0 */
break;
case 1: /* inner code 2/3 */
InnerCode = 1500; /* 1.5 */
break;
case 2: /* inner code 3/4 */
InnerCode = 1333; /* 1.333 */
break;
case 3: /* inner code 5/6 */
InnerCode = 1200; /* 1.2 */
break;
case 4: /* inner code 6/7 */
InnerCode = 1167; /* 1.667 */
break;
case 5: /* inner code 7/8 */
InnerCode = 1143; /* 1.143 */
break;
}
Tviterbi += (2*PhaseNumber[i]*averaging[Sn]*InnerCode);
if(HigherRate < InnerCode)
HigherRate = InnerCode;
}
}
/* Time out calculation (TimeOut)
-- ------------------------------
-- This value indicates the maximum duration of the synchro word research. */
TimeOut = long(HigherRate * 16384L * (1L<<To)); /* 16384= 16x1024 bits */
/* Hysteresis duration (Hysteresis)
-- ------------------------------ */
THysteresis = long(HigherRate * 26112L * (1L<<Hy)); /* 26112= 16x204x8 bits */
Tdata =((Tviterbi + TimeOut + THysteresis) / (2*long(SymbolRate) ));
/* a guard time of 1 mS is added */
return (1L + (long)Tdata);
}
BOOL Cdemod::demod_288_waitlock(long TData,int *register_)
{
//V0.05[061204] [TILT4]
//wait time set twice??
TData*=2;
//V0.04[061109] [STB0288+ix2410]
//1ms -> 10ms
//----------------------
CString t;
t.Format(" (demod_288_waitlock: TData=%ld)",TData); message(t);
int address=0x24;
int data;
long timeout=0;
BOOL lock;
do
{
WAIT_N_MS(10); //wait 1 ms //<---
//WAIT_N_MS(1); //wait 1 ms
message("WAIT_N_MS(1)");
timeout+=10; //<---
//timeout++;
demod_getdata(address,&data);
lock=(data>>3)&0x01;
t.Format(" (demod_288_waitlock: lock= %ld (%.2X) \t[%d] )",lock,data,timeout ); message(t);
if(lock==1) {
t.Format("---> demod_288_waitlock/OK!!"); message(t);
message("");
}
}while(!lock && (timeout<TData+10)); //<---
// }while(!lock && (timeout<TData));
return lock;
//----------------------
//CString t;
//t.Format(" (demod_288_waitlock: TData=%ld)",TData); message(t);
//
// int address=0x24;
// int data;
// long timeout=0;
// BOOL lock;
// do
// {
// WAIT_N_MS(1); /* wait 1 ms */
//
//message("WAIT_N_MS(1)");
//
//
// timeout++;
// demod_getdata(address,&data);
// lock=(data>>3)&0x01;
//t.Format(" (demod_288_waitlock: lock=%ld \t[%d] )",lock,timeout); message(t);
// }while(!lock && (timeout<TData));
// return lock;
}
int Cdemod::demod_288_get_pr(int *register_)
{
int address=0x24;
int data;
demod_getdata(address,&data);
register_[address]=data;
return data&0x07;
}
//#define test 1
void Cdemod::demod_288_init(int *register_)
{
int address;
int data;
#ifdef test //Def288Val[STX288_NBREGS]
// register_[0x00]=0x10;
// register_[0x01]=0x15;/* 0xa5; */
// register_[0x02]=0x20;
// register_[0x03]=0x8e;
// register_[0x04]=0x8e;
// register_[0x05]=0x12;
// register_[0x06]=0x00;
// register_[0x07]=0x20;
// register_[0x08]=0x00;
// register_[0x09]=0x00;
// register_[0x0a]=0x04;
// register_[0x0b]=0x00;
// register_[0x0c]=0x00;
// register_[0x0d]=0x00;
// register_[0x0e]=0xc4; /* 0xd4; agc pol */
// register_[0x0f]=0x54; /*0x30; AGC REF*/
// register_[0x10]=0xf2;
// register_[0x11]=0x7a;
// register_[0x12]=0x03;
// register_[0x13]=0x48;
// register_[0x14]=0x84;
// register_[0x15]=0xc5;
// register_[0x16]=0xb7;
// register_[0x17]=0x9c;
// register_[0x18]=0x00;
// register_[0x19]=0xa6;
// register_[0x1a]=0x88;
// register_[0x1b]=0x8f;
// register_[0x1c]=0xf0;
// register_[0x1e]=0x80;
// register_[0x1f]=0x26;
// register_[0x20]=0x0b;
// register_[0x21]=0x54;
// register_[0x22]=0xff;
// register_[0x23]=0x01;
// register_[0x24]=0x9a;
// register_[0x25]=0x7f;
// register_[0x26]=0x00;
// register_[0x27]=0x00;
// register_[0x28]=0x46;
// register_[0x29]=0x66;
// register_[0x2a]=0x90;
// register_[0x2b]=0xfe;
// register_[0x2c]=0x78;
// register_[0x2d]=0x0e;
// register_[0x2e]=0x5d;
// register_[0x2f]=0x00;
// register_[0x30]=0x00;
// register_[0x31]=0x1e;
// register_[0x32]=0x14;
// register_[0x33]=0x0f;
// register_[0x34]=0x09;
// register_[0x35]=0x0c;
// register_[0x36]=0x05;
// register_[0x37]=0x2f;
// register_[0x38]=0x16;
// register_[0x39]=0xbd;
// register_[0x3a]=0x00;
// register_[0x3b]=0x13;
// register_[0x3c]=0x11;
// register_[0x3d]=0x30;
// register_[0x3e]=0x00;
// register_[0x3f]=0x00;
// register_[0x40]=0x63;
// register_[0x41]=0x04;
// register_[0x42]=0x60;
// register_[0x43]=0x00;
// register_[0x44]=0x00;
// register_[0x45]=0x00;
// register_[0x46]=0x00;
// register_[0x47]=0x00;
// register_[0x4a]=0x00;
// register_[0x4b]=0x1b;
// register_[0x4c]=0x28;
// register_[0x50]=0x10;
// register_[0x51]=0x36;
// register_[0x52]=0x12; //0x09 (KC,KS : 001 -> 010)
// register_[0x53]=0x94;
// register_[0x54]=0xb2;
// register_[0x55]=0x29;
// register_[0x56]=0x64;
// register_[0x57]=0x2b;
// register_[0x58]=0x54;
// register_[0x59]=0x86;
// register_[0x5a]=0x00;
// register_[0x5b]=0x9b;
// register_[0x5c]=0x08;
// register_[0x5d]=0x7f;
// register_[0x5e]=0xff;
// register_[0x5f]=0x8d;
// register_[0x60]=0x82;
// register_[0x61]=0x82;
// register_[0x62]=0x82;
// register_[0x63]=0x02;
// register_[0x64]=0x02;
// register_[0x65]=0x02;
// register_[0x66]=0x82;
// register_[0x67]=0x82;
// register_[0x68]=0x82;
// register_[0x69]=0x82;
// register_[0x6a]=0x38;
// register_[0x6b]=0x0c;
// register_[0x6c]=0x00;
// register_[0x70]=0x00;
// register_[0x71]=0x00;
// register_[0x72]=0x00;
// register_[0x74]=0x00;
// register_[0x75]=0x00;
// register_[0x76]=0x00;
// register_[0x81]=0x00;
// register_[0x82]=0x3f;
// register_[0x83]=0x3f;
// register_[0x84]=0x00;
// register_[0x85]=0x00;
// register_[0x88]=0x00;
// register_[0x89]=0x00;
// register_[0x8a]=0x00;
// register_[0x8b]=0x00;
// register_[0x8c]=0x00;
// register_[0x90]=0x00;
// register_[0x91]=0x00;
// register_[0x92]=0x00;
// register_[0x93]=0x00;
// register_[0x94]=0x1c;
// register_[0x97]=0x00;
// register_[0xa0]=0x48;
// register_[0xa1]=0x00;
// register_[0xb0]=0xb8;
// register_[0xb1]=0x3a;
// register_[0xb2]=0x10;
// register_[0xb3]=0x82;
// register_[0xb4]=0x80;
// register_[0xb5]=0x82;
// register_[0xb6]=0x82;
// register_[0xb7]=0x82;
// register_[0xb8]=0x20;
// register_[0xb9]=0x00;
// register_[0xf0]=0x00;
// register_[0xf1]=0x00;
// register_[0xf2]=0xc0;
#endif
CString t;
//-----
int i;
for(i=0;i<=0xFF;i++)
{
if(register_[i]>=0)
{
address=i; data=register_[address];
demod_setdata(address,data);
// if(i%0x10==0){
// t.Format("%.2X",i); MessageBox(t);
// }
}
}
//-----
// //--------------------------------------------------
// address=0x0E; data=register_[address];
// demod_setdata(address,data);
// address=0x18; data=register_[address];
// demod_setdata(address,data);
// address=0x30; data=register_[address];
// demod_setdata(address,data);
// address=0x37; data=register_[address];
// demod_setdata(address,data);
// address=0x39; data=register_[address];
// demod_setdata(address,data);
// address=0x3C; data=register_[address];
// //--------------------------------------------------
}
long Cdemod::demod_288_get_error(int *register_)
{
CString t,tt;
long ber=0;
long i;
//Read registers仺disabled
// int address;
// address=0x16;
// demod_getdata(address,®ister_[address]);
// address=0x3B;
// demod_getdata(address,®ister_[address]);
// address=0x24;
// demod_getdata(address,®ister_[address]);
demod_288_get_error_count(); /* remove first counter value */
// /* Average 10 ber values */
// for(i=0;i<10;i++)
// {
// WAIT_N_MS(100);
// ber += FE_288_GetErrorCount(hChip,COUNTER1);
// }
// ber/=10;
int num=1;
for(i=0;i<num;i++)
{
WAIT_N_MS(100);
ber+=demod_288_get_error_count();
}
ber/=num;
t.Format("ber:%d\n",ber); tt=t;
if(demod_288_cf(register_)) //0x24
{
t.Format("demod_288_cf:%d\n",demod_288_cf(register_)); tt+=t;
t.Format("demod_288_errmode:%d\n",demod_288_errmode(register_)); tt+=t;
if(!demod_288_errmode(register_)) //0x3B
{
/* Error Rate */
ber *= 9766;
ber /= PowOf2(2 + 2*demod_288_noe(register_) ); //0x3B /* theses two lines => ber = ber * 10^7 */
}
t.Format("demod_288_errsource:%d\n",demod_288_errsource(register_)); tt+=t;
// switch(ChipGetFieldImage(hChip,F288_ERR_SOURCE))
switch(demod_288_errsource(register_) )
{
case 0 : /* QPSK bit errors */
ber /= 8;
t.Format("demod_288_pr:%d\n",demod_288_pr(register_)); tt+=t;
switch(demod_288_pr(register_))
{
case 0: /* PR 1/2 */
ber *= 1;
ber /= 2;
break;
case 1: /* PR 2/3 */
ber *= 2;
ber /= 3;
break;
case 2: /* PR 3/4 */
ber *= 3;
ber /= 4;
break;
case 3: /* PR 5/6 */
ber *= 5;
ber /= 6;
break ;
case 4: /* PR 6/7 */
ber *= 6;
ber /= 7;
break;
case 5: /* PR 7/8 */
ber *= 7;
ber /= 8;
break;
default :
ber = 0;
break;
}
break;
case 1: /* Viterbi bit errors */
ber /= 8;
break;
case 2: /* Viterbi byte errors */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -