Bloc récepteur QPSK
- Number of Symbols :
Type 'vec' de taille 1. La description du paramètre 1.
- Number of bits per symbol :
Type 'vec' de taille 1. La description du paramètre 2.
- Type of Modulation(0:PSK,1:QAM) :
Type 'vec' de taille 1. La description du paramètre 3.
- Samples per symbol :
Type 'vec' de taille 1. La description du paramètre 4.
- Type of filtering(0:No filter,1:Generic,2:RRC,3:RC,4:Gauss) :
Type 'vec' de taille 1. La description du paramètre 5.
- Initial counter value of Symbol integral :
Type 'vec' de taille 1. La description du paramètre 6.
- toujours actif: non
- direct-feedthrough: oui
- détection de passage à zéro: non
- mode: non
- nombre/taille des entrées régulières: 2 / 768 768
- nombre/taille des sorties sorties régulières: 1 / 64
- nombre/taille des entrées évènementielles: 0 /
- nombre/taille des sorties évènementielles: 0 /
- possède un état continu: non
- possède un état discret: oui
- nom de la fonction de calcul: mpskrec
QPSKREC_f.sci
/* mpskemit Scicos Mary Phase Shift Keying Emmiter
* Type 4 simulation function ver 1.0 - scilab-3.0
* 22 décembre 2004 - IRCOM GROUP - Author : A.Layec
*/
/* REVISION HISTORY :
* $Log$
*/
#include "scicos_block.h"
#include "machine.h"
#include <math.h>
#include <stdio.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 i,k;
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;
/*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];
/*
Le flag 1 calcule la valeur de I et de Q en fonction
du numéro symbole u[] et du nombre du nombre d'état m
*/
if(flag==1||flag==6)
{
/*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;
}
/*Récupération de l'adresse de départ du vecteur alloué*/
z__=*block->work;
/*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*/
F2C(dcopy)(&nu,&u1[0],(k=1,&k),&zi1_r[0],(k=1,&k));
F2C(dcopy)(&nu,&u2[0],(k=1,&k),&zq1_r[0],(k=1,&k));
/*Recopie rpar[] dans zi2_r[] et zq2_r*/
F2C(dcopy)(&nb_coef,&(block->rpar[0]),(k=1,&k),&zi2_r[0],(k=1,&k));
F2C(dcopy)(&nb_coef,&(block->rpar[0]),(k=1,&k),&zq2_r[0],(k=1,&k));
/*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]);
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]);
/*Appel intsymb_c*/
intsym_c(&nu,&nech,&inits_c,&step,&yi_r[0],&zi1_r[0],&z[2*nb_coef]);
intsym_c(&nu,&nech,&inits_c,&step,&yq_r[0],&zi2_r[0],&z[2*nb_coef+1]);
/*Appel comp_c*/
comp_c(&nu,&lc,&zi1_r[0],&yi_r[0]);
comp_c(&nu,&lc,&zi2_r[0],&yq_r[0]);
/*Appel sousecht_c*/
sousecht_c(&nu,&nech,&initso_c,&yi_r[0],&zi1_r[0]);
sousecht_c(&nu,&nech,&initso_c,&yq_r[0],&zi2_r[0]);
/*Appel demodpsk_c*/
demodpsk_c(&ny,&m,&zi1_r[0],&zi2_r[0],&y[0]);
/*Libère mémoire allouée*/
scicos_free(*block->work);
}
}
IRCOM Group
Alan Layec