Computational routine
eng


mpskrec

File content


/* Modnumlib Scicos interfacing function
 * Copyright (C) 2009-2011 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,&amplc,&zi1_r[0],&yi_r[0]);
  comp_c(&nu,&amplc,&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);
 }
}