Le bloc démodulateur M-QAM fonctionne de paire avec le bloc modulateur M-QAM. Pour fonctionner correctement, les valeurs en entrée de ce bloc doivent être entières, comme définies à la sortie du bloc modulateur. Le paramètre 'Number of states' de la boîte de dialogue, qui définit le nombre d'états de la modulation, doit être calculé avec la formule :
/* 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 "machine.h" #include <stdio.h> #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,j; 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 i,n; int nu; int nd,ng; int d,g; /*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]); } }