/* Modnumlib Scicos interfacing function * Copyright (C) 2009 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); } }