Delta-Sigma modulator block
- Size of inputs :
Type 'vec' of size 1. If set
1, then perform modulation of an input vector.
- Amplitude of input modulator :
Type 'vec' of size 1. Maximal level of the regular input.
- Order of modulator(1,2 or 3) :
Type 'vec' of size 1. Order of MASH modulator. Must be 1,2 or 3.
- Type of output(0:Regular/-1;1:Scaled) :
Type 'vec' of size 1. Scale (center) or not the binary output data stream.
- Enable Quantification error output?(0:No/1:Yes) :
Type 'vec' of size 1. Activate a second regular output corresponding to the quantifictaion error.
- Accepted herited (0:No/1:Yes)? :
Type 'vec' of size 1. Set if the block accept herited event.
- always active: no
- direct-feedthrough: no
- zero-crossing: no
- mode: no
- number/sizes of inputs: 1 / 1
- number/sizes of outputs: 1 / 1
- number/sizes of activation inputs: 1 / 1
- number/sizes of activation outputs: 0 /
- continuous-time state: no
- discrete-time state: yes
- name of computational function: mash
MASHBLK_f.sci
/* mash Scicos discret first order 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 "machine.h"
#include "scicos_block.h"
#include<stdio.h>
/* 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 mash2_c et mash3_c
*
* si order>1 et ipar[0]==0
* z__[0..nu-1] : vecteur de travail pour mash2_c et mash3_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 Mash1*/
if(order==1) mash1_c(&nu,&m,&u[0],&block->z[0],&block->z[1],&y1[0],&y2[0]);
/*Appel Mash2*/
else if(order==2) mash2_c(&nu,&m,&u[0],&block->z[0],&block->z[2],&y1[0],&y2[0],&w[0]);
/*Appel Mash3*/
else if(order==3) mash3_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);
}
}
IRCOM Group
Alan Layec