Computational routine
eng


discrgen

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.
 */
 
/* discrgen Scicos discrete generator block
 * Type 4 simulation function - scilab-3.0
 * IRCOM GROUP - Author : A.Layec
 */

/* REVISION HISTORY :
 * $Log$
 */

#include <math.h>

#include "scicos_block.h"

#define M_PI		3.14159265358979323846

/* rpar[0] : amplitude
 * rpar[1] : longueur de la période (en échantillons)
 * ipar[0] : option (1:cos,2:sin)
 */

/* cwr_c : routine de calcul d'une onde à fréquence constante (1 composante)
 *
 * Entrées :
 * n       : longueur du vecteur
 * ampl    : amplitude de l'onde
 * opt     : option de la routine (1:cos, 2:sin)
 * theta_i : pas de l'angle 
 *
 * Sorties :
 * y : adresse de départ du vecteur de sortie
 *
 * Entrées/Sorties :
 * theta   : angle instantanée
 *
 * Dépendances :
 * math.h
 *
*/
void cwr_c(int *n,double *ampl,int *opt,double *theta_i,double *y,double *theta)
{
 /*déclaration*/
 int i;

 for (i=0;i<(*n);i++)
 {
  switch (*opt)
  {
   case 1 :
   {
    y[i]=(*ampl)*cos((*theta));
    break;
   }
   case 2 :
   {
    y[i]=(*ampl)*sin((*theta));
    break;
   }
  }
  *theta=(*theta)+(*theta_i);
 }
 return;
}

void discrgen(scicos_block *block,int flag)
{
 /*déclaration des variables*/
 int ny;
 int opt;
 double inc; /*incrément de l'angle*/
 double ampl;
 double *y;

 /*récupération de la taille de sortie*/
 ny=block->outsz[0];

 /*récupération de l'adresse de sortie*/
 y=(double *)block->outptr[0];

 /*récupération des paramètres*/
 ampl=block->rpar[0];
 inc=(2*M_PI)/block->rpar[1];
 opt=block->ipar[0];

 if(flag==1)
 {
  /*Appel cw_r*/
  cwr_c(&ny,&ampl,&opt,&inc,&y[0],&block->z[0]);
 }
}