/* 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. */ /* 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) { /*Allocation de 3*2 vecteurs de taille m1*/ if ((*block->work=scicos_malloc(sizeof(double)*(m1*2*3)))== NULL) { set_block_error(-16); return; } } 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); } }