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

📄 lfsr.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
字号:
/* * lfsr.c * */#include <stdio.h>#include "datatypes.h"uint32_t parity(uint32_t x) {  x ^= (x >> 16);  x ^= (x >> 8);  x ^= (x >> 4);  x ^= (x >> 2);  x ^= (x >> 1);  return x & 1;}/* typedef struct { *//*   uint32_t register[8]; *//* } lfsr_t; */voidcompute_period(uint32_t feedback_polynomial) {  int i;  v32_t lfsr;  v32_t mask;  mask.value = feedback_polynomial;  lfsr.value = 1;  printf("polynomial: %s\t", v32_bit_string(mask));  for (i=0; i < 256; i++) {/*     printf("%s\n", v32_bit_string(lfsr)); */    if (parity(mask.value & lfsr.value))      lfsr.value = ((lfsr.value << 1) | 1) & 0xff;    else      lfsr.value = (lfsr.value << 1) & 0xff;        /* now halt if we're back at the initial state */    if (lfsr.value == 1) {      printf("period: %d\n", i);      break;    }  }}uint32_t poly0 = 223;uint32_t polynomials[39] = {31, 47,55,59,61,79,87,91,103,107,109,115,117,121,143,151,157,167,171,173,179,181,185,199,203,205,211,213,227,229,233, 241,127,191,223, 239,247,251,253 };char binary_string[32];char *u32_bit_string(uint32_t x, unsigned int length) {  unsigned int mask;  int index;   mask = 1 << length;  index = 0;  for (; mask > 0; mask >>= 1)    if ((x & mask) == 0)      binary_string[index++] = '0';    else      binary_string[index++] = '1';  binary_string[index++] = 0;  /* NULL terminate string */  return binary_string;}extern int octet_weight[256];unsigned int weight(uint32_t poly) {  int wt = 0;  /* note: endian-ness makes no difference */  wt += octet_weight[poly        & 0xff];   wt += octet_weight[(poly >> 8) & 0xff];  wt += octet_weight[(poly >> 16) & 0xff];  wt += octet_weight[(poly >> 24)];  return wt;}#define MAX_PERIOD 65535#define debug_print 0intperiod(uint32_t poly) {  int i;  uint32_t x;  /* set lfsr to 1 */  x = 1;#if debug_print  printf("%d:\t%s\n", 0, u32_bit_string(x,8));#endif  for (i=1; i < MAX_PERIOD; i++) {    if (x & 1)       x = (x >> 1) ^ poly;    else      x = (x >> 1);#if debug_print    /* print for a sanity check */    printf("%d:\t%s\n", i, u32_bit_string(x,8));#endif    /* check for return to original value */    if (x == 1)      return i;  }  return i;}/* * weight distribution computes the weight distribution of the * code generated by the polynomial poly */#define MAX_LEN    8#define MAX_WEIGHT (1 << MAX_LEN)int A[MAX_WEIGHT+1];voidweight_distribution2(uint32_t poly, int *A) {  int i;  uint32_t x;  /* zeroize array */  for (i=0; i < MAX_WEIGHT+1; i++)    A[i] = 0;  /* loop over all input sequences */      /* set lfsr to 1 */  x = 1;#if debug_print  printf("%d:\t%s\n", 0, u32_bit_string(x,8));#endif  for (i=1; i < MAX_PERIOD; i++) {    if (x & 1)       x = (x >> 1) ^ poly;    else      x = (x >> 1);#if debug_print    /* print for a sanity check */    printf("%d:\t%s\n", i, u32_bit_string(x,8));#endif        /* increment weight */    wt += (x & 1);    /* check for return to original value */    if (x == 1)      break;  }  /* set zero */  A[0] = 0;}voidweight_distribution(uint32_t poly, int *A) {  int i;  uint32_t x;  /* zeroize array */  for (i=0; i < MAX_WEIGHT+1; i++)    A[i] = 0;  /* set lfsr to 1 */  x = 1;#if debug_print  printf("%d:\t%s\n", 0, u32_bit_string(x,8));#endif  for (i=1; i < MAX_PERIOD; i++) {    if (x & 1)       x = (x >> 1) ^ poly;    else      x = (x >> 1);#if debug_print    /* print for a sanity check */    printf("%d:\t%s\n", i, u32_bit_string(x,8));#endif    /* compute weight, increment proper element */    A[weight(x)]++;    /* check for return to original value */    if (x == 1)      break;  }  /* set zero */  A[0] = 0;}intmain () {  int i,j;  v32_t x;  v32_t p;  /* originally 0xaf */  p.value = 0x9;  printf("polynomial: %s\tperiod: %d\n",   	   u32_bit_string(p.value,8), period(p.value));     /* compute weight distribution */  weight_distribution(p.value, A);    /* print weight distribution */  for (i=0; i <= 8; i++) {    printf("A[%d]: %d\n", i, A[i]);  }  #if 0  for (i=0; i < 39; i++) {     printf("polynomial: %s\tperiod: %d\n",   	   u32_bit_string(polynomials[i],8), period(polynomials[i]));         /* compute weight distribution */     weight_distribution(p.value, A);          /* print weight distribution */     for (j=0; j <= 8; j++) {       printf("A[%d]: %d\n", j, A[j]);     }     }#endif  {     int bits = 8;    uint32_t y;    for (y=0; y < (1 << bits); y++) {      printf("polynomial: %s\tweight: %d\tperiod: %d\n", 	     u32_bit_string(y,bits), weight(y), period(y));            /* compute weight distribution */      weight_distribution(y, A);            /* print weight distribution */      for (j=0; j <= 8; j++) {	printf("A[%d]: %d\n", j, A[j]);      }         }  }  return 0;}

⌨️ 快捷键说明

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