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

📄 rmtest.c

📁 快速傅立叶变换程序代码,学信号的同学,可要注意了
💻 C
字号:
/*  RMtest.c  April 1997 DJCM (c)  demonstrates a few uses of RM.c, which   contains routines for creating RM trellises and Hamming too,  and for doing belief propagation on them  the trellis goes from l=0 to N, with   the number of emitted bits being N.   from 0 to 1, bit 1 is emitted.  from N-1 to N, bit N is emitted. */#include "./ansi/r.h"#include "./ansi/rand2.h"#include "./ansi/mynr.h"#include "./ansi/cmatrix.h"#include "./RM.h" void   main ( int , char ** ) ;void   show ( linear_trellis *t , int i ) ;/*        MAIN                     */void main ( int argc, char *argv[] ){  double l0 = -2.19722 , l ;  linear_trellis t ;  int verbosity = 0 ;   int type = 1 ; /* type 1 makes hamming and RM codes; type 0 makes Gallager */  double fn = 0.1 ;  double delta = 0.001 ;  double origS , origS1 , origSrest ;   int i ;   int flipone = 1 ;    /* these control the convergence- of- the- lagrange- multiplier experiments*/  int N = 7 ; /*  trellis length */  int diversity = 1 ;  double fudgedef = 0.68 ;  double slope = -0.2 ;  l0 = 3;  /* *************** */  if(0) {    printf ( "first, let's show a load of trellises\n");    printf ( "============================\n");    make_linear_trellis ( &t , 7 , 1, verbosity ) ;  }  make_linear_trellis ( &t , N , 0, verbosity ) ;  t.computeS = 1 ;  make_energy_trellis ( &t );  if(verbosity) {    pause_for_return();    printf ( "Now see fb happening, when the received vector looks like 0,0,0,0,0\n");    /* invent a q vector */  }  l = l0 ;  for ( i= 1; i<= t.N ; i++ ) {    fn = 1.0/(1.0 + exp( - l )) ;    if(i==1) {      t.q[i][1] = 1.0 - fn ; t.q[i][0] = fn ;    } else {      t.q[i][0] = 1.0 - fn ; t.q[i][1] = fn ;    }     l += slope ;    t.lpob[i] = l ;  }    t.T = 40 ;  if ( diversity ) {    t.fudgeperiod = 3 ;    t.fudge[3] = 0.1  ;    t.fudge[4] = 0.25  ;    t.fudge[0] = 0.5  ;    t.fudge[1] = 1.0  ;    t.fudge[2] = 0.68 ;  } else {    t.fudgeperiod = 1 ;    t.fudge[0] = fudgedef  ;    t.fudge[1] = fudgedef  ;  }  lt_match(&t) ;    exit(0);  lt_fb ( &t ) ;  show (&t,2 ) ;  origS = t.S ;  origS1 = t.S1 ;  origSrest = origS - origS1  ;  if(verbosity) {    pause_for_return();  }  l=l0;   for ( i=1; i<=t.N ; i++ ) {    if (verbosity>-1) { printf ("PERTURB %d\n" , i ) ; }    l += delta ;    fn = 1.0/(1.0 + exp( - l )) ;     t.q[i][0] = 1.0 - fn ; t.q[i][1] = fn ;    lt_fb ( &t ) ;     show (&t,1 ) ;    if(verbosity) {      pause_for_return();    }    printf(" EMPIRICAL DERIVS %d %9.7g ( %9.7g %9.7g)\n" , i ,  (t.S - origS) / delta ,  (t.S1 - origS1) / delta ,  ((t.S-t.S1) - origSrest) / delta );     l -= delta ;    fn = 1.0/(1.0 + exp( - l )) ;     t.q[i][0] = 1.0 - fn ; t.q[i][1] = fn ;    l +=0.05 ;  }      if ( flipone ) {     printf ( "Now the received vector is (1,0,0,0,0..) \n");    fn =  t.q[1][1] ;  t.q[1][1] = t.q[1][0] ; t.q[1][0]  = fn ;    lt_fb ( &t ) ;     pause_for_return();  }  printf ( "Now see fb happening at a sequence of different noise levels\n");  pause_for_return();  for ( fn = 0.02 ; fn <= 0.5 ; fn += 0.04 ) {    printf ("fn = %9.5g ========== \n",fn) ;     for ( i= 1; i<= t.N ; i++ ) {      t.q[i][0] = 1.0 - fn ; t.q[i][1] = fn ;    }    if ( flipone ) { t.q[1][0] = fn ; t.q[1][1] =  1.0 - fn ; }    lt_fb ( &t ) ;     pause_for_return();  }  free_energy_trellis ( &t );}void   show ( linear_trellis *h , int localverbose ) {  int verbose = h->verbose ;   int N = h->N ;  double **Scbit = h->Scbit ;   double *dSdpo = h->dSdpo ;   double *dSdl = h->dSdl ;   double *Srest = h->Srest ;   double **po = h->po ;   double **r = h->r ;   double **q = h->q ;   int l  ;  for ( l = 1 ; l <= N ; l ++ ) {    printf("%9.5g, ", q[l][1] ) ;  }  printf(" -> Entropy %9.5g (%9.5g bits)\n", h->S , h->S/log(2.0) );  if(localverbose) {    printf(" Entropy of whole trellis : %9.5g\n" , h->S ) ;    printf(" Entropy of trellis step 1: %9.5g\n" , h->S1 ) ;    printf(" Entropy of rest          : %9.5g\n" , h->S - h->S1 ) ;  }  if(localverbose>1) {    printf("\n DERIV (w r t posterior) \n dS/dp(i) \t\t  w.r.t. logit\n" );    for ( l = 1 ; l <= N ; l ++ ) {       printf("%d %9.5g (%9.5g %9.5g)\t %9.5g (%9.5g %9.5g)\n",	       l , dSdpo[l] , log ( po[l][0] / po[l][1] ) ,	       (r[l][1] * (Scbit[l][1]-Srest[l]) - r[l][0] * ( Scbit[l][0] - Srest[l] ))/h->ML,	       dSdl[l] , log ( po[l][0] / po[l][1] )  * po[l][0] * po[l][1] ,	       ( r[l][1] * (Scbit[l][1]-Srest[l]) - r[l][0] * ( Scbit[l][0] - Srest[l] )  )  * q[l][0]*q[l][1]/h->ML  ) ;          }  }}/*<!-- hhmts start -->Last modified: Tue Jul 15 17:14:44 1997<!-- hhmts end -->*/

⌨️ 快捷键说明

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