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

📄 simquans.c

📁 数字通信第四版原书的例程
💻 C
字号:
/* * SIMQUAN   A SIMULINK quantizer block * * Syntax:  [sys, x0] = regdown(t, x, u, flag, k, partition, codebook, sample_time) *      This block quantizes individual element of the input vector using *      scalar quantization method. The input vector have dimention n, the *      partition is a N-1 vector, codebook is a length N vector. The output *      of this block is a 2N+1 vector with the first n elements being the *      index, which is one of the N integers in the range [0 : N-1]. The second *      N elements are the quantized output. The last N elements of the output *      vector is the estimation of the distortion. * * Wes Wang 10/6, 1994 * * Copyright (c) 1994-96 by The MathWorks, Inc. * All Rights Reserved * $Revision: 1.1 $  $Date: 1996/04/01 19:04:43 $ */#define S_FUNCTION_NAME simquans#ifdef MATLAB_MEX_FILE#include <stdio.h>    /* needed for declaration of sprintf */#include "mex.h"      /* needed for declaration of mexErrMsgTxt */#endif/* * need to include simstruc.h for the definition of the SimStruct and * its associated macro definitions. */#include "simstruc.h"/* * Defines for easy access of the input parameters */#define NUM_ARGS        4#define NUM_INPUT      ssGetArg(S,0)#define PARTITION      ssGetArg(S,1)#define CODEBOOK       ssGetArg(S,2)#define SAMPLE_TIME    ssGetArg(S,3)/* * 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 Num_Index;    int Num_Input = (int)mxGetPr(NUM_INPUT)[0];    /*     * Set-up size information.     */     if (ssGetNumArgs(S) == NUM_ARGS) {        /* check the dimensions */                if ((mxGetN(NUM_INPUT) != 1) || (mxGetM(NUM_INPUT) != 1)) {#ifdef MATLAB_MEX_FILE            mexErrMsgTxt("Input size must be a nonempty scalar.");#endif                }        Num_Index = mxGetN(CODEBOOK) * mxGetM(CODEBOOK);        if (Num_Index - 1 != mxGetN(PARTITION) * mxGetM(PARTITION)) {#ifdef MATLAB_MEX_FILE            mexErrMsgTxt("The vector size for PARTITION must be the size of CODEBOOK -1.");#endif        }            if (Num_Index <= 1) {#ifdef MATLAB_MEX_FILE            mexErrMsgTxt("The vector PARTITION cannot be empty.");#endif        }                ssSetNumContStates(    S, 0);        ssSetNumDiscStates(    S, 0);        ssSetNumInputs(        S, Num_Input);        ssSetNumOutputs(       S, 3*Num_Input);        ssSetDirectFeedThrough(S, 1);        ssSetNumInputArgs(     S, NUM_ARGS);        ssSetNumSampleTimes(   S, 1);        /* Real number for distortion computation, first number is the number of         * elements have been processed */        ssSetNumRWork(         S, 1 + Num_Input);        ssSetNumIWork(         S, 1);        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.     */    double sampleTime, offsetTime;    sampleTime = mxGetPr(SAMPLE_TIME)[0];    if ((mxGetN(SAMPLE_TIME) * mxGetM(SAMPLE_TIME)) == 2)            offsetTime = mxGetPr(SAMPLE_TIME)[1];    else           offsetTime = 0.;        ssSetSampleTimeEvent(S, 0, sampleTime);    ssSetOffsetTimeEvent(S, 0, offsetTime);}/* * mdlInitializeConditions - initializes the states for the S-Function */static void mdlInitializeConditions(x0, S)  double *x0;  SimStruct *S;{    int Num_Input       = ssGetNumInputs(S);    int Num_Index       = mxGetN(PARTITION) * mxGetM(PARTITION);    int    *J_Bound     = ssGetIWork(S);    double *Num_Done    = ssGetRWork(S);    double *Distortion  = ssGetRWork(S) + 1;        int i;    /*      * Initialize the buffer to all zeros, we could allow this to     * be an additional paramter.     */        for (i = 0; i < Num_Input; i++)         *Distortion++ = 0.;    *Num_Done = 0.;    *J_Bound  = Num_Index;}/* * 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 Num_Input       = ssGetNumInputs(S);    int    *J_Bound     = ssGetIWork(S);    double *Num_Done    = ssGetRWork(S);    double *Distortion  = ssGetRWork(S) + 1;    int i, j;    double Num_Done_1, Dist_tmp;    Num_Done_1 = *Num_Done;    *Num_Done = *Num_Done + 1;    for (i = 0; i < Num_Input; i++) {        /* for each input */        j = 0;        while ((u[i] > mxGetPr(PARTITION)[j]) && (j < *J_Bound))            j++;        /* index */        y[i] = j;        /* Quantized value */        y[i + Num_Input] = mxGetPr(CODEBOOK)[j];        /* Distortion computation */        Dist_tmp = (u[i] - mxGetPr(CODEBOOK)[j]);        Dist_tmp *= Dist_tmp;        if (Num_Done_1) {            Dist_tmp = (Dist_tmp + Distortion[i] * Num_Done_1) / *Num_Done;        }        Distortion[i] = Dist_tmp;        y[i + Num_Input + Num_Input] = Dist_tmp;    }}/* * 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 + -