Computational routine
eng
convol
/* 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);
}
}