📄 hard_decodemex2.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 + -