Gold sequence generator is a class of pseudorandom generator which have good randomness properties in to order to decrease the multiple access noise found in multi-user DS-CDMA communication systems. It is composed with two Maximal Length Liner Shift Register (MLLSR) sequence generator. Most properties of this registers can be found in [1]. An example of block diagram of Gold sequence generator with 5-length MLLSR is shown in Fig. 1.2.
Each clock time, the registers shift all elements to the right. This generic equation gives the output of a Gold generator:
/* Gengold Scicos Gold Sequences Generator block
* Type 4 simulation function ver 1.1 - scilab-3.0
* 15 décembre 2004 - IRCOM GROUP - Author : A.Layec
*/
/* REVISION HISTORY :
* $Log$
*/
#include "machine.h"
#include <stdio.h>
#include "scicos_block.h"
/* Cette fonction de simulation est un générateur de sequences de gold.
* Les valeurs de sortie sont soit -1 soit 1 et dependent d'une combinaison linéaire
* des valeurs des registres internes Z. Les opérations sont réalisées grâce à des
* opérateurs de manipulations de bit, et les mots binaires sont stockés par leurs valeurs entières.
* La fonction est capable de délivrer des vecteurs de nb_gen générateurs.
*/
/* Entrée régulière : néant
* Sorties régulières : y[0..ny[0]-1] : sortie du générateur 1
* y[ny[0]..ny[0]+ny[1]-1] : sortie du générateur 2
* ...
* y[ny[nb_gen-2]..ny[nb_gen-2]+ny[nb_gen-1]] : sortie du générateur nb_gen
*
* Entrée évenementielle : période de déclenchement
* Sortie évènementielle : néant.
*
* Etats discrets : z[0..nb_gen-1] : valeur des registres à décalage 1
* z[nb_gen..2*nb_gen-1] : valeur des registres à décalage 2
*
* paramètres entiers : ipar[0] : nb_gen nombre de générateurs
* ipar[1..nb_gen] : ny[0..nb_gen-1] longeur des vecteurs de sortie des géné
* ipar[nb_gen+1..2*nb_gen] : longueur des registres (nbre de bascules)
* ipar[2*nb_gen+1..3*nb_gen] : valeurs des coefficients des registres 1
* ipar[3*nb_gen+1..4*nb_gen] : valeurs des coeff des registres 2
*/
void gengold(scicos_block *block,int flag)
{
/*déclaration des variables*/
int ny;
int nb_gen;
int reg1,reg2,N;
int coef1,coef2;
int k;
int n;
int y_ptr;
double *y;
/*Récupération de l'adresse du port de sortie*/
y=(double *)block->outptr[0];
/*Récupération du nombre de générateurs*/
nb_gen=block->ipar[0];
/*Fait décalage initial*/
if(flag==4)
{
/*Déclaration*/
int m,decal;
/*double y_trash[0];*/
m=1;
/*récupère le nombre de décalage initial*/
decal=(int) block->rpar[0];
for (k=0;k<nb_gen;k++)
{
/*Récupération de la longueur des registres*/
N=block->ipar[nb_gen+1+k];
/*Récupération de la valeur du registre 1 et 2*/
reg1=(int) block->z[k];
reg2=(int) block->z[nb_gen+k];
/*Récupération de la valeur des coef*/
coef1=block->ipar[2*nb_gen+1+k];
coef2=block->ipar[3*nb_gen+1+k];
for(n=0;n<decal;n++)
{
/*Appel routine gold_c*/
gold_c(&N,&m,&y[0],®1,®2,&coef1,&coef2);
}
/*Sauvegarde la valeur du registre1 dans z[0] et la valeur du reg 2 dans z[1]*/
block->z[k]=reg1;
block->z[nb_gen+k]=reg2;
}
}
/*Seulement sur flag 1*/
else if(flag==1)
{
for (k=0;k<nb_gen;k++)
{
/*Définition de l'adresse de départ de la sortie du géné k*/
if(k!=0) y_ptr=y_ptr+block->ipar[k];
else y_ptr=0;
/*Récupération de la longueur du vecteur de sortie*/
ny=block->ipar[1+k];
/*Récupération de la longueur des registres*/
N=block->ipar[nb_gen+1+k];
/*Récupération de la valeur du registre 1 et 2*/
reg1=(int) block->z[k];
reg2=(int) block->z[nb_gen+k];
/*Récupération de la valeur des coef*/
coef1=block->ipar[2*nb_gen+1+k];
coef2=block->ipar[3*nb_gen+1+k];
/*Appel routine gold_c*/
gold_c(&N,&ny,&y[y_ptr],®1,®2,&coef1,&coef2);
/*Sauvegarde la valeur du registre1 dans z[0] et la valeur du reg 2 dans z[1]*/
block->z[k]=reg1;
block->z[nb_gen+k]=reg2;
}
}
}