Ce bloc réalise une convolution discrète avec des Transformées de Fourier et une méthode d'empiétement additive. Le vecteur d'entrée u, de taille nu est convolué avec un vecteur réponse impulsionnelle de taille nb_coef définit par le paramètre 'Vector of impulse response'. Le résultat est délivré dans le vecteur de sortie y de taille ny=nu.
/* 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 "scicos_block.h" #include "machine.h" #include <stdio.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,l; int m1,nb_coef; /*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]; /*La flag 1 calcule y*/ if(flag==1) { /*Allocation de 3*2 vecteurs de taille m1*/ if ((*block->work=scicos_malloc(sizeof(double)*(m1*2*3)))== NULL) { set_block_error(-16); return; } /*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[]*/ F2C(dcopy)(&nu,&u[0],(k=1,&k),&z1_r[0],(k=1,&k)); /*Recopie rpar[] dans z2_r[]*/ F2C(dcopy)(&nb_coef,&(block->rpar[0]),(k=1,&k),&z2_r[0],(k=1,&k)); /*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]); /*Recopie y_r[] dans y[]*/ F2C(dcopy)(&ny,&y_r[0],(k=1,&k),&y[0],(k=1,&k)); /*Libère mémoire allouée*/ scicos_free(*block->work); } }