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

📄 hard_decodemex2.c

📁 本程序利用改进的CHOW算法
💻 C
字号:
/* Convolutional Decoder   pass in generating polynomials g m-by-3 (m=1 to 7)   outputs decoded bitstream   written by Joe Williams - Southern Methodist University as ugrad,   now Stanford grad student in EE.   if you use this, you must give the author proper credit*/#include "mex.h"#include "mat.h"#include <math.h>#define  decode_out plhs[0]#define	g_in prhs[0]#define	code_in prhs[1]void mexFunction(int nlhs,                      mxArray *plhs[],                     int nrhs,                      const mxArray *prhs[])    {       double *code,*decode;bool g[7][3];int n,j,k,length,true_length,i,col,row,num_zeros,num_ones,index;n = mxGetM(g_in);//get the size of the g matrix k = mxGetN(g_in);length = mxGetN(code_in);true_length = (length - 2*n)/n;for(col=0;col<k;col++){//Create a c-matrix  for(row=0;row<n;row++){	g[row][col]=(mxGetPr(g_in))[row+col*mxGetM(g_in)];  }}if(n==5) index=3;//set up number of 1 1 1's in g matrix for large gelse if(n==6) index=4;else if(n==7) index=4;code = mxGetPr(code_in);decode_out = mxCreateDoubleMatrix(1,true_length, mxREAL);decode = mxGetPr(decode_out);num_zeros = 0;num_ones = 0;//decode[0] = code[0];for(i=0;i<n;i++){  num_zeros += 1-code[i];  num_ones += code[i];}if(num_zeros>num_ones)  decode[0] = 0;else  decode[0] = 1;if(true_length>1){  num_zeros = 0;  num_ones = 0;  if((g[0][0]==1)&&(g[0][1]==0)&&(g[0][2]==1)){    //decode[1]=code[n];    num_zeros += 1-code[n];    num_ones += code[n];    for(i=n+1;i<2*n;i++){	  if((!decode[0])&&(!code[i])) num_zeros += 1;	  else if((decode[0])&&(code[i])) num_zeros += 1;	  else if((!decode[0])&&(code[i]))num_ones +=1;	  else if((decode[0])&&(!code[i]))num_ones +=1;    }    if(num_zeros>num_ones)      decode[1]=0;    else      decode[1]=1;    for(i=1;i<=true_length-2;i++){      //if(code[(i+1)*n]==0)      //  decode[i+1]=decode[i-1];      //else      //  decode[i+1]=-1*decode[i-1]+1;      num_zeros = 0;      num_ones = 0;      //num_zeros += 1-(code[(i+1)*n])*(!decode[i-1]);//1 0 1 part      if((!code[(i+1)*n])&&(!decode[i-1])) num_zeros++;      else if((!code[(i+1)*n])&&(decode[i-1])) num_ones++;      else if((code[(i+1)*n])&&(decode[i-1])) num_zeros++;      else if((code[(i+1)*n])&&(!decode[i-1])) num_ones++;      //num_ones += (code[(i+1)*n])*(!decode[i-1]);    for(j=(i+1)*n+1;j<(i+2)*n;j++){	  if((!decode[i-1])&&(!decode[i])&&(!code[j])) num_zeros += 1;	  else if((!decode[i-1])&&(!decode[i])&&(code[j])) num_ones += 1;	  else if((!decode[i-1])&&(decode[i])&&(!code[j])) num_ones +=1;	  else if((!decode[i-1])&&(decode[i])&&(code[j])) num_zeros +=1;	  else if((decode[i-1])&&(!decode[i])&&(!code[j])) num_ones +=1;	  else if((decode[i-1])&&(!decode[i])&&(code[j])) num_zeros +=1;	  else if((decode[i-1])&&(decode[i])&&(!code[j])) num_zeros +=1;	  else if((decode[i-1])&&(decode[i])&&(code[j])) num_ones +=1;    }    if(num_zeros>num_ones)      decode[i+1]=0;    else      decode[i+1]=1;    }  }  else{    //decode[1]=code[2*n-1];    for(i=n;i<2*n;i++){	  if(i<index+n){	    if((!decode[0])&&(!code[i])) num_zeros += 1;	    else if((decode[0])&&(code[i])) num_zeros += 1;	    else if((!decode[0])&&(code[i]))num_ones +=1;	    else if((decode[0])&&(!code[i]))num_ones +=1;	  }	  else{	    num_zeros += 1-code[i];	    num_ones += code[i];	  }    }    if(num_zeros>num_ones)      decode[1]=0;    else      decode[1]=1;    for(i=1;i<=true_length-2;i++){      //if(code[(i+1)*n+n-1]==0)      //  decode[i+1]=decode[i-1];      //else      //  decode[i+1]=-1*decode[i-1]+1;      num_zeros = 0;      num_ones = 0;      for(j=(i+1)*n;j<(i+2)*n;j++){        if((j%n)<index){          if((!decode[i-1])&&(!decode[i])&&(!code[j])) num_zeros += 1;	      else if((!decode[i-1])&&(!decode[i])&&(code[j])) num_ones += 1;    	  else if((!decode[i-1])&&(decode[i])&&(!code[j])) num_ones +=1;          else if((!decode[i-1])&&(decode[i])&&(code[j])) num_zeros +=1;     	  else if((decode[i-1])&&(!decode[i])&&(!code[j])) num_ones +=1;	      else if((decode[i-1])&&(!decode[i])&&(code[j])) num_zeros +=1;    	  else if((decode[i-1])&&(decode[i])&&(!code[j])) num_zeros +=1;	      else if((decode[i-1])&&(decode[i])&&(code[j])) num_ones +=1;        }        else{          if((!code[j])&&(!decode[i-1])) num_zeros++;          else if((!code[j])&&(decode[i-1])) num_ones++;          else if((code[j])&&(decode[i-1])) num_zeros++;          else if((code[j])&&(!decode[i-1])) num_ones++;        }      }      if(num_zeros>num_ones)        decode[i+1]=0;      else        decode[i+1]=1;    }  }}}

⌨️ 快捷键说明

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