Fonction de calcul
fr


demodpsk

Contenu du fichier


/* demodpsk Scicos demodulator MPSK block
 * Type 4 simulation function ver 1.0 - scilab-3.0
 * 22 décembre 2004 - IRCOM GROUP - Author : A.Layec
 */
 
/* REVISION HISTORY :
 * $Log$
 */
 
#include <math.h>

#include "scicos_block.h"

#define M_PI		3.14159265358979323846
/* Cette fonction de simulation réalise un démodulateur MPSK.
 * A chaque instant de déclenchement les valeurs de I et Q sont
 * lues en entrée et la fonction calcule dans un premier temps
 * arctang[-Q/I] pour récupérer la valeur de la phase. Ensuite
 * elle calcule la valeur du numéro symbole par la formule
 * y=(int)((phi*n)/(2*%pi)) avec n le nombre d'états et phi la valeur
 * de arctang[-Q/I].
 *
 * entrées régulières: u1[0..insz[0]-1] vecteur des signaux I
 *                     u2[0..insz[0]-1] vecteur des signaux Q
 * sorties régulières : y[0..insz[0]-1] vecteur des numéros symboles
 * entrée évènementielles : instants de déclenchement
 * sorties évènementielles : néant
 * paramatres entiers : ipar[0..insz[0]-1] : vecteur du nombre d'état
 */

/* demodpskv_c routine de calcul de démodulation PSK
 *
 * Entrées :
 * n      : taille des vecteur originaux
 * m      : nombre d'états (vecteur)
 * i_c    : vecteur de la composante I
 * q_c    : vecteur de la composante Q
 * Sorties :
 * y      : vecteur du numéro symbole
 *
 * dépendance :
 * math.h
 */
 
void demodpskv_c(int *n,int *m,double *i_c,double *i_q,double*y)
{
 /*Déclaration des variables*/
 int i;
 double phi;
 
 for(i=0;i<(*n);i++)
 {
  /*Calcul de la phase*/
  phi=atan2(-i_q[i],i_c[i]);
  if(phi<0) phi = phi + 2*M_PI;
  /*Calcul du numéro symbole*/
  y[i]=(int)(phi*m[i]/(2*M_PI));
 }
 return;
}

/*Prototype*/
void demodpsk(scicos_block *block,int flag)
{
 /*Déclaration des variables*/
 double *y;
 double *u1,*u2;

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

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