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

📄 switchbx.c

📁 数字通信第四版原书的例程
💻 C
字号:
/* *  SIMULINK selected output pattern. * *  Syntax:  [sys, x0] = stdmamux(t, x, u, flag, switch_box) *  This function takes multi-input and it may be multi-output *  depending on the value of the second input port. *  This block takes N+1 input. The first N input is the *  signal. The last signal of the block input the index value *  for the output. * *  switch_box: The colum number is the block output number. The row *              number decides how many switching options. The element *              value of the block are in the range [0, N], where N *              is the vector length of the signal input of this block. *              This block switch the output at the raising edge of the *              trigger signal. When the content of the output is 0, *              this block outputs the default value. *              When the input value of the second input is i, the *              block output the value following the row i pattern in *              the switch box. *              The block keeps the last value if the input is 0. *  default_value: The keeping value should be a vector with its length *              same as the column number of the variable switch_box. *  The vector size of this block is the same as the column number of *  the variable switch_box, as well as the vector size of *  keeping_value and ini_value. * * Wes Wang  Dec. 13, 1995 * Copyright (c) 1995-96 by The MathWorks, Inc. * All Rights Reserved * $Revision: 1.1 $  $Date: 1996/04/01 19:06:35 $ */#define S_FUNCTION_NAME switchbx#include <math.h>    /* needed for declaration of floor */#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   2#define SWITCH_BOX         ssGetArg(S,0)#define DEFAULT_OUT        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;{    /*     * Set-up size information.     */         if (ssGetNumArgs(S) == NUM_ARGS) {      int i, numoutput;      numoutput = mxGetN(DEFAULT_OUT) * mxGetM(DEFAULT_OUT);      if (numoutput < 1) {#ifdef MATLAB_MEX_FILE        char err_msg[256];        sprintf(err_msg, "Empty initial variable assignment.");        mexErrMsgTxt(err_msg);#endif        }      if (mxGetN(SWITCH_BOX) != numoutput) {#ifdef MATLAB_MEX_FILE        char err_msg[256];        sprintf(err_msg, "The column number of Switch_Box must match the vector size of Ini_Value.");        mexErrMsgTxt(err_msg);#endif      }      ssSetNumContStates(    S, 0);      ssSetNumDiscStates(    S, 0);      ssSetNumInputs(        S, -1);      ssSetNumOutputs(       S, numoutput);      ssSetDirectFeedThrough(S, 1);      ssSetNumInputArgs(     S, NUM_ARGS);      ssSetNumSampleTimes(   S, 1);      ssSetNumRWork(         S, 0);      ssSetNumIWork(         S, 0);      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;{    /*     * Initialize the current buffer position and buffer start     */}/* * 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     numoutput       = ssGetNumOutputs(S);    int     numinput        = ssGetNumInputs(S);        int     Index;    int     i, out_index, m_switch_box;    /*     * acquire the buffer data     */    if (ssGetT(S) <= 0.0) {        for (i=0; i<numoutput; i++)            y[i] = mxGetPr(DEFAULT_OUT)[i];    }    Index = floor(u[numinput - 1] + .5);    m_switch_box = mxGetM(SWITCH_BOX);    if ((Index > 0) && (Index <= m_switch_box)) {        for (i = 0; i < numoutput; i++) {            out_index = (int)mxGetPr(SWITCH_BOX)[Index - 1 + m_switch_box * i];            if (out_index <= 0) {               y[i] = mxGetPr(DEFAULT_OUT)[i];            } else if (Index > numinput - 1) {#ifdef MATLAB_MEX_FILE               char err_msg[256];               sprintf(err_msg, "The index number in Switch_Box variable is larger than the signal input vector.");               mexErrMsgTxt(err_msg);#endif                         } else {                 y[i] = u[out_index-1];             }         }    } else {        for (i = 0; i < numoutput; i++) {            y[i] = mxGetPr(DEFAULT_OUT)[i];        }    }}/* * 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 + -