Computational routine
eng


sdblk

File content


/* Modnumlib Scicos interfacing function
 * Copyright (C) 2009-2011 Alan Layec
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */
 
/* sdblk Scicos discrete Delta-Sigma modulator 1 bit block
 * Type 4 simulation function ver 1.0 - scilab-2.6&2.7
 * 26 novembre 2003 - IRCOM GROUP - Author : A.Layec
 */

/* REVISION HISTORY :
 * $Log$
 */

#include "modnum_lib.h"
#include "scicos_block.h"

#if WIN32
#define NULL    0
#endif

/* Ce bloc est un modulateur sigma delta (du premier au troisième  ordre) 
 * discret avec un comparateur de signe (quantificateur 1 bit)
 * A chaque coup d'horloge le signal d'erreur est évaluée et la sortie est
 * calculée. L'intégrateur discret est réalisé par la méthode des dérivées
 * à gauche du premier ordre. Un éventuel gain est à dispostion pour effectuer
 * une comparaison avec un signal d'entrée de niveau supérieur à 1. Une deuxième
 * sortie est disponbile (bruit de quantification) pour réaliser la
 * mise en cascade des modulateurs.
 *
 * entrée régulières : u[0..nu-1] : vecteur du signal à moduler
 * sortie régulières : y1[0..nu-1] : vecteur du signal de sortie (+1 ou -1)
 *                     y2[0..nu-1] : bruit de quantification (si ipar[0]==1)
 *
 * paramètre réel rpar[0..nu-1] : vecteur du gain éventuel
 * paramètres entiers : ipar[0] : typ de sortie (0: sans bruit, 1:avec bruit)
 *                      ipar[1] : odre du modulateur (1,2 ou 3)
 *                      ipar[2] : typ de sortie (0:régulière, 1: diminuée)
 *
 * etats discret:
 * 1er ordre
 *              z[0..nu-1] : intégrale du signal d'erreur du modulateur 1
 *              z[nu..2*nu-1] : signal de sortie du modulateur 1
 * 2eme ordre
 *              z[0..nu-1]      : integral du sgnal d'erreur du modulateur 1
 *              z[nu..2*nu-1]   : integral du signal d'erreur du modulateur 2
 *              z[2*nu..3*nu-1] : signal de sortie du modulateur 1
 *              z[3*nu..4*nu-1] : signal de sortie du modulateur 2
 *              z[4*nu..5*nu-1] : etat mémoire du modulateur du 2eme ordre
 * 3eme ordre
 *              z[0..nu-1]      : integral du sgnal d'erreur du modulateur 1
 *              z[nu..2*nu-1]  : integral du signal d'erreur du modulateur 2
 *              z[2*nu..3*nu-1]  : integral du signal d'erreur du modulateur 3
 *              z[3*nu..4*nu-1] : signal de sortie du modulateur 1
 *              z[4*nu..5*nu-1] : signal de sortie du modulateur 2
 *              z[5*nu..6*nu-1] : etat mémoire du modulateur du 2eme ordre
 *              z[6*nu..7*nu-1] : signal de sortie du modulateur 3
 *              z[7*nu..8*nu-1] : etat mémoire 1 du modulateur du 3eme ordre
 *              z[8*nu..9*nu-1]: etat mémoire 2 du modulateur du 3eme ordre
 * vecteur de travail dyna. :
 * si order==1 et si ipar[0]=0
 * z__[0..nu-1] : bruit de quantification
 * 
 * si order>1 et ipar[0]==0
 * z__[0..nu-1] : bruit de quantification
 * z__[nu..2*nu-1] : vecteur de travail pour dsm2_c et dsm3_c
 * 
 * si order>1 et ipar[0]==0
 * z__[0..nu-1] : vecteur de travail pour dsm2_c et dsm3_c
 *
 */

/*prototype*/
void sdblk(scicos_block *block,int flag)
{
  /*déclaration des variables*/
  int nu,i,typ_out,typ,order;
  double *y1;
  double *y2;
  double *w;
  double *u;
  double m;
  double *z__;

  /*Récupération des adresses des ports réguliers*/
  y1=(double *)block->outptr[0];
  u=(double *)block->inptr[0];

  /*Récupération des paramètres*/
  nu=block->insz[0];
  m=block->rpar[0];
  typ=block->ipar[0];
  order=block->ipar[1];
  typ_out=block->ipar[2];

  /* init : fait l'allocation de work */
  if (flag==4) {
   /* alloue le workspace si nécessaire*/
   if((order==1)&&(typ==0)) {
    if ((*block->work=scicos_malloc(sizeof(double)*nu))== NULL) {
     set_block_error(-16);
     return;
    }
   }
   else if((order>1)&&(typ==0)) {
    if ((*block->work=scicos_malloc(sizeof(double)*2*nu))== NULL) {
     set_block_error(-16);
     return;
    }
   }
   else if((order>1)&&(typ==1)) {
    if ((*block->work=scicos_malloc(sizeof(double)*nu))== NULL) {
     set_block_error(-16);
     return;
    }
   }
  }
  /*calcule les sorties*/
  else if (flag==1) {
   /*avec sortie de bruit*/
   if (typ==1) y2=(double *)block->outptr[1];

   /* récupère le workspace si nécessaire*/
   if((order==1)&&(typ==0)) {
    z__=*block->work;
    y2 = &(z__[0]);
   }
   else if((order>1)&&(typ==0)) {
    z__=*block->work;
    y2 = &(z__[0]);
    w = &(z__[nu]);
   }
   else if((order>1)&&(typ==1)) {
    z__=*block->work;
    w = &(z__[0]);
   }

   /*Appel dsm1*/
   if(order==1) dsm1_c(&nu,&m,&u[0],&block->z[0],&block->z[1],&y1[0],&y2[0]);

   /*Appel dsm2*/
   else if(order==2) dsm2_c(&nu,&m,&u[0],&block->z[0],&block->z[2],&y1[0],&y2[0],&w[0]);

   /*Appel dsm3*/
   else if(order==3) dsm3_c(&nu,&m,&u[0],&block->z[0],&block->z[3],&y1[0],&y2[0],&w[0]);

   /*remet en forme le vecteur de sortie si nécéssaire*/
   if(typ_out!=0) for(i=0;i<nu;i++) y1[i]=(y1[i]+(typ_out))/2;
  }
  /*Terminaison */
  else if (flag==5) {
   /*libére le workspace*/
   if((order!=1)||((order==1)&&(typ==0))) scicos_free(*block->work);
  }
}