/* Modnumlib Scicos interfacing function * Copyright (C) 2009 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. */ /* demodiq Scicos demodulator I/Q block * Type 2 simulation function ver 1.0 - scilab-2.6&2.7 * 8 novembre 2003 - IRCOM GROUP - Author : A.Layec */ /* REVISION HISTORY : * $Log$ */ #include <math.h> #include "machine.h" /* Cette fonction calcule la partie réelle et imaginaire de l'enveloppe * complexe en bande de base à partir de la partie réelle et imaginaire * de l'enveloppe modulée autour d'une fréquence wo : * y1=u1*cos(wot)+u2*sin(wot) * y2=u1*sin(wot)-u2*cos(wot) * où y1, y2 sont les sorties, u1 et u2 sont la partie réelle et imaginaire * du signal modulé et wo un paramètre réel en rad/s. Les porteuses sont en fait * sur-échantillonnées par la variable *t. Le rythme des déclenchements défini * donc la période de sur-échantillonnage. * * entrées régulières: u1[0..insz[0]-1] vecteur des parties réelles du signal modulé * u2[0..insz[0]-1] vecteur des parties imaginaires du signal modulé * sorties régulières : y1[0..insz[0]-1] vecteur des parties réelles du signal en bande de base * y2[0..insz[0]-1] vecteur des parties imaginaires du signal en bande de base * entrée évènementielles : instants de suréchantillonnage * sorties évènementielles : néant * paramatres réels : rpar[0..insz[0]-1] : vecteur des pulsations porteuses */ /*prototype*/ void demodiq(flag,nevprt,t,xd,x,nx,z,nz,tvec,ntvec,rpar,nrpar, ipar,nipar,inptr,insz,nin,outptr,outsz,nout) integer *flag,*nevprt,*nx,*nz,*ntvec,*nrpar,ipar[],*nipar,insz[],*nin,outsz[],*nout; double x[],xd[],z[],tvec[],rpar[]; double *inptr[],*outptr[],*t; { /*déclaration des variables*/ double *y1,*y2; double *u1,*u2; int nu,i; /*récupération des adresses des ports réguliers*/ y1=(double *)outptr[0]; y2=(double *)outptr[1]; u1=(double *)inptr[0]; u2=(double *)inptr[1]; /*récupération de la taille des ports d'entrées*/ nu=insz[0]; /*Le flag 1 calcule la partie réelle et imaginaire de * l'enveloppe complexe en bande de base. */ if(*flag==1) { for(i=0;i<nu;i++) { /*Calcul du registre y*/ y1[i]=cos(*t*rpar[i])*u1[i]+sin(*t*rpar[i])*u2[i]; y2[i]=sin(*t*rpar[i])*u1[i]-cos(*t*rpar[i])*u2[i]; } } }