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

📄 vtest27.c

📁 RS,Viterbi,Sequence 编解码C源代码
💻 C
字号:
/* Test viterbi decoder speeds */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>
#include <time.h>
#include <sys/times.h>
#include "viterbi27.h"
#include "parity.h"

struct option Options[] = {
  {"frame-length",1,NULL,'l'},
  {"frame-count",1,NULL,'n'},
  {NULL},
};


int main(int argc,char *argv[]){
  int i,d,tr;
  int sr=0,trials = 1000,errcnt=0,framebits=2048;
  int *bits,*symbols;
  struct v27 *vp;
  extern char *optarg;
  unsigned char *data;
  struct tms start,finish;
  double extime;

#if defined(SSE2)
  printf("k=7 r=1/2 Viterbi decoder, SSE2 version\n");
#elif defined(SSE)
  printf("k=7 r=1/2 Viterbi decoder, SSE version\n");
#elif defined(MMX)
  printf("k=7 r=1/2 Viterbi decoder, MMX version\n");
#else
  printf("k=7 r=1/2 Viterbi decoder, portable C version\n");
#endif

  while((d = getopt_long(argc,argv,"l:n:t",Options,NULL)) != EOF){
    switch(d){
    case 'l':
      framebits = atoi(optarg);
      break;
    case 'n':
      trials = atoi(optarg);
      break;
    }
  }
  bits = malloc((framebits+6)*sizeof(int));
  data = malloc(framebits/8);
  symbols = malloc(2*(framebits+6)*sizeof(int));

  if((vp = create_viterbi27(framebits)) == NULL){
    printf("create_viterbi27 failed\n");
    exit(1);
  }
  /* Encode a frame of random data */
  for(i=0;i<framebits+6;i++){
    bits[i] = (i < framebits) ? (random() & 1) : 0;
    //bits[i] = 1;
    sr = (sr << 1) | bits[i];
    symbols[2*i] = parity(sr & V27POLYA) ? 15:0;
    symbols[2*i+1] = parity(sr & V27POLYB) ? 15:0;
  }
  /* Decode it and make sure we get the right answer */
  /* Initialize Viterbi decoder */
  init_viterbi27(vp,0);

  /* Decode block */
  for(i=0;i<framebits+6;i++){
    d = update_viterbi27(vp,symbols[2*i],symbols[2*i+1]);
    if(d){
      printf("%d: normalize %d\n",i,d);
    }
  }
  /* Do Viterbi chainback */
  chainback_viterbi27(vp,data,framebits,0);
  for(i=0;i<framebits;i++){
    d = data[i/8] & (0x80 >> (i%8)) ? 1 : 0;
    if(d != bits[i]){
      printf("bit %d: %d %d\n",i,bits[i],d);
      errcnt++;
    }
  }
  if(errcnt == 0){
    printf("No decoder errors\n");
  }
  /* Do time trials */
  times(&start);
  for(tr=0;tr < trials;tr++){
    /* Initialize Viterbi decoder */
    init_viterbi27(vp,0);
    
    /* Decode block */
    for(i=0;i<framebits;i++){
      update_viterbi27(vp,symbols[2*i],symbols[2*i+1]);
    }
    /* Do Viterbi chainback */
    chainback_viterbi27(vp,data,framebits,0);
  }
  times(&finish);
#if defined(MMX) || defined(SSE)
  asm("emms");
#endif
  extime = ((double)(finish.tms_utime-start.tms_utime))/CLK_TCK;
  printf("Execution time for %d %d-bit frames: %.2f sec\n",trials,
	 framebits,extime);
  printf("decoder speed: %g bits/s\n",trials*framebits/extime);
  exit(0);
}

⌨️ 快捷键说明

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