Computational routine
eng


demodqam

File content


/* demodqam Scicos demodulator QAM block
 * Type 4 simulation function ver 1.0 - scilab-3.0
 * 5 janvier 2005 - IRCOM GROUP - Author : A.Layec
 */

/* REVISION HISTORY :
 * $Log$
 */

#include "scicos_block.h"

/* Cette fonction de simulation réalise un decodage QAM défini par la fonction
 * modqam.c. Les signaux I et Q reçu en entrée sont converti aux valeurs des
 * bits de poids fort et des bits de poids faibles du numéro symbole.
 * Les valeurs converties sont ensuite additionnées et la somme est placée
 * dans le registre de sortie y[].
 *
 * Entrées régulières : u1[0..insz[0]-1]: vecteur des signaux I
 *                      u2[0..insz[0]-1]: vecteur des signaux Q
 * Sortie régulière :   u[0..insz[0]-1] : vecteur des numéros symboles
 * Entrée évènementielle : instants de décision
 * Sortie évènementielle : néant
 * Paramètres entiers : ipar[0..insz[0]-1] : vecteur des nombres de bits.
 *
 * nb : ne fonctionne que pour des modulations avec un nombre de valeurs
 *     identiques pour chaque axes I et Q(16QAM, 64QAM, 256QAM, ...)
 */

/* demodqamv_c routine de calcul d'un démodulataur mQAM
 *
 * Entrées :
 * n :longueur des vecteurs d'entrées
 * m :longueurs des mots binaires en nombre de bits (vecteur)
 * i_c :adresse de départ du vecteur de la composante I
 * q_c :adresse de départ du vecteur de la composante Q
 *
 * Sortie :
 * y : adresse de départ du vecteur du symbole
 *
 * Dépendances:
 */
void demodqamv_c(int *n,int *m,double *i_c,double *q_c,double *y)
{
 /*déclaration des variables*/
 int i;
 int ng,nd;
 int d,g;

 for(i=0;i<(*n);i++)
 {
  /*Récupération du nombre d'états*/
  /*n=block->ipar[i];*/

  /*Calcul des sélecteurs binaires (c'est maladroit!!)*/
  nd=(1<<(m[i])/2)-1;
  ng=(1<<(m[i]))-1-nd;
  /*fprintf(stderr,"nd=%d, ng=%d\n", nd,ng);*/

  /*récupération des valeurs d'entrée*/
  d=(int)i_c[i];
  g=(int)q_c[i];

  /*Calcul les nombres binaires droit et gauche*/
  d=(d+nd)/2;
  g=((g+nd)/2)<<((m[i])/2);

  /*Calcul du registre de sortie y[]*/
  y[i]=d+g;
 }
 return;
}

/*prototype*/
void demodqam(scicos_block *block,int flag)
{
 /*déclaration des variables*/
 double *y;
 double *u1,*u2;
 int nu;

 /*Récupération des adresses des ports réguliers*/
 y=(double *)block->outptr[0];
 u1=(double *)block->inptr[0];
 u2=(double *)block->inptr[1];

 /*récupération de la taille des ports d'entrées*/
 nu=block->insz[0];

 /*Le flag 1 calcule le numéro symbole*/
 if(flag==1)
 {
  /*Appel demoqamv_c*/
  demodqamv_c(&nu,&block->ipar[0],&u1[0],&u2[0],&y[0]);
 }
}