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>