📄 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_FILE
if (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_FILE
if (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_FILE
if (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 + -