If set 1
/* mpskemit Scicos Mary Phase Shift Keying Emmiter * Type 4 simulation function ver 1.0 - scilab-3.0 * 22 décembre 2004 - IRCOM GROUP - Author : A.Layec */ /* REVISION HISTORY : * $Log$ */ #include "scicos_block.h" #include "machine.h" #include <math.h> #include <stdio.h> /* Cette fonction de simulation réalise un récepteur MPSK * La sortie y1 correspond aux valeurs du symbole démodulé. * suilant les valeurs I et Q présentes aux l'entrées u1[] et u2[] * aux dates de déclanchements. * * entrées régulières : u1[0..insz[0]-1] : vecteur des composantes I * u2[0..insz[0]-1] : vecteur des composantes Q * sorties régulières : y[0..insz[0]-1/nech] : vecteur du symbole démodulé * * entrée évènementielles : instants de déclenchement. * sortie évènementielle : néant * paramètres entiers : ipar[0] :nbr de coef du filtre * ipar[1] :taille du vecteur en puissance de 2 (pour filtre avec fft842) * ipar[2] :nech nombre d'échantillons * ipar[3] :inits_c valeur initiale du compteur integrateur * ipar[4] :initso_c valeur initiale du compteur sous-échantillonneur * ipar[5] :m nombre d'états * * paramètres réels : rpar[0..nb_coef-1] : vecteur de la réponse impulsionnelle * rpar[nb_coef] : pas d'intégration de l'intégrateur symbole * rpar[nb_coef+1] : amplitude de sortie de l'intégrateur * * état discret : z[0..nb_coef-1] : vecteur du mot mémoire voie I * z[nb_coef..2*nb_coef-1] : vecteur du mot mémoire voie Q * z[2*nb_coef] : mot mémoire inégrateur symbole voie I * z[2*nb_coef+1] : mot mémoire inégrateur symbole voie Q */ /*prototype*/ void mpskrec(scicos_block *block,int flag) { /*Déclaration des variables*/ double *y; double *u1,*u2; double *z; double step,amplc; int nu,ny; int i,k; int m1,nb_coef,nech,inits_c,initso_c,m; double *z__; double *zi1_r, *zi1_i, *zi2_r, *zi2_i, *yi_r, *yi_i; double *zq1_r, *zq1_i, *zq2_r, *zq2_i, *yq_r, *yq_i; /*Récupération des adresses des ports réguliers*/ y=(double *)block->outptr[0]; u1=(double *)block->inptr[0]; u2=(double *)block->inptr[1]; z=block->z; /*Récupération des valeurs des variables*/ nu=block->insz[0]; ny=block->outsz[0]; nb_coef=block->ipar[0]; m1=block->ipar[1]; nech=block->ipar[2]; inits_c=block->ipar[3]; /*Valeur initiale du compteur intégrateur symbole*/ initso_c=block->ipar[4]; /*Valeur initiale du compteur sous-échantillonneur*/ m=block->ipar[5]; step=block->rpar[nb_coef]; amplc=block->rpar[nb_coef+1]; /* Le flag 1 calcule la valeur de I et de Q en fonction du numéro symbole u[] et du nombre du nombre d'état m */ if(flag==1||flag==6) { /*Allocation de 2*(3*2) vecteurs de taille m1*/ if ((*block->work=scicos_malloc(sizeof(double)*(m1*2*(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*/ zi1_r = &(z__[0]) ; zi1_i = &(z__[m1]); /*vecteur voie i du complexe 1*/ zi2_r = &(z__[2*m1]); zi2_i = &(z__[3*m1]); /*vecteur voie i du complexe 2*/ yi_r = &(z__[4*m1]); yi_i = &(z__[5*m1]); /*vecteur voie i du complexe résultat*/ zq1_r = &(z__[6*m1]); zq1_i = &(z__[7*m1]); /*vecteur voie q du complexe 1*/ zq2_r = &(z__[8*m1]); zq2_i = &(z__[9*m1]); /*vecteur voie q du complexe 2*/ yq_r = &(z__[10*m1]); yq_i = &(z__[11*m1]);/*vecteur voie q du complexe résultat*/ /*Recope u1[] et u2[] dans zi1_r et zq1_r*/ F2C(dcopy)(&nu,&u1[0],(k=1,&k),&zi1_r[0],(k=1,&k)); F2C(dcopy)(&nu,&u2[0],(k=1,&k),&zq1_r[0],(k=1,&k)); /*Recopie rpar[] dans zi2_r[] et zq2_r*/ F2C(dcopy)(&nb_coef,&(block->rpar[0]),(k=1,&k),&zi2_r[0],(k=1,&k)); F2C(dcopy)(&nb_coef,&(block->rpar[0]),(k=1,&k),&zq2_r[0],(k=1,&k)); /*Appel convolr_c*/ convolr_c(&nu,&nb_coef,&m1,&zi1_r[0],&zi1_i[0],&zi2_r[0],&zi2_i[0],&yi_r[0],&yi_i[0],&z[0]); convolr_c(&nu,&nb_coef,&m1,&zq1_r[0],&zq1_i[0],&zq2_r[0],&zq2_i[0],&yq_r[0],&yq_i[0],&z[nb_coef]); /*Appel intsymb_c*/ intsym_c(&nu,&nech,&inits_c,&step,&yi_r[0],&zi1_r[0],&z[2*nb_coef]); intsym_c(&nu,&nech,&inits_c,&step,&yq_r[0],&zi2_r[0],&z[2*nb_coef+1]); /*Appel comp_c*/ comp_c(&nu,&lc,&zi1_r[0],&yi_r[0]); comp_c(&nu,&lc,&zi2_r[0],&yq_r[0]); /*Appel sousecht_c*/ sousecht_c(&nu,&nech,&initso_c,&yi_r[0],&zi1_r[0]); sousecht_c(&nu,&nech,&initso_c,&yq_r[0],&zi2_r[0]); /*Appel demodpsk_c*/ demodpsk_c(&ny,&m,&zi1_r[0],&zi2_r[0],&y[0]); /*Libère mémoire allouée*/ scicos_free(*block->work); } }