/* fftcmplx Scicos fft complexe * Type 4 simulation function ver 1.1b - scilab-3.0 * 15 décembre 2004 - IRCOM GROUP - Author : A.Layec */ /* REVISION HISTORY : * $Log$ */ #include "machine.h" #include "scicos_block.h" #if WIN32 #define NULL 0 #endif /*Déclaration des fonctions externes*/ extern integer C2F(fft842)(); extern integer C2F(dfft2)(); extern integer C2F(dcopy)(); /* Cette fonction réalise la fft complexe du vecteur {u1[];u2[]}. * u1 et u2 sont places dans y1 et y2 respectivement par dcopy puis la fft est réalisée. * Suivant la valeur de ipar[0] on réalise une fft directe (0 où -1) ou indirecte (1). * Suivant la valeur de ipar[1] on appele fft842(ipar[1]=0) où dfftmx(ipar[1]=1) via dfft2. * Si dfftmx est choisie alors on place la taille du mot de travail dans ipar[2]. * * entrées réguliéres : u1[0..nu-1] : vecteur des réels du mot complexe d'entrée * u2[0..nu-1] : vecteur des imaginaires du mot complexe d'entrée * * sorties régulières : y1[0..nu-1] : vecteur des réels du mot complexe de sortie * y2[0..nu-1] : vecteur des imaginaires du mot complexe de sortie * * paramètres entiers : ipar[0] : signe de l'exponentiel (-1 où 0 : fft directe; 1 : fft indirecte) * ipar[1] : flag choix fft (0:fft842/1:dfftmx) * ipar[2] : taille du mot de travail pour dfftmx */ /*prototype*/ void fftcmplx(scicos_block *block,int flag) { /*fprintf(stderr,"flag=%d\n",flag);*/ /*Déclaration des variables*/ double *y1,*y2; double *u1,*u2; int nu,i,j,k,ierr; double *z__; /*Récupération des adresses des ports réguliers*/ y1=(double *)block->outptr[0]; y2=(double *)block->outptr[1]; u1=(double *)block->inptr[0]; u2=(double *)block->inptr[1]; /*Récupération de la taille du port d'entrée*/ nu=block->insz[0]; /* init : fait l'allocation de work */ if (flag==4) { if (block->ipar[1]==1) { /*cas fftmx*/ /*allocation dynamique*/ if ((*block->work=scicos_malloc(sizeof(double)*block->ipar[2]))== NULL) { set_block_error(-16); return; } } } /* calcule sortie */ else if (flag==1) { /*Recopie u dans y*/ C2F(dcopy)(&nu,&u1[0],(k=1,&k),&y1[0],(i=1,&i)); C2F(dcopy)(&nu,&u2[0],(k=1,&k),&y2[0],(i=1,&i)); /*Appel routine fft*/ switch (block->ipar[1]) { case 0 : /*Appel fft842*/ { /*fprintf(stderr,"fft842 \n");*/ if ((block->ipar[0]==0) || (block->ipar[0]==-1)) { k=0; } else { k=1; } C2F(fft842)(&k,&nu,&y1[0],&y2[0],&ierr); break; } case 1 : /*Appel fftmx*/ { /*fprintf(stderr,"dfftmx \n");*/ if ((block->ipar[0]==0) || (block->ipar[0]==-1)) { k=-1; } else { k=1; } z__=*block->work; C2F(dfft2)(&y1[0],&y2[0],(j=1,&j),&nu,(i=1,&i),&k,&ierr,&z__[0],&(block->ipar[2])); break; } } } /*Terminaison */ else if (flag==5) { /*Libère mémoire allouée*/ if (block->ipar[1]==1) { /*cas fftmx*/ scicos_free(*block->work); } } }