Computational routine
eng


modqam

File content


/* modqam Scicos QAM modulator block
 * Type 4 simulation function ver 1.0 - scilab-3.0
 * 5 janvier 2004 - IRCOM GROUP - Author : A.Layec
 */

/* REVISION HISTORY :
 * $Log$
 */

#include "scicos_block.h"

/* Cette fonction de simulation réalise un codage type MQAM.
 * Le numéro symbole doit etre définis par un nombre entier non signé dont
 * la valeur est codée par un nombre de bits pair (4 bits, 6 bits, 8 bits,...).
 * Les sélecteurs ng (sélecteur bits de poid faibles) et nd (sélecteurs bits de poid fort)
 * viennent tronquer la valeur du port d'entrée.
 * On associe les valeurs entières des bits de poid faibles tronquées aux valeurs de l'axe
 * I, et on associe les valeurs entières des bits de poids forts tronquées et décalées
 * aux valeurs de l'axe Q.
 *
 * Entrée régulière :   u[0..insz[0]-1] : vecteur des numéros symboles
 * Sorties régulières : y1[0..insz[0]-1]: vecteur des signaux I
 *                      y2[0..insz[0]-1]: vecteur des signaux Q
 * Entrée évènementielle : instants de déclenchement
 * 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, ...)
 */

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

 for(j=0;j<(*n);j++)
 {
  /*récupération du nombre de bits associé à chaque axes*/
  /*n = block->ipar[j];*/

  /*Calcul des sélecteurs binaires (c'est maladroit!!)*/
  nd=(1<<(m[j])/2)-1;
  ng=(1<<(m[j]))-1-nd;

  /*récupération de la valeur du port d'entrée*/
  i=(int)u[j];

  /*Calcul de la valeur de I et de Q*/
  i_c[j]=((i&nd)*2)-nd;
  q_c[j]=(((i&ng)>>((m[j])/2))*2)-nd;
 }
 return;
}

/*prototype*/
void modqam(scicos_block *block,int flag)
{
  /*déclaration des variables*/
  double *y1,*y2;
  double *u;
  int nu;

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

  /*récupération du nombre de symbole en entrée*/
  nu=block->insz[0];

  /* Le flag 1 calcule les valeurs de I et de Q
   * suivant le numéro symbole u et suivant le
   * nombre de bits associé à chaque axes
   */

  if(flag==1||flag==6)
  {
   /*Appel modqamv_c*/
   modqamv_c(&nu,&block->ipar[0],&u[0],&y1[0],&y2[0]);
  }
}