This block realizes a discret convolution with Fourier Transforms and overlap-add method. The input vector u, of size nu is convolved by an impulse response vector of size nb_coef, defined in the dialogue parameter 'Vector of impulse response'. The result is then delivred in the output vector y of size 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); } }