/* Modnumlib Scicos interfacing function * Copyright (C) 2009 Alan Layec * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* mpskrec Scicos Mary Phase Shift Keying receiver * Type 4 simulation function ver 1.0 - scilab-3.0 * 22 décembre 2004 - IRCOM GROUP - Author : A.Layec */ /* REVISION HISTORY : * $Log$ */ #include <scicos/scicos_block.h> #include "modnum_lib.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 mu=1; int my=1; 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; /*fft variables*/ fft_pr_struct fft_pr; /*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]; /* init : fait l'allocation de work */ if (flag==4) { /*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; } } /* Le flag 2 calcule la valeur de I et de Q en fonction * du numéro symbole u[] et du nombre du nombre d'état m */ else if(flag==1) { /*else if(flag==2) {*/ /*Récupération de l'adresse de départ du vecteur alloué*/ z__=*block->work; /* initialize fft_pr*/ fft_pr.lfft = m1; fft_pr.ffttyp = 0; /*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*/ copyd_c(&nu,&u1[0],&zi1_r[0]); copyd_c(&nu,&u2[0],&zq1_r[0]); /*Recopie rpar[] dans zi2_r[] et zq2_r*/ copyd_c(&nb_coef,&(block->rpar[0]),&zi2_r[0]); copyd_c(&nb_coef,&(block->rpar[0]),&zq2_r[0]); /*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],&fft_pr); 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],&fft_pr); /*Appel intsymb_c*/ intsym_c(&nu,&mu,&nech,&inits_c,&step,&yi_r[0],&zi1_r[0],&z[2*nb_coef]); intsym_c(&nu,&mu,&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,&mu,&nech,&initso_c,&yi_r[0],&zi1_r[0]); sousecht_c(&nu,&mu,&nech,&initso_c,&yq_r[0],&zi2_r[0]); // } // else if(flag==1) { // /*Récupération de l'adresse de départ du vecteur alloué*/ // z__=*block->work; // // /*Déclaration de pointeurs auxiliaires*/ // zi1_r = &(z__[0]) ; // zi2_r = &(z__[2*m1]); /*Appel demodpsk_c*/ demodpsk_c(&ny,&my,&m,&zi1_r[0],&zi2_r[0],&y[0]); } /*Terminaison */ else if (flag==5) { /*Libère mémoire allouée*/ scicos_free(*block->work); } }