📄 rscore.c
字号:
/*============================================================================ * Syntax: [msg, err, ccode] = rscore(code, k, tp, dim, pow_dim) *RSCORE The core function in Reed-Solomon decode. * MSG = RSCORE(CODE, K, TP, M, POW_M, T2) decodes a single codeword * vector CODE using Reed-Solomon decoding technique. The message length * is K. The complete (and correct) list of all members in GF(2^M) is * in TP. The code word length is provided in POW_M, which equals to * 2^M - 1. The decoding result is provided in the output variable MSG. * * [MSG, ERR] = RSCORE(CODE, K, TP, M, POW_M, T2) outputs the error * detected in the decoding. * * [MSG, ERR, CCODE] = RSCORE(CODE, K, TP, M, POW_M, T2) outputs the * corrected codeword in CCODE. * * NOTE. Different from all of the other encoding/decoding functions, * this function takes the exponential input instead of regular input for * processing. For example [-Inf, 0, 1, 2, ...] represents * [0 1 alpha, alpha^2, ...] in GF(2^m). There are 2^M elements in * GF(2^M). Hence, the input CODE represents 2^M * (2^M - 1) bits of * information. The decoded MSG represents 2^M * K bits of information. * For speeding computation, no error-check is placed in this function, * all input variables must be presented. * * See also: errlocp, bchcore *============================================================================ * Original designed by Wes Wang, * Jun Wu, The Mathworks, Inc. * Dec-12, 1995 * * Copyright (c) 1995-96 by The MAthWorks, Inc. * All Rights Reserved * $Revision: 1.1 $ $Date: 1996/04/01 18:14:46 $ *========================================================================== */#include <math.h>#include "mex.h"#include "gflib.c"void mexFunction(int nlhs, Matrix *plhs[], int nrhs, Matrix *prhs[]){ int i, np, mp, pow_dim, dim, k; int *code, *pp, *Iwork, *ccode, *err; double *Msg, *Err, *CCode; np = mxGetM(prhs[2]); mp = mxGetN(prhs[2]); pow_dim = (int)mxGetPr(prhs[4])[0]; code = (int *)mxCalloc(pow_dim,sizeof(int)); for(i=0; i<pow_dim; i++) code[i] = (int)mxGetPr(prhs[0])[i]; k = (int)mxGetPr(prhs[1])[0]; pp = (int *)mxCalloc(np*mp,sizeof(int)); for(i=0; i< np*mp; i++) pp[i] = (int)mxGetPr(prhs[2])[i]; dim = (int)mxGetPr(prhs[3])[0]; if ( nrhs < 5 || k <= 0 || dim != mp || pow_dim < (np-1) || mxGetM(prhs[0])*mxGetN(prhs[0]) != pow_dim ){ mexErrMsgTxt("Not Correct Input Argument! Input again!"); return; } /* set up a integer working space (int *)Iwork. */ Iwork = (int *)mxCalloc( (pow_dim-2*k+5*dim+19)*pow_dim+3*dim+k*(k-13)+28, sizeof(int)); err = Iwork; err[0] = 0; ccode = Iwork + 1; for(i=0; i<pow_dim; i++) ccode[i] = 0; rscore(code, k, pp, dim, pow_dim, Iwork+1+pow_dim, err, ccode); Msg = mxGetPr(plhs[0] = mxCreateFull(1, k, 0)); Err = mxGetPr(plhs[1] = mxCreateFull(1, 1, 0)); CCode = mxGetPr(plhs[2] = mxCreateFull(1, pow_dim, 0)); for(i=0; i < pow_dim; i++) CCode[i] = (double)ccode[i]; for(i=pow_dim-k; i < pow_dim; i++) Msg[i-pow_dim+k] = CCode[i]; Err[0] = (double)err[0]; return;}/* end of rscore.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -