mash
/* 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.
*/
/* Scicos discret sigma delta modulator 1 bit block
* Type 2 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 mash(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];
if(flag==1)
{
if (typ==1) y2=(double *)block->outptr[1]; /*avec sortie de bruit*/
/* 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;
}
z__=*block->work;
y2 = &(z__[0]);
}
if((order>1)&&(typ==0))
{
if ((*block->work=scicos_malloc(sizeof(double)*2*nu))== NULL)
{
set_block_error(-16);
return;
}
z__=*block->work;
y2 = &(z__[0]);
w = &(z__[nu]);
}
if((order>1)&&(typ==1))
{
if ((*block->work=scicos_malloc(sizeof(double)*nu))== NULL)
{
set_block_error(-16);
return;
}
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;
/*libére le workspace*/
if((order!=1)||((order==1)&&(typ==0))) scicos_free(*block->work);
}
}