/* 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 "scicos_block.h" #include "machine.h" #include <stdio.h> /* 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 fonctions externes*/ extern void F2C(fft842)(); extern void F2C(dfft2)(); /*Déclaration des variables*/ double *y1,*y2; double *u1,*u2; int nu,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]; /*Recopie u dans y*/ F2C(dcopy)(&nu,&u1[0],(k=1,&k),&y1[0],(k=1,&k)); F2C(dcopy)(&nu,&u2[0],(k=1,&k),&y2[0],(k=1,&k)); /*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; F2C(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; /*allocation dynamique*/ if ((*block->work=scicos_malloc(sizeof(double)*block->ipar[2]))== NULL) { set_block_error(-16); return; } z__=*block->work; F2C(dfft2)(&y1[0],&y2[0],(j=1,&j),&nu,(j=1,&j),&k,&ierr,&z__[0],&(block->ipar[2])); scicos_free(*block->work); break; } } }