Computational routine
eng


convol

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.
 */
 
/* convol Scicos convolution block by fft method
 * Type 4 simulation function ver 1.0 - scilab-3.0
 * 20 Décembre 2004  Author : - IRCOM GROUP - A.Layec
 */

/* REVISION HISTORY :
 * $Log$
 */

#include "modnum_lib.h"
#include <scicos/scicos_block.h>

/* Entrées régulières : u[0..nu-1] : vecteur d'entrée de taille nu. 
 *                                   Echantillons temporels du signal à  filtrer
 *
 * sorties régulières : y[0..ny-1] : vecteur de sortie de taille ny=nu. 
 *                                   Echantillons temporels du signal filtré
 *
 * paramètres entiers : nz : taille du vecteur Z = nb_coef. nombre de coefficient du filtre
 *                      ipar[0] = m1 taille vecteur tampon
 *
 * paramètres réels   : rpar[0..nz-1] : rep imulse. Réponse impulsionnelle du filtre
 *
 */


/*Prototype*/
void convol(scicos_block *block,int flag)
{
 /*Déclaration des pointeurs*/
 double *y;
 double *u;
 double *z;
 double *z__;
 double *z1_r, *z1_i, *z2_r, *z2_i, *y_r, *y_i;

 /*Déclaration de variables taille et compteur*/
 int nu,ny;
 int i,k;
 int m1,nb_coef;

 /*fft variables*/
 fft_pr_struct fft_pr;

 /*Récupération de l'adresse des registres*/
 y=(double *)block->outptr[0];
 u=(double *)block->inptr[0];
 z=block->z;

 /*Récupération des tailles des vecteurs*/
 nu=block->insz[0];
 ny=block->outsz[0];
 nb_coef=block->nz;

 /*Récupération de la taille des vecteurs complexes*/
 m1=block->ipar[0];

 /*initialisation*/
 if(flag==4) {
   double zero=0.;
   int size;

   /*Allocation de 3*2 vecteurs de taille m1*/
   if ((*block->work=scicos_malloc(sizeof(double)*(m1*2*3)))== NULL) {
    set_block_error(-16);
    return;
   }

   /*Initialisation des états*/
   z__  = *block->work;
   size = m1*2*3;
   setd_c(&size,&zero,z__);
   setd_c(&nb_coef,&zero,z);

 }

 else if(flag==2) {
   /*Récupération de l'adresse de départ du vecteur alloué*/
   z__=*block->work;

   /*Déclaration de pointeurs auxiliaires*/
   z1_r = &(z__[0])   ; z1_i = &(z__[m1]);   /*vecteur du complexe 1*/
   z2_r = &(z__[2*m1]); z2_i = &(z__[3*m1]); /*vecteur du complexe 2*/
   y_r  = &(z__[4*m1]); y_i  = &(z__[5*m1]); /*vecteur du complexe résultat*/

   /*Recopie u[] dans z1_r[]*/
   copyd_c(&nu,&u[0],&z1_r[0]);

   /*Recopie rpar[] dans z2_r[]*/
   copyd_c(&nb_coef,&(block->rpar[0]),&z2_r[0]);

   /* initialize fft_pr*/
   fft_pr.lfft   = m1;
   fft_pr.ffttyp = 0;

   /*Appel convolr_c*/
   convolr_c(&nu,&nb_coef,&m1,&z1_r[0],&z1_i[0],&z2_r[0],&z2_i[0],&y_r[0],&y_i[0],&z[0],&fft_pr);
 }
 else if(flag==1) {
   /*Récupération de l'adresse de départ du vecteur alloué*/
   z__=*block->work;

   /*Déclaration de pointeurs auxiliaires*/
   y_r  = &(z__[4*m1]); y_i  = &(z__[5*m1]); /*vecteur du complexe résultat*/

   /*Recopie y_r[] dans y[]*/
   copyd_c(&ny,&y_r[0],&y[0]);
 }
 /*terminaison*/
 else if(flag==5) {
   /*Libère mémoire allouée*/
   scicos_free(*block->work);
 }
}