mpskrec
/* Modnumlib Scicos interfacing function
* Copyright (C) 2009-2011 Alan Layec
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/* mpskrec Scicos Mary Phase Shift Keying receiver
* Type 4 simulation function ver 1.0 - scilab-3.0
* 22 décembre 2004 - IRCOM GROUP - Author : A.Layec
*/
/* REVISION HISTORY :
* $Log$
*/
#include <scicos/scicos_block.h>
#include "modnum_lib.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 mu=1;
int my=1;
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;
/*fft variables*/
fft_pr_struct fft_pr;
/*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];
/* init : fait l'allocation de work */
if (flag==4) {
/*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;
}
}
/* Le flag 2 calcule la valeur de I et de Q en fonction
* du numéro symbole u[] et du nombre du nombre d'état m
*/
else if(flag==1) {
/*else if(flag==2) {*/
/*Récupération de l'adresse de départ du vecteur alloué*/
z__=*block->work;
/* initialize fft_pr*/
fft_pr.lfft = m1;
fft_pr.ffttyp = 0;
/*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*/
copyd_c(&nu,&u1[0],&zi1_r[0]);
copyd_c(&nu,&u2[0],&zq1_r[0]);
/*Recopie rpar[] dans zi2_r[] et zq2_r*/
copyd_c(&nb_coef,&(block->rpar[0]),&zi2_r[0]);
copyd_c(&nb_coef,&(block->rpar[0]),&zq2_r[0]);
/*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],&fft_pr);
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],&fft_pr);
/*Appel intsymb_c*/
intsym_c(&nu,&mu,&nech,&inits_c,&step,&yi_r[0],&zi1_r[0],&z[2*nb_coef]);
intsym_c(&nu,&mu,&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,&mu,&nech,&initso_c,&yi_r[0],&zi1_r[0]);
sousecht_c(&nu,&mu,&nech,&initso_c,&yq_r[0],&zi2_r[0]);
// }
// else if(flag==1) {
// /*Récupération de l'adresse de départ du vecteur alloué*/
// z__=*block->work;
//
// /*Déclaration de pointeurs auxiliaires*/
// zi1_r = &(z__[0]) ;
// zi2_r = &(z__[2*m1]);
/*Appel demodpsk_c*/
demodpsk_c(&ny,&my,&m,&zi1_r[0],&zi2_r[0],&y[0]);
}
/*Terminaison */
else if (flag==5) {
/*Libère mémoire allouée*/
scicos_free(*block->work);
}
}