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

📄 v34recv.c

📁 数字通信第四版原书的例程
💻 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 + -