Annotation of rpl/examples/obele.rpl, revision 1.1

1.1     ! bertrand    1: #!/usr/local/bin/rpl -cs
        !             2: 
        !             3: /*
        !             4: ================================================================================
        !             5:   Algorithme de l'Obèle
        !             6:     Copyright 2001, BERTRAND Joël.
        !             7: ================================================================================
        !             8:   Entrées : néant
        !             9: --------------------------------------------------------------------------------
        !            10:   Sorties : néant
        !            11: --------------------------------------------------------------------------------
        !            12:   Effets de bord : néant
        !            13: ================================================================================
        !            14: */
        !            15: 
        !            16: OBELE
        !            17: <<
        !            18:    rad 31 cf
        !            19: 
        !            20:    erase
        !            21:    "" disp
        !            22:    "Algorithme de l'obèle" disp
        !            23:    "{\Large\sl Algorithme de l'obèle}" pr1 drop
        !            24: 
        !            25:    { "standard*(*)" }
        !            26: 
        !            27:    if
        !            28:        "lambda" "existence" inquire
        !            29:    then
        !            30:        { { "name" "lambda" } "sequential" "replace" "writeonly" "formatted" }
        !            31:        open
        !            32:    else
        !            33:        { { "name" "lambda" } "sequential" "new" "writeonly" "formatted" } open
        !            34:    end
        !            35: 
        !            36:    format
        !            37: 
        !            38:    /* Paramètres d'entrée */
        !            39: 
        !            40:    4               // Nombre d'antennes
        !            41:    64              // Nombre de mobiles
        !            42:    64              // Facteur d'étalement
        !            43:    true            // Présence de bruit
        !            44:    1               // Seuil (contrainte à tenir en terme de C/I)
        !            45:    1E-5            // Niveau de bruit
        !            46:    1E-8            // Critère de convergence
        !            47:    "Statistique"   // Modèle de canal ("Statistique" ou "Aléatoire")
        !            48:    .5              // Distance entre les différents capteurs de l'antenne
        !            49:    { }             // Directions des trajets (simple déclaration de variable)
        !            50:    true            // Initialisation omnidirectionnelle (ou par un contrôle
        !            51:                    // de puissance élémentaire)
        !            52:    true            // Normalisation des diagrammes
        !            53:    true            // Diagrammes d'antenne en coordonnées polaires
        !            54:    true            // Impression du résultat
        !            55:    3               // Nombre de paquets de mobiles (modèle Statistique)
        !            56:    .02             // Dispersion en fraction de '2*PI' (modèle Statistique)
        !            57:    true            // Egalité des puissance émises (modèle Statistique)
        !            58:    true            // Un mobile par paquet tracé dans les diagrammes
        !            59:    -> UNITE N_ANTENNES N_MOBILES FACTEUR_ETALEMENT ALGORITHME_BRUITE SEUIL
        !            60:    BRUIT EPS MODELE_CANAL DIST DIRECTIONS INITIALISATION_OMNIDIRECTIONNELLE
        !            61:    DIAGRAMME_NORMALISE DIAGRAMMES_POLAIRES AUTORISATION_IMPRESSION PAQUETS
        !            62:    DISPERSION EQUIPUISSANCE TRACE_UN_MOBILE
        !            63:    <<
        !            64:        "" disp
        !            65:        "\vskip 3ex\noindent" pr1 drop
        !            66:        "Configuration" pr1 drop
        !            67:        "\hrule\vskip 1ex" pr1 drop
        !            68:        cr "Nombre d'antennes : " N_ANTENNES ->str + pr1 disp 
        !            69:        cr "Nombre de mobiles : " N_MOBILES ->str + pr1 disp
        !            70:        cr "Type de canal     : " MODELE_CANAL ->str + pr1 disp
        !            71: 
        !            72:        PAQUETS 1 ->list 0 con
        !            73:        -> REPARTITION
        !            74:        <<
        !            75:            PAQUETS DISPERSION DIST EQUIPUISSANCE
        !            76:            N_ANTENNES N_MOBILES MODELE_CANAL
        !            77:            INITIALISATION_R 'DIRECTIONS' sto 'REPARTITION' sto
        !            78:            if
        !            79:                ALGORITHME_BRUITE
        !            80:            then
        !            81:                SEUIL CONVERSION_ALGORITHME_BRUITE
        !            82:            end
        !            83: 
        !            84:            if
        !            85:                INITIALISATION_OMNIDIRECTIONNELLE
        !            86:            then
        !            87:                N_ANTENNES 1 2 ->list 0 con { 1 1 } 1 put
        !            88:                N_MOBILES 1 - dupn N_MOBILES ->list
        !            89:            else
        !            90:                dup FACTEUR_ETALEMENT ALGORITHME_BRUITE SEUIL
        !            91:                OPTIMISATION_SIMPLE
        !            92:            end
        !            93: 
        !            94:            N_MOBILES N_MOBILES 2 ->list 0 con -1 0 0
        !            95: 
        !            96:            -> LISTE_R V_PONDERATION F AVP VP PUISSANCES_INITIALES
        !            97:            <<
        !            98:                rclf 2 sci
        !            99:                1 N_MOBILES for J
        !           100:                    rclf std "  Utilisateur " J ->str + disp stof
        !           101:                    LISTE_R J get disp "" disp
        !           102:                next
        !           103:                stof
        !           104: 
        !           105:                /* Calcul des rapports C/I initiaux */
        !           106: 
        !           107:                LISTE_R V_PONDERATION
        !           108: 
        !           109:                'F' { 1 1 }
        !           110:                1 N_MOBILES for J
        !           111:                    1 N_MOBILES for K
        !           112:                        if
        !           113:                            J K same
        !           114:                        then
        !           115:                            0
        !           116:                        else
        !           117:                            V_PONDERATION K get
        !           118:                            dup trn
        !           119:                            LISTE_R J get
        !           120:                            rot * * { 1 1 } get
        !           121:                        end
        !           122:                        puti
        !           123:                    next
        !           124:                next
        !           125:                drop2
        !           126: 
        !           127:                if
        !           128:                    ALGORITHME_BRUITE not
        !           129:                then
        !           130:                    F regv max swap drop list-> drop
        !           131: 
        !           132:                    -> M C
        !           133:                    <<
        !           134:                        1 N_MOBILES for J
        !           135:                            M J C 2 ->list get re
        !           136:                        next
        !           137: 
        !           138:                        N_MOBILES 1 ->list ->array dup abs /
        !           139:                    >>
        !           140:                else
        !           141:                    N_MOBILES idn N_MOBILES 1 2 ->list SEUIL BRUIT * con swap
        !           142:                    F - inv swap * re array-> list-> drop2 1 ->list ->array
        !           143:                end
        !           144: 
        !           145:                2 sci
        !           146:                "\vskip 3ex\noindent" pr1 drop
        !           147:                "  Rapports C/I initiaux" pr1 disp
        !           148:                "\hrule\vskip 1ex" pr1 drop
        !           149:                "" disp
        !           150:                dup array-> 1 get ->list 1
        !           151: 
        !           152:                true
        !           153:                -> AUTORISATION_CALCUL
        !           154:                <<
        !           155:                    do
        !           156:                        geti
        !           157: 
        !           158:                        if
        !           159:                            0 <
        !           160:                        then
        !           161:                            false 'AUTORISATION_CALCUL' sto
        !           162:                        end
        !           163:                    until
        !           164:                        dup 1 same
        !           165:                    end
        !           166: 
        !           167:                    drop2
        !           168: 
        !           169:                    if 
        !           170:                        AUTORISATION_CALCUL
        !           171:                    then
        !           172:                        V_PONDERATION
        !           173:                        
        !           174:                        over 720 DIAGRAMMES_POLAIRES TRACE_UN_MOBILE
        !           175:                        N_MOBILES N_ANTENNES DIST DIAGRAMME_NORMALISE
        !           176:                        DIRECTIONS PAQUETS REPARTITION DIAGRAMME
        !           177: 
        !           178:                        if
        !           179:                            DIAGRAMMES_POLAIRES not
        !           180:                        then
        !           181:                            { "Azimut" "Puissance" } label
        !           182:                        end
        !           183: 
        !           184:                        "Diagrammes avant optimisation" title persist prlcd
        !           185:                        cllcd
        !           186: 
        !           187:                        dup
        !           188:                        -> PUISSANCES
        !           189:                        <<
        !           190:                            0
        !           191:                            1 PUISSANCES size 1 get for I
        !           192:                                PUISSANCES I 1 ->list get +
        !           193:                            next
        !           194:                        >>
        !           195: 
        !           196:                        'PUISSANCES_INITIALES' sto
        !           197: 
        !           198:                        if
        !           199:                            ALGORITHME_BRUITE not
        !           200:                        then
        !           201:                            0
        !           202:                        else
        !           203:                            BRUIT
        !           204:                        end
        !           205: 
        !           206:                        N_MOBILES FACTEUR_ETALEMENT
        !           207:                        CALCUL_RAPPORTS_SIGNAUX_INTERFERENCE
        !           208:                    else
        !           209:                        3 dropn
        !           210:                        "    Résolution impossible du système"
        !           211:                    end
        !           212: 
        !           213:                    pr1 disp
        !           214:                    "" disp
        !           215:                >>
        !           216: 
        !           217:                /* Boucle principale */
        !           218: 
        !           219:                "\vskip 3ex\noindent" pr1 drop
        !           220:                "  Minimisation de la plus grande valeur propre Lambda" disp
        !           221:                "  Minimisation de la plus grande valeur propre $\lambda$"
        !           222:                pr1 drop
        !           223:                "\hrule\vskip 1ex" pr1 drop
        !           224:                "" disp std
        !           225: 
        !           226:                while
        !           227:                    VP AVP - abs EPS >
        !           228:                repeat
        !           229: 
        !           230:                    /* Normalisation des pondérations */
        !           231: 
        !           232:                    1 N_MOBILES for J
        !           233:                        LISTE_R J get V_PONDERATION J get
        !           234:                        FACTEUR_ETALEMENT ALGORITHME_BRUITE SEUIL
        !           235:                        NORMALISATION array-> drop
        !           236: 
        !           237:                        N_ANTENNES 1 2 ->list ->array
        !           238:                        'V_PONDERATION' swap J swap put
        !           239:                    next
        !           240: 
        !           241:                    /* Calcul de la matrice F */
        !           242: 
        !           243:                    'F' { 1 1 }
        !           244:                    1 N_MOBILES for J
        !           245:                        1 N_MOBILES for K
        !           246:                            if
        !           247:                                J K same
        !           248:                            then
        !           249:                                0
        !           250:                            else
        !           251:                                V_PONDERATION K get
        !           252:                                dup trn
        !           253:                                LISTE_R J get
        !           254:                                rot * * { 1 1 } get
        !           255:                            end
        !           256:                            puti
        !           257:                        next
        !           258:                    next
        !           259:                    drop2
        !           260: 
        !           261:                    /* Calcul du plus grand vecteur propre gauche de F */
        !           262: 
        !           263:                    F legv
        !           264:                    -> MATRICE
        !           265:                    <<
        !           266:                        /* Réécriture de la fonction max pour éviter les */
        !           267:                        /* erreurs numériques d'arrondis apparaissant avec */
        !           268:                        /* les racines doubles du polynôme caractéristique    */
        !           269: 
        !           270:                        do
        !           271:                            MATRICE max
        !           272:                        until
        !           273:                            over re 0 >=
        !           274:        
        !           275:                            if
        !           276:                                dup not
        !           277:                            then
        !           278:                                swap 'MATRICE' swap 0 put swap drop
        !           279:                            end
        !           280:                        end
        !           281:                    >>
        !           282: 
        !           283:                    list-> drop rot swap
        !           284:                    -> COLONNE
        !           285:                    <<
        !           286:                        1 N_MOBILES for J
        !           287:                            dup J COLONNE 2 ->list get re swap
        !           288:                        next
        !           289: 
        !           290:                        drop
        !           291:                    >>
        !           292: 
        !           293:                    VP 'AVP' sto
        !           294:                    N_MOBILES 1 2 ->list ->array
        !           295:                    swap re dup 'VP' sto pr1
        !           296:                    UNITE over 1 ->list swap write
        !           297:                    "Lambda = " swap ->str + disp
        !           298: 
        !           299:                    /* Normalisation du plus grand vecteur gauche de F */
        !           300: 
        !           301:                    dup abs /
        !           302: 
        !           303:                    /* Calcul des matrices T */
        !           304: 
        !           305:                    -> PG
        !           306:                    <<
        !           307:                        1 N_MOBILES for J
        !           308:                            LISTE_R 1 get 0 con
        !           309: 
        !           310:                            1 N_MOBILES for K
        !           311:                                if
        !           312:                                    J K same not
        !           313:                                then
        !           314:                                    LISTE_R K get PG K 1 2 ->list get * +
        !           315:                                end
        !           316:                            next
        !           317:                        next
        !           318:                    >>
        !           319: 
        !           320:                    N_MOBILES ->list
        !           321: 
        !           322:                    /* Calcul des vecteurs propres généralisés des matrices T */
        !           323: 
        !           324:                    -> LISTE_T
        !           325:                    <<
        !           326:                        1 N_MOBILES for J
        !           327:                            LISTE_T J get LISTE_R J get gregv re min swap drop
        !           328:                            list-> drop
        !           329: 
        !           330:                            -> COLONNE
        !           331:                            <<
        !           332:                                1 N_ANTENNES for K
        !           333:                                    dup K COLONNE 2 ->list get swap
        !           334:                                next
        !           335: 
        !           336:                                drop N_ANTENNES 1 ->list ->array dup abs /
        !           337:                                N_ANTENNES 1 2 ->list rdm
        !           338:                                'V_PONDERATION' J rot put
        !           339:                            >>
        !           340:                        next
        !           341:                    >>
        !           342:                end
        !           343: 
        !           344:                /* Normalisation des pondérations */
        !           345: 
        !           346:                1 N_MOBILES for J
        !           347:                    LISTE_R J get V_PONDERATION J get
        !           348:                    FACTEUR_ETALEMENT ALGORITHME_BRUITE SEUIL
        !           349:                    NORMALISATION array-> drop
        !           350: 
        !           351:                    N_ANTENNES 1 2 ->list ->array
        !           352:                    'V_PONDERATION' swap J swap put
        !           353:                next
        !           354: 
        !           355:                /* Pondérations */
        !           356: 
        !           357:                "" disp
        !           358:                "  Pondérations optimales" pr1 disp
        !           359:                "\hrule\vskip 1ex" pr1 drop
        !           360:                "" disp
        !           361: 
        !           362:                1 N_MOBILES for J
        !           363:                    "W(" std J ->str + ") = " + 2 sci
        !           364:                    'V_PONDERATION' J get N_ANTENNES 1 ->list
        !           365:                    rdm pr1 ->str + disp
        !           366:                next
        !           367: 
        !           368:                /* Calcul des puissances par mobile nécessaires */
        !           369: 
        !           370:                "" disp
        !           371:                "\vskip 3ex\noindent" pr1 drop
        !           372:                "  Calcul des puissances par mobile nécessaires" pr1 disp
        !           373:                "\hrule\vskip 1ex" pr1 drop
        !           374:                "" disp
        !           375: 
        !           376:                if
        !           377:                    ALGORITHME_BRUITE not
        !           378:                then
        !           379:                    F regv max swap drop list-> drop
        !           380: 
        !           381:                    -> M C
        !           382:                    <<
        !           383:                        1 N_MOBILES for J
        !           384:                            M J C 2 ->list get re
        !           385:                        next
        !           386: 
        !           387:                        N_MOBILES 1 ->list ->array dup abs /
        !           388:                    >>
        !           389: 
        !           390:                    V_PONDERATION over 720 DIAGRAMMES_POLAIRES
        !           391:                    TRACE_UN_MOBILE N_MOBILES N_ANTENNES DIST
        !           392:                    DIAGRAMME_NORMALISE DIRECTIONS PAQUETS
        !           393:                    REPARTITION DIAGRAMME
        !           394: 
        !           395:                    if
        !           396:                        DIAGRAMMES_POLAIRES not
        !           397:                    then
        !           398:                        { "Azimut" "Puissance" } label
        !           399:                    end
        !           400: 
        !           401:                    "Diagrammes après optimisation" title persist prlcd
        !           402:                else
        !           403:                    if
        !           404:                        VP 1 >
        !           405:                    then
        !           406:                        "    Absence de solution physique !"
        !           407:                    else
        !           408:                        N_MOBILES idn N_MOBILES 1 2 ->list
        !           409:                        SEUIL BRUIT * con swap
        !           410:                        F - inv swap * re array-> list-> drop2
        !           411:                        1 ->list ->array
        !           412: 
        !           413:                        V_PONDERATION over 720 DIAGRAMMES_POLAIRES
        !           414:                        TRACE_UN_MOBILE N_MOBILES N_ANTENNES DIST
        !           415:                        DIAGRAMME_NORMALISE DIRECTIONS PAQUETS
        !           416:                        REPARTITION DIAGRAMME
        !           417: 
        !           418:                        if
        !           419:                            DIAGRAMMES_POLAIRES not
        !           420:                        then
        !           421:                            { "Azimut" "Puissance" } label
        !           422:                        end
        !           423: 
        !           424:                        "Diagrammes après optimisation" title persist prlcd
        !           425:                    end
        !           426:                end
        !           427:     
        !           428:                V_PONDERATION over 2 ->list "resultat_obele" store
        !           429:                { "graphique.eps" "postscript eps enhanced monochrome dashed" }
        !           430:                lcd->
        !           431: 
        !           432:                dup
        !           433: 
        !           434:                if
        !           435:                    dup type 2 same
        !           436:                then
        !           437:                    pr1
        !           438:                else
        !           439:                    dup array-> 1 get ->list pr1 drop
        !           440:                end
        !           441: 
        !           442:                if
        !           443:                    dup type 2 same not
        !           444:                then
        !           445:                    "P = " swap ->str + disp "" disp
        !           446: 
        !           447:                    LISTE_R V_PONDERATION rot
        !           448: 
        !           449:                    dup
        !           450:                    -> PUISSANCES
        !           451:                    <<
        !           452:                        0
        !           453:                        1 PUISSANCES size 1 get for I
        !           454:                            PUISSANCES I 1 ->list get +
        !           455:                        next
        !           456:                    >>
        !           457: 
        !           458:                    if
        !           459:                        PUISSANCES_INITIALES 0 same not
        !           460:                    then
        !           461:                        rclf swap 3 fix PUISSANCES_INITIALES swap %ch neg ->str
        !           462:                        " %" + swap stof
        !           463:                    else
        !           464:                        drop "absurde"
        !           465:                    end
        !           466: 
        !           467:                    "\vskip 3ex\noindent" pr1 drop
        !           468:                    "  Rapports C/I finaux "
        !           469:                    "(amélioration de la puissance émise : " +
        !           470:                    swap ->str + ")" + pr1 disp
        !           471: 
        !           472:                    if
        !           473:                        ALGORITHME_BRUITE not
        !           474:                    then
        !           475:                        0
        !           476:                    else
        !           477:                        BRUIT
        !           478:                    end
        !           479: 
        !           480:                    N_MOBILES FACTEUR_ETALEMENT
        !           481:                    CALCUL_RAPPORTS_SIGNAUX_INTERFERENCE
        !           482: 
        !           483:                    "\hrule\vskip 1ex" pr1 drop
        !           484:                    "" disp
        !           485:                    pr1 disp
        !           486:                    "" disp
        !           487: 
        !           488:                    cllcd
        !           489: 
        !           490:                    if
        !           491:                        AUTORISATION_IMPRESSION
        !           492:                    then
        !           493:                        print
        !           494:                    else
        !           495:                        erase
        !           496:                    end
        !           497:                else
        !           498:                    drop disp "" disp
        !           499:                    erase
        !           500:                    cllcd
        !           501:                end
        !           502:            >>
        !           503:        >>
        !           504: 
        !           505:        UNITE close
        !           506:    >>
        !           507: 
        !           508:    "  Temps CPU utilisé : " disp 2 fix time disp std
        !           509: >>
        !           510: 
        !           511: 
        !           512: /*
        !           513: ================================================================================
        !           514:   Calcul des rapports C/I pour chaque mobile
        !           515: ================================================================================
        !           516:   Entrées :
        !           517:    4: liste contenant les matrices R de chaque mobile
        !           518:    3: liste contenant les pondérations affectées à chaque mobile
        !           519:    2: vecteur contenant les puissances
        !           520:    1: sigma ** 2
        !           521: --------------------------------------------------------------------------------
        !           522:   Sorties :
        !           523:    1: liste contenant les rapports C/I
        !           524: --------------------------------------------------------------------------------
        !           525:   Effets de bord : néant
        !           526: ================================================================================
        !           527: */
        !           528: 
        !           529: CALCUL_RAPPORTS_SIGNAUX_INTERFERENCE
        !           530: <<
        !           531:    -> R W P SIGMA N_MOBILES FACTEUR_ETALEMENT
        !           532:    <<
        !           533:        1 N_MOBILES for I
        !           534:            P I 1 ->list get
        !           535:            W I get dup trn swap
        !           536:            R I get swap * * * { 1 1 } get re
        !           537: 
        !           538:            SIGMA
        !           539:            1 N_MOBILES for J
        !           540:                if
        !           541:                    I J same
        !           542:                then
        !           543:                    cycle
        !           544:                end
        !           545: 
        !           546:                P J 1 ->list get
        !           547:                W J get dup trn swap
        !           548:                R I get swap * * * { 1 1 } get re +
        !           549:            next
        !           550: 
        !           551:            / FACTEUR_ETALEMENT *
        !           552:        next
        !           553: 
        !           554:        N_MOBILES ->list
        !           555:    >>
        !           556: >>
        !           557: 
        !           558: 
        !           559: /*
        !           560: ================================================================================
        !           561:   Fonction de normalisation des vecteurs W de telle sorte que trn(W)*R*W = 1
        !           562: ================================================================================
        !           563:   Entrées :
        !           564:    2: matrice R
        !           565:    1: vecteur W
        !           566: --------------------------------------------------------------------------------
        !           567:   Sorties :
        !           568:    1: vecteur W normalisé
        !           569: --------------------------------------------------------------------------------
        !           570:   Effets de bord : néant
        !           571: ================================================================================
        !           572: */
        !           573: 
        !           574: NORMALISATION
        !           575: <<
        !           576:    -> R W FACTEUR_ETALEMENT ALGORITHME_BRUITE SEUIL
        !           577:    <<
        !           578:        W dup trn R FACTEUR_ETALEMENT *
        !           579: 
        !           580:        if
        !           581:            ALGORITHME_BRUITE
        !           582:        then
        !           583:            SEUIL / 
        !           584:        end
        !           585: 
        !           586:        W * * abs sqrt /
        !           587:    >>
        !           588: >>
        !           589: 
        !           590: 
        !           591: /*
        !           592: ================================================================================
        !           593:   Fonction renvoyant une liste contenant les différentes matrices R
        !           594: ================================================================================
        !           595:   Entrées :
        !           596:    3: nombre d'antennes (entier)
        !           597:    2: nombre de mobiles (entier)
        !           598:    1: nombre de trajets (entier)
        !           599: --------------------------------------------------------------------------------
        !           600:   Sorties :
        !           601:    2: liste contenant autant de matrices R qu'il y a de mobiles
        !           602:    1: directions des mobiles
        !           603: --------------------------------------------------------------------------------
        !           604:   Effets de bord : néant
        !           605: ================================================================================
        !           606: */
        !           607: 
        !           608: INITIALISATION_R
        !           609: <<
        !           610:    "" disp
        !           611:    "  Initialisation des matrices d'autocorrélation du canal" disp
        !           612:    "" disp
        !           613: 
        !           614:    "\vskip 3ex\noindent" pr1 drop
        !           615:    "Positions et puissances des différents récepteurs" pr1 drop
        !           616:    "\hrule\vskip 1ex" pr1 drop
        !           617: 
        !           618:    { } dup
        !           619:    -> PAQUETS DISPERSION DIST EQUIPUISSANCE NA NM MODELE DIRECTIONS
        !           620:    REPARTITION_INTERNE
        !           621:    <<
        !           622:        rclf
        !           623: 
        !           624:        if
        !           625:            MODELE "Statistique" same
        !           626:        then
        !           627:            PAQUETS 1 ->list 0 con 'REPARTITION_INTERNE' sto
        !           628: 
        !           629:            /*
        !           630:            Génération de matrices de covariance du canal grâce
        !           631:            au modèle du Statistique
        !           632:            */
        !           633: 
        !           634:            deg 4 fix { 3 9 } 0 con
        !           635:            DIST 180 25 0 0 PAQUETS 1 ->list 0 con
        !           636:            -> COEFF    // Coefficients du modèle :
        !           637:                        // - ligne 1 : direction du trajet en degrés;
        !           638:                        // - ligne 2 : puissance du trajet en dB;
        !           639:                        // - ligne 3 : retard du trajet en ns.
        !           640:            D           // Distance entre deux capteurs consécutifs comptée en
        !           641:                        // longueur d'onde
        !           642:            SECTEUR     // Demi angle d'ouverture d'un secteur (en degrés)
        !           643:            DTHETA      // Paramètre d'ouverture du modèle (en degrés)
        !           644:            GISMIN      // Gisement le plus faible vu du secteur
        !           645:            GISMAX      // Gisement le plus grand vu du secteur
        !           646:            ANGLES_MOYENS
        !           647:            <<
        !           648:                SECTEUR neg DTHETA 4 * - 'GISMIN' sto
        !           649:                SECTEUR DTHETA 2 * + 'GISMAX' sto
        !           650: 
        !           651:                'COEFF' { 1 1 }
        !           652: 
        !           653:                0 puti
        !           654:                DTHETA 2 / puti
        !           655:                DTHETA 2 / neg puti
        !           656:                DTHETA 2 / 1 - puti
        !           657:                1 DTHETA 2 / - puti
        !           658:                2 DTHETA * puti
        !           659:                -2 DTHETA * puti
        !           660:                3 DTHETA * puti
        !           661:                4 DTHETA * puti
        !           662: 
        !           663:                -2 puti
        !           664:                -7 puti
        !           665:                -7 puti
        !           666:                -4 puti
        !           667:                -4 puti
        !           668:                -9 puti
        !           669:                -10 puti
        !           670:                -15 puti
        !           671:                -20 puti
        !           672: 
        !           673:                0 puti
        !           674:                0 puti
        !           675:                0 puti
        !           676:                310 puti
        !           677:                310 puti
        !           678:                710 puti
        !           679:                1090 puti
        !           680:                1730 puti
        !           681:                2510 puti
        !           682: 
        !           683:                drop2
        !           684: 
        !           685:                0 -> CUMUL
        !           686:                <<
        !           687:                    1 COEFF size 2 get for I
        !           688:                        'COEFF' 2 I 2 ->list 'COEFF' over get 10 / alog
        !           689:                        dup 'CUMUL' sto+ put
        !           690:                    next
        !           691: 
        !           692:                    1 COEFF size 2 get for I
        !           693:                        'COEFF' 2 I 2 ->list 'COEFF' over get CUMUL / put
        !           694:                    next
        !           695:                >>
        !           696: 
        !           697:                // Calcul de la répartition des mobiles dans les paquets
        !           698:                'REPARTITION_INTERNE' { 1 }
        !           699:                1 PAQUETS for P
        !           700:                    rand puti
        !           701:                next
        !           702:                drop2
        !           703: 
        !           704:                REPARTITION_INTERNE array-> 1 get 2 swap for P + next
        !           705: 
        !           706:                -> CLEF
        !           707:                <<
        !           708:                    1 PAQUETS for P
        !           709:                        'REPARTITION_INTERNE' dup P 1 ->list get NM * CLEF /
        !           710:                        ip P 1 ->list swap
        !           711: 
        !           712:                        if 
        !           713:                            dup 1 <
        !           714:                        then
        !           715:                            drop 1
        !           716:                        end
        !           717: 
        !           718:                        put
        !           719:                    next
        !           720:                >>
        !           721: 
        !           722:                0 1 PAQUETS for P
        !           723:                    'REPARTITION_INTERNE' P 1 ->list get +
        !           724:                next
        !           725: 
        !           726:                NM -
        !           727:                -> DIFFERENCE
        !           728:                <<
        !           729:                    if
        !           730:                        DIFFERENCE 0 >
        !           731:                    then
        !           732:                        while
        !           733:                            DIFFERENCE
        !           734:                        repeat
        !           735:                            rand PAQUETS * ip 1 + 1 ->list dup
        !           736:                            if
        !           737:                                'REPARTITION_INTERNE' swap get dup 1 >
        !           738:                            then
        !           739:                                1 - 'REPARTITION_INTERNE' rot rot put
        !           740:                                'DIFFERENCE' 1 sto-
        !           741:                            else
        !           742:                                drop2
        !           743:                            end
        !           744:                        end
        !           745:                    else
        !           746:                        while
        !           747:                            DIFFERENCE
        !           748:                        repeat
        !           749:                            rand PAQUETS * ip 1 + 1 ->list dup
        !           750:                            if
        !           751:                                'REPARTITION_INTERNE' swap get dup NM < 
        !           752:                            then
        !           753:                                1 + 'REPARTITION_INTERNE' rot rot put
        !           754:                                'DIFFERENCE' 1 sto+
        !           755:                            else
        !           756:                                drop2
        !           757:                            end
        !           758:                        end
        !           759:                    end
        !           760:                >>
        !           761: 
        !           762:                'ANGLES_MOYENS' { 1 }
        !           763:                1 PAQUETS for P
        !           764:                    rand 2 SECTEUR * * SECTEUR - puti
        !           765:                next
        !           766:                drop2
        !           767: 
        !           768:                rclf std
        !           769:                "Répartition : " REPARTITION_INTERNE ->str + pr1
        !           770:                "\hrule\vskip 1ex" pr1 drop
        !           771:                disp "" disp stof
        !           772: 
        !           773:                // Boucle sur les paquets de mobiles
        !           774:                1 PAQUETS for P
        !           775: 
        !           776:                    // Boucle sur les mobiles
        !           777:                    1 REPARTITION_INTERNE P 1 ->list get for K
        !           778:                        rand 2 SECTEUR * * SECTEUR - DISPERSION *
        !           779:                        ANGLES_MOYENS P 1 ->list get +
        !           780:                        DIRECTIONS over 1 ->list + 'DIRECTIONS' sto
        !           781:                        "Azimut : " over ->hms ->str + dup " ° (HMS)" + disp
        !           782:                        "\degre (HMS)" + cr pr1 drop
        !           783: 
        !           784:                        NA COEFF size 2 get 2 ->list 0 con
        !           785:                        COEFF size 2 get dup 2 ->list 0 con 0
        !           786:                        -> AZIMUT MD P TRAJETS_RETENUS
        !           787:                        <<
        !           788:                            1 COEFF size 2 get for I
        !           789:                                'COEFF' 1 I 2 ->list get AZIMUT +
        !           790:                                -> G
        !           791:                                <<
        !           792:                                    if
        !           793:                                        G SECTEUR <= G SECTEUR neg >= and
        !           794:                                        SECTEUR 180 >= or
        !           795:                                    then
        !           796:                                        1 NA for J
        !           797:                                            'MD' 2 i pi * * ->num
        !           798:                                            D J 1 - * * G sin * exp
        !           799:                                            J I 2 ->list swap put
        !           800:                                        next
        !           801: 
        !           802:                                        'P' COEFF 2 I 2 ->list get
        !           803:                                        I dup 2 ->list swap put
        !           804:                                        1 'TRAJETS_RETENUS' sto+
        !           805:                                    end
        !           806:                                >>
        !           807:                            next
        !           808: 
        !           809:                            MD P
        !           810: 
        !           811:                            if
        !           812:                                EQUIPUISSANCE
        !           813:                            then
        !           814:                                1
        !           815:                            else
        !           816:                                nrand sq
        !           817:                            end
        !           818: 
        !           819:                            "Puissance : " over ->str + cr pr1 disp
        !           820:                            * over trn * *
        !           821: 
        !           822:                            // Rajout de bruit pour éviter d'avoir une
        !           823:                            // matrice R de rang non plein
        !           824: 
        !           825:                            if
        !           826:                                TRAJETS_RETENUS over size 1 get <
        !           827:                            then
        !           828:                                dup idn over abs 1E-6 / * +
        !           829:                            end
        !           830:                        >>
        !           831:                    next
        !           832:                next
        !           833:            >>
        !           834: 
        !           835:            rad
        !           836:        else
        !           837: 
        !           838:            /* Génération de matrices R aléatoires */
        !           839: 
        !           840:            // Nombre de trajets
        !           841:            4 -> NT
        !           842:            <<
        !           843:                // Boucle sur les mobiles
        !           844:                1 NM for K
        !           845:                    "  Utilisateur " std K ->str + disp "" disp
        !           846:                    NT NA 2 ->list 0 con
        !           847: 
        !           848:                    // Boucle sur les trajets
        !           849:                    1 NT for L
        !           850:                        L 1 2 ->list
        !           851:                        rand 2 pi ->num * *
        !           852:                        DIRECTIONS over r->d 1 ->list + 'DIRECTIONS' sto
        !           853:                        nrand sq
        !           854: 
        !           855:                        -> D P
        !           856:                        <<
        !           857:                            std
        !           858:                            "    Trajet " L ->str + disp
        !           859:                            4 sci "      -> Puissance " P ->str + disp
        !           860:                            4 fix "      -> Azimut    " D r->d ->hms ->str +
        !           861:                            "° (HMS)" + disp "" disp
        !           862: 
        !           863:                            // Boucle sur les capteurs
        !           864:                            1 NA for J
        !           865:                                i ->num D sin J 1 - * * DIST *
        !           866:                                2 pi ->num * 2E9 * * exp P * puti
        !           867:                            next
        !           868:                            drop
        !           869:                        >>
        !           870:                    next
        !           871:                    trn conj dup trn *
        !           872:                next
        !           873:            >>
        !           874:  
        !           875:            NM 1 ->list 1 con 'REPARTITION_INTERNE' sto
        !           876:        end
        !           877: 
        !           878:        NM ->list
        !           879:        swap stof
        !           880:        REPARTITION_INTERNE
        !           881:        DIRECTIONS
        !           882:    >>
        !           883: 
        !           884:    "" disp
        !           885: >>
        !           886: 
        !           887: 
        !           888: /*
        !           889: ================================================================================
        !           890:   Fonction permettant de convertir l'algorithme non bruité en sa version
        !           891:   bruitée
        !           892: ================================================================================
        !           893:   Entrées :
        !           894:    2: liste contenant les différentes matrices R
        !           895:    1: seuil
        !           896: --------------------------------------------------------------------------------
        !           897:   Sorties :
        !           898:    1: liste contenant les nouvelles matrices R'
        !           899: --------------------------------------------------------------------------------
        !           900:   Effets de bord : néant
        !           901: ================================================================================
        !           902: */
        !           903: 
        !           904: CONVERSION_ALGORITHME_BRUITE
        !           905: <<
        !           906:    -> L_R SEUIL
        !           907:    <<
        !           908:        1 L_R size for J
        !           909:            'L_R' dup J get SEUIL * J swap put
        !           910:        next
        !           911: 
        !           912:        L_R
        !           913:    >>
        !           914: >>
        !           915: 
        !           916: 
        !           917: /*
        !           918: ================================================================================
        !           919:   Calcul simple des pondérations et des puissances
        !           920: ================================================================================
        !           921:   Entrées :
        !           922:     1: liste contenant les différentes matrices R
        !           923: --------------------------------------------------------------------------------
        !           924:   Sorties :
        !           925:     2: liste contenant les pondérations et les puissances
        !           926:    1: valeur propre
        !           927: --------------------------------------------------------------------------------
        !           928:   Effets de bord : néant
        !           929: ================================================================================
        !           930: */
        !           931: 
        !           932: OPTIMISATION_SIMPLE
        !           933: <<
        !           934:    -> LISTE FACTEUR_ETALEMENT ALGORITHME_BRUITE SEUIL
        !           935:    <<
        !           936:        1 LISTE size for N
        !           937:            LISTE N get regv max swap drop
        !           938:            list-> drop over size 1 get 1 2 ->list 0 con
        !           939: 
        !           940:            -> INDICE TABLEAU
        !           941:            <<
        !           942:                1 over size 1 get for M
        !           943:                    dup M 1 2 ->list get 'TABLEAU' swap M 1 2 ->list swap put
        !           944:                next
        !           945:                drop LISTE N get TABLEAU FACTEUR_ETALEMENT ALGORITHME_BRUITE
        !           946:                SEUIL NORMALISATION
        !           947:            >>
        !           948:        next
        !           949: 
        !           950:        LISTE size ->list
        !           951:    >>
        !           952: >>
        !           953: 
        !           954: 
        !           955: /*
        !           956: ================================================================================
        !           957:   Calcul du diagramme de rayonnement du réseau d'antennes
        !           958: ================================================================================
        !           959:   Entrées :
        !           960:    3: liste contenant tous les vecteurs de pondération
        !           961:    2: puissances
        !           962:    1: nombre de points à calculer par diagramme
        !           963: --------------------------------------------------------------------------------
        !           964:   Sorties :
        !           965:    néant
        !           966: --------------------------------------------------------------------------------
        !           967:   Effets de bord : néant
        !           968: ================================================================================
        !           969: */
        !           970: 
        !           971: DIAGRAMME
        !           972: <<
        !           973:    0
        !           974:    -> PONDERATIONS PUISSANCES NB_POINTS DIAGRAMMES_POLAIRES
        !           975:    TRACE_UN_MOBILE N_MOBILES N_ANTENNES DIST DIAGRAMME_NORMALISE
        !           976:    DIRECTIONS PAQUETS REPARTITION MAXIMUM
        !           977:    <<
        !           978:        cllcd
        !           979: 
        !           980:        { { 60 "ticsonly" 2 } { "automatic" "ticsonly" 10 } } axes
        !           981: 
        !           982:        if
        !           983:            DIAGRAMMES_POLAIRES
        !           984:        then
        !           985:            1 d->r
        !           986:            -> PAS
        !           987:            <<
        !           988:                0
        !           989:                1 N_MOBILES for I
        !           990:                    0 2 pi ->num * for T
        !           991:                        if
        !           992:                            DIST N_ANTENNES T PONDERATIONS I DIAGRAMME_NORMALISE
        !           993:                            PUISSANCES FCT_DIAGRAMME dup 3 pick >
        !           994:                        then
        !           995:                            swap
        !           996:                        end
        !           997:                        drop PAS
        !           998:                    step
        !           999:                next
        !          1000:            >>
        !          1001: 
        !          1002:            dup 'MAXIMUM' sto dup r->c dup pmax neg pmin
        !          1003: 
        !          1004:            parametric { T 0 'MAXIMUM' } indep MAXIMUM res
        !          1005:            << T I DIRECTIONS FCT_DIRECTIONS >> steq
        !          1006: 
        !          1007:            1 N_MOBILES for I
        !          1008:                draw
        !          1009:            next
        !          1010: 
        !          1011:            polar { T 0 '2*PI' } indep 2 pi ->num * NB_POINTS / res
        !          1012:            << DIST N_ANTENNES T PONDERATIONS I DIAGRAMME_NORMALISE 
        !          1013:            PUISSANCES FCT_DIAGRAMME >> steq
        !          1014: 
        !          1015:            if
        !          1016:                TRACE_UN_MOBILE
        !          1017:            then
        !          1018:                1
        !          1019:                -> I
        !          1020:                <<
        !          1021:                    1 PAQUETS for POINTEUR
        !          1022:                        draw
        !          1023:                        'I' REPARTITION POINTEUR 1 ->list get ip sto+
        !          1024:                    next
        !          1025:                >>
        !          1026:            else
        !          1027:                1 N_MOBILES for I
        !          1028:                    draw
        !          1029:                next
        !          1030:            end
        !          1031:        else
        !          1032:            { X Y } autoscale 'Y' logscale 
        !          1033:            parametric { T '-PI' 'PI' } indep 2 pi ->num * NB_POINTS / res
        !          1034:            << T r->d DIST N_ANTENNES T PONDERATIONS I DIAGRAMME_NORMALISE
        !          1035:            PUISSANCES FCT_DIAGRAMME r->c >> steq
        !          1036: 
        !          1037:            if
        !          1038:                TRACE_UN_MOBILE
        !          1039:            then
        !          1040:                1
        !          1041:                -> I
        !          1042:                <<
        !          1043:                    1 PAQUETS for POINTEUR
        !          1044:                        draw
        !          1045:                        'I' REPARTITION POINTEUR 1 ->list get ip sto+
        !          1046:                    next
        !          1047:                >>
        !          1048:            else
        !          1049:                1 N_MOBILES for I
        !          1050:                    draw
        !          1051:                next
        !          1052:            end
        !          1053:        end
        !          1054:    >>
        !          1055: 
        !          1056:    drax
        !          1057: >>
        !          1058: 
        !          1059: 
        !          1060: FCT_DIRECTIONS
        !          1061: <<
        !          1062:    -> T I DIRECTIONS
        !          1063:    <<
        !          1064:        rclf deg
        !          1065:        DIRECTIONS I get dup cos T * swap sin T * i ->num * +
        !          1066:        swap stof
        !          1067:    >>
        !          1068: >>
        !          1069: 
        !          1070: 
        !          1071: FCT_DIAGRAMME
        !          1072: <<
        !          1073:    -> DIST N_ANTENNES T PONDERATIONS I DIAGRAMME_NORMALISE PUISSANCES
        !          1074:    <<
        !          1075:        N_ANTENNES 1 ->list i ->num 2 pi ->num * * T sin DIST * * con
        !          1076: 
        !          1077:        1 N_ANTENNES for J
        !          1078:            dup J 1 ->list get J 1 - * exp
        !          1079:            J 1 ->list swap put
        !          1080:        next
        !          1081: 
        !          1082:        PONDERATIONS I get array-> 1 get 1 ->list ->array swap dot abs 2 /
        !          1083: 
        !          1084:        if
        !          1085:            DIAGRAMME_NORMALISE not
        !          1086:        then
        !          1087:            PUISSANCES I 1 ->list get *
        !          1088:        end
        !          1089:    >>
        !          1090: >>
        !          1091: 
        !          1092: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>