📄 v34recv.c
字号:
/* * V34trans A SIMULINK example for v34 transmission * * Syntax: [sys, x0] = v34recv(t,x,u,flag,rate,ShMp) * * rate is a 12 element vector, which contains: * rate = [rate_s, rate_r, rate_s_j, rate_s_p, rate_s_n, * rate_b, rate_q, rate_K, rate_M, rate_M_exp, * rate_L, rate_L_exp]; * see V34param for the details of the rate parameter. * * ShMp is a four column matrix * ShMp(:, 1) contains g2 * ShMp(:, 2) contains g4 * ShMp(:, 3) contains g8 * ShMp(:, 4) contains z8 * * Wes Wang Jan. 24, 1996 * Copyright (c) 1996 by The MathWorks, Inc. * All Rights Reserved * $Revision: 1.1 $ $Date: 1996/04/01 19:07:37 $ */#define S_FUNCTION_NAME v34recv #ifdef MATLAB_MEX_FILE#include <stdio.h> /* needed for declaration of sprintf */#include "mex.h" /* needed for declaration of mexErrMsgTxt */#endif#include "simstruc.h"/* Defines for easy access of the input parameters */#define NUM_ARGS 2#define RATE ssGetArg(S,0)#define ShMp ssGetArg(S,1) /* * mdlInitializeSizes - called to initialize the sizes array stored in * the SimStruct. The sizes array defines the * characteristics (number of inputs, outputs, * states, etc.) of the S-Function. */static void mdlInitializeSizes(S) SimStruct *S;{ int rate_s = (int) mxGetPr(RATE)[0]; int rate_r = (int) mxGetPr(RATE)[1]; int rate_j = (int) mxGetPr(RATE)[2]; int rate_p = (int) mxGetPr(RATE)[3]; int rate_b = (int) mxGetPr(RATE)[5]; int rate_q = (int) mxGetPr(RATE)[6]; int rate_K = (int) mxGetPr(RATE)[7]; int rate_M = (int) mxGetPr(RATE)[8]; /* * Set-up size information. */ /* #ifdef MATLAB_MEX_FILEif (0) { char err_msg[256]; sprintf(err_msg, "Size initial, rate_s = %d; rate_r = %d; rate_j = %d; rate_p = %d;\n", rate_s, rate_r, rate_j, rate_p); mexPrintf(err_msg); sprintf(err_msg, "rate_b = %d; rate_q = %d; rate_K = %d; rate_M = %d;\n", rate_b, rate_q, rate_K, rate_M); mexPrintf(err_msg); sprintf(err_msg, "ShMp_N= %d, ShMp_M=%d;\n", mxGetN(ShMp), mxGetM(ShMp)); mexPrintf(err_msg); }#endif*/ if (ssGetNumArgs(S) == NUM_ARGS) { ssSetNumContStates( S, 0); ssSetNumDiscStates( S, 0); ssSetNumOutputs( S, rate_b); ssSetNumInputs( S, rate_q + 1 + 3 + 2); ssSetDirectFeedThrough(S, 1); ssSetNumInputArgs( S, NUM_ARGS); ssSetNumSampleTimes( S, 1); ssSetNumRWork( S, 0); /* 1 last updata * 1 last trigger intput * 1 current input counter * 23 scramble * 8 mijk number * 4 * 3 of Iij * 8 * rate_q of Qijk */ ssSetNumIWork( S, 1 + 1 + 1 + 23 + 8 + 12 + 8*rate_q); ssSetNumPWork( S, 0); } else {#ifdef MATLAB_MEX_FILE char err_msg[256]; sprintf(err_msg, "Wrong number of input arguments passed to S-function MEX-file.\n" "%d input arguments were passed in when expecting %d input arguments.\n", ssGetNumArgs(S) + 4, NUM_ARGS + 4); mexErrMsgTxt(err_msg);#endif }}/* * mdlInitializeSampleTimes - initializes the array of sample times stored in * the SimStruct associated with this S-Function. */static void mdlInitializeSampleTimes(S) SimStruct *S;{ /* * Note, blocks that are continuous in nature should have a single * sample time of 0.0. */ ssSetSampleTimeEvent(S, 0, 0.0); ssSetOffsetTimeEvent(S, 0, 0.0);}/* * mdlInitializeConditions - initializes the states for the S-Function */static void mdlInitializeConditions(x0, S) double *x0; SimStruct *S;{ int rate_s = (int) mxGetPr(RATE)[0]; int rate_r = (int) mxGetPr(RATE)[1]; int rate_j = (int) mxGetPr(RATE)[2]; int rate_p = (int) mxGetPr(RATE)[3]; int rate_b = (int) mxGetPr(RATE)[5]; int rate_q = (int) mxGetPr(RATE)[6]; int rate_K = (int) mxGetPr(RATE)[7]; int rate_M = (int) mxGetPr(RATE)[8]; int *last_updata = ssGetIWork(S); int *last_input = ssGetIWork(S) + 1; int *out_count = ssGetIWork(S) + 2; int *scramble = ssGetIWork(S) + 3; int *mijk = ssGetIWork(S) + 3 + 23; int *Iij = ssGetIWork(S) + 3 + 23 + 8; int *Qijk = ssGetIWork(S) + 3 + 23 + 8 + 12; int i;/*#ifdef MATLAB_MEX_FILEif (0) { char err_msg[256]; sprintf(err_msg, "Parame initial rate_s = %d; rate_r = %d; rate_j = %d; rate_p = %d;\n", rate_s, rate_r, rate_j, rate_p); mexPrintf(err_msg); sprintf(err_msg, "rate_b = %d; rate_q = %d; rate_K = %d; rate_M = %d;\n", rate_b, rate_q, rate_K, rate_M); mexPrintf(err_msg); sprintf(err_msg, "ShMp_N=%d , ShMp_M=%d;\n", mxGetN(ShMp), mxGetM(ShMp)); mexPrintf(err_msg); }#endif*/ *last_updata = 0; *last_input = 0; *out_count = 0; for (i = 0; i < 23; i++) scramble[i] = 0; for (i = 0; i < 8; i++) mijk[i] = 0; for (i = 0; i < 12; i++) Iij[i] = 0; for (i = 0; i < 8 * rate_q; i++) Qijk[i] = 0;}/* * mdlOutputs - computes the outputs of the S-Function */static void mdlOutputs(y, x, u, S, tid) double *y, *x, *u; SimStruct *S; int tid;{ int rate_s = (int) mxGetPr(RATE)[0]; int rate_r = (int) mxGetPr(RATE)[1]; int rate_j = (int) mxGetPr(RATE)[2]; int rate_p = (int) mxGetPr(RATE)[3]; int rate_b = (int) mxGetPr(RATE)[5]; int rate_q = (int) mxGetPr(RATE)[6]; int rate_K = (int) mxGetPr(RATE)[7]; int rate_M = (int) mxGetPr(RATE)[8]; int *last_updata = ssGetIWork(S); int *last_input = ssGetIWork(S) + 1; int *out_count = ssGetIWork(S) + 2; int *scramble = ssGetIWork(S) + 3; int *mijk = ssGetIWork(S) + 3 + 23; int *Iij = ssGetIWork(S) + 3 + 23 + 8; int *Qijk = ssGetIWork(S) + 3 + 23 + 8 + 12; /* input data */ if ((u[rate_q + 5] > 0) && (*last_input == 0)) {#ifdef MATLAB_MEX_FILE if (0) { char err_msg[256]; int i; sprintf(err_msg, "Input:"); mexPrintf(err_msg); for (i = 0; i < rate_q + 6; i++) { sprintf(err_msg, "u[%d] = %d; ", i, (int)u[i]); mexPrintf(err_msg); } sprintf(err_msg, "\n"); mexPrintf(err_msg); } #endif if (*out_count < 8) { long base_count, k, tmp, i; k = *out_count % 2; base_count = *out_count * rate_q; for (i = 0; i < rate_q; i++) { Qijk[base_count + i] = (int)u[i]; } mijk[*out_count] = u[rate_q]; if (k) { base_count = *out_count / 2; base_count = base_count * 3; for (i = 0; i < 3; i++) { Iij[base_count + i] = (int)u[rate_q + 1 + i]; } } /* at the very end */ *out_count = *out_count + 1; *last_input = 1; } } else { if (u[rate_q + 5] <= 0) *last_input = 0; } /* updata the output */ if ((u[rate_q + 4] > 0) && (*last_updata == 0)) { /* begin the major updating work. */ double *g2 = mxGetPr(ShMp); double *g4 = mxGetPr(ShMp) + 8 *(rate_M-1)+1; double *g8 = mxGetPr(ShMp) + 16*(rate_M-1)+2; double *z8 = mxGetPr(ShMp) + 24*(rate_M-1)+3; long R[6]; long A, B, C, D, E, F, G, H, tmp; int i, j, k, data_in[80]; /*b is no larger than 40 */ /* Shell Demapper */ C = mijk[0] + mijk[1]; if (C < rate_M) { E = mijk[0]; } else { E = rate_M - 1 - mijk[1]; } B = C + mijk[2] + mijk[3]; if (B - C < rate_M) { F = mijk[2]; } else { F = rate_M - 1 - mijk[3]; } D = mijk[4] + mijk[5]; if (D < rate_M) { G = mijk[4]; } else { G = rate_M - 1 - mijk[5]; } A = B + D + mijk[6] + mijk[7]; if (A - B - D < rate_M) { H = mijk[6]; } else { H = rate_M - 1 - mijk[7]; } /* determine R[0 - 5] */ R[5] = H * g2[D] + G; R[4] = F * g2[C] + E; R[3] = R[5]; if (D > 0) { for (i = 0; i < D; i++) { R[3] = R[3] + g2[i] * g2[A - B - i]; } } R[2] = R[4]; if (C > 0) { for (i = 0; i < C; i++) { R[2] = R[2] + g2[i] * g2[B - i]; } } R[1] = R[3] * g4[B] + R[2]; R[0] = R[1] + z8[A]; if (B > 0) { for (i = 0; i < B; i++) { R[0] = R[0] + g4[i] * g4[A - i]; } }#ifdef MATLAB_MEX_FILEif (0) { char err_msg[256]; sprintf(err_msg, "Answer\n"); mexPrintf(err_msg); sprintf(err_msg, "A = %d; B = %d; C = %d; D = %d; E = %d; F = %d; G = %d; H = %d \n",A, B, C, D, E, F, G, H ); mexPrintf(err_msg); sprintf(err_msg, "R[0]=%d; R[1]=%d; R[2]=%d; R[3]=%d; R[4]=%d; R[5]=%d \n",R[0],R[1],R[2],R[3],R[4],R[5]); mexPrintf(err_msg); sprintf(err_msg, "mijk[0]=%d; mijk[1]=%d; mijk[2]=%d; mijk[3]=%d; mijk[4]=%d; mijk[5]=%d; mijk[6]=%d; mijk[7]=%d \n",mijk[0],mijk[1],mijk[2],mijk[3],mijk[4],mijk[5],mijk[6],mijk[7]); mexPrintf(err_msg); }#endif A = R[0]; /*parser */ /* data_in[0:K-1] Si1 -- SiK -- Si? * data_in[K:K+2] I1i0, I2i0, I3i0 -- I?ij * data_in[K+3:K+3+q-1] Qi001, ..., Qi00q -- Qijk? * data_in[K+3+q:K+3+2*q-1] Qi011, ..., Qi01q -- Qijk? * data_in[K+3+2*q:K+3+2*q+2] I1i1, I2i1, I3i1 * data_in[K+6+2*q:K+6+3*q-1] Qi101, ..., Qi10q * data_in[K+6+3*q:K+6+4*q-1] Qi111, ..., Qi11q * data_in[K+6+4*q:K+6+4*q+2] I1i2, I2i2, I3i2 * data_in[K+9+4*q:K+9+5*q-1] Qi201, ..., Qi20q * data_in[K+9+5*q:K+9+6*q-1] Qi211, ..., Qi21q * data_in[K+9+6*q:K+9+6*q+2] I1i3, I2i3, I3i3 * data_in[K+12+6*q:K+12+7*q-1] Qi301, ..., Qi30q * data_in[K+12+7*q:K+12+8*q-1] Qi311, ..., Qi31q */ /* calculate S1 to Sk */ for (i = 0; i < rate_K; i++) { data_in[i] = A % 2; A /= 2; } /* arrange the rest of the data */ i = rate_K; j = 0; k = 0; for (A = 0; A < 4; A++) { for (B = 0; B < 3; B++) { data_in[i] = Iij[j]; j++; i++; } for (C = 0; C < 2*rate_q; C++) { data_in[i] = Qijk[k]; k++; i++; } } if (1) { /* descramble */ for (i = 0; i < rate_b; i++) { y[i] = (double)((data_in[i] + scramble[17] + scramble[22]) % 2); for (j = 22; j > 0; j--) scramble[j] = scramble[j-1]; scramble[0] = data_in[i]; } } else { for (i = 0; i < rate_b; i++) y[i] = data_in[i]; } *out_count = 0; *last_updata = 1; } else if (u[rate_q+4] <= 0) { *last_updata = 0; } else if (ssGetT(S) <= 0) { int i; for (i = 0; i < rate_b; i++) y[i] = 0; }}/* * mdlUpdate - computes the discrete states of the S-Function */static void mdlUpdate(x, u, S, tid) double *x, *u; SimStruct *S; int tid;{}/* * mdlDerivatives - computes the derivatives of the S-Function */static void mdlDerivatives(dx, x, u, S, tid) double *dx, *x, *u; SimStruct *S; int tid;{}/* * mdlTerminate - called at termination of model execution. */static void mdlTerminate(S) SimStruct *S;{}#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */#include "simulink.c" /* MEX-File interface mechanism */#else#include "cg_sfun.h" /* Code generation registration function */#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -