| [637] | 1 |  | 
|---|
|  | 2 | /************************************************************************/ | 
|---|
|  | 3 | /*******                                                        *********/ | 
|---|
|  | 4 | /*******        compresseur de données rangées en ligne         *********/ | 
|---|
|  | 5 | /*******                                                        *********/ | 
|---|
|  | 6 | /************************************************************************/ | 
|---|
|  | 7 |  | 
|---|
|  | 8 |  | 
|---|
|  | 9 |  | 
|---|
|  | 10 |  | 
|---|
|  | 11 | /*      comprime une suite de n valeures  (dans des mots de 32 bit)     */ | 
|---|
|  | 12 | /*              valeures  codées sur 22 bit maximum                     */ | 
|---|
|  | 13 | /*      resultat de la compression codé sur 7 bit + exposant            */ | 
|---|
|  | 14 | /*      n doit etre multiple de  4                                      */ | 
|---|
|  | 15 | /*      le fichier resultat a pour longueur   n/4 + 1 mot de 32 bit     */ | 
|---|
|  | 16 | /*              4 * n  octets   ==>     n + 4 octets                    */ | 
|---|
|  | 17 | /*      pour    n = 72    en sortie     19 mots = 76 octets             */ | 
|---|
|  | 18 |  | 
|---|
| [657] | 19 | void compress_7_1(unsigned long* in,unsigned long*out,int n,int pasin); | 
|---|
| [637] | 20 | void decompress_7_1(long* in,long*out,int n); | 
|---|
|  | 21 |  | 
|---|
|  | 22 |  | 
|---|
|  | 23 | /*      comprime une suite de n valeures  (dans des mots de 32 bit)     */ | 
|---|
|  | 24 | /*              valeures  codées sur 16 bit maximum                     */ | 
|---|
|  | 25 | /*      resultat de la compression codé sur 4 bit + exposant            */ | 
|---|
|  | 26 | /*      n doit etre  ( multiple de  7 )  + 2                            */ | 
|---|
|  | 27 | /*      le fichier resultat a pour longueur   (n-2)/7 + 1 mot de 32 bit */ | 
|---|
|  | 28 | /*              4 * n  octets   ==>     4 * (n-2) / 7 + 4  octets       */ | 
|---|
|  | 29 | /*      pour    n = 72    en sortie     11 mots = 44 octets             */ | 
|---|
|  | 30 |  | 
|---|
| [657] | 31 | void compress_4_1(unsigned long* in,unsigned long*out,int n,int pasin); | 
|---|
| [637] | 32 | void decompress_4_1(long* in,long*out,int n); | 
|---|
|  | 33 |  | 
|---|
|  | 34 |  | 
|---|
|  | 35 | /*      comprime une suite de n valeures  (dans des mots de 32 bit)     */ | 
|---|
|  | 36 | /*              valeures  codées sur 16 bit maximum                     */ | 
|---|
|  | 37 | /*      resultat de la compression codé sur 3 bit + exposant            */ | 
|---|
|  | 38 | /*      n doit etre  ( multiple de  9 )                                 */ | 
|---|
|  | 39 | /*      le fichier resultat a pour longueur   n/9 + 1 mot de 32 bit     */ | 
|---|
|  | 40 | /*              4 * n  octets   ==>     4 * n / 9 + 4  octets           */ | 
|---|
|  | 41 | /*      pour    n = 72    en sortie     9 mots = 36 octets              */ | 
|---|
|  | 42 |  | 
|---|
|  | 43 |  | 
|---|
| [657] | 44 | void compress_3_1(unsigned long* in,unsigned long*out,int n,int pasin); | 
|---|
| [637] | 45 | void decompress_3_1(long* in,long*out,int n); | 
|---|
|  | 46 |  | 
|---|
|  | 47 | /************************************************************************/ | 
|---|
|  | 48 | /***********                                                    *********/ | 
|---|
|  | 49 | /***********   compresseur de données rangées par paires        *********/ | 
|---|
|  | 50 | /***********            (data bolo par exemple)                 *********/ | 
|---|
|  | 51 | /***********                                                    *********/ | 
|---|
|  | 52 | /************************************************************************/ | 
|---|
|  | 53 |  | 
|---|
|  | 54 |  | 
|---|
|  | 55 |  | 
|---|
|  | 56 | /*      comprime une suite de n valeures  (dans des mots de 32 bit)     */ | 
|---|
|  | 57 | /*              valeures  codées sur 21 bit maximum                     */ | 
|---|
|  | 58 | /*      resultat de la compression codé sur 7 bit + exposant            */ | 
|---|
|  | 59 | /*      n doit etre multiple de  4                                      */ | 
|---|
|  | 60 | /*      le fichier resultat a pour longueur   n/4 + 1 mot de 32 bit     */ | 
|---|
|  | 61 | /*              4 * n  octets   ==>     n + 4 octets                    */ | 
|---|
|  | 62 | /*      pour    n = 72    en sortie     19 mots = 76 octets             */ | 
|---|
|  | 63 |  | 
|---|
|  | 64 |  | 
|---|
| [657] | 65 | void compress_7_2(unsigned long* in,unsigned long*out,int n,int pasin); | 
|---|
| [637] | 66 | void decompress_7_2(long* in,long*out,int n); | 
|---|
|  | 67 |  | 
|---|
|  | 68 |  | 
|---|
|  | 69 |  | 
|---|
|  | 70 | /*      comprime une suite de n valeures  (dans des mots de 32 bit)     */ | 
|---|
|  | 71 | /*              valeures  codées sur 32 bit maximum                     */ | 
|---|
|  | 72 | /*      resultat de la compression codé sur 4 bit + exposant            */ | 
|---|
|  | 73 | /*      n doit etre  ( multiple de  7 )  + 2                            */ | 
|---|
|  | 74 | /*      le fichier resultat a pour longueur   (n-2)/7 + 2 mot de 32 bit */ | 
|---|
|  | 75 | /*              4 * n  octets   ==>     4 * (n-2) / 7 + 8  octets       */ | 
|---|
|  | 76 | /*      pour    n = 72    en sortie     12 mots = 48 octets             */ | 
|---|
|  | 77 |  | 
|---|
|  | 78 |  | 
|---|
|  | 79 |  | 
|---|
| [657] | 80 | void compress_4_2(unsigned long* in,unsigned long*out,int n,int pasin); | 
|---|
| [637] | 81 | void decompress_4_2(long* in,long*out,int n); | 
|---|
|  | 82 |  | 
|---|
|  | 83 |  | 
|---|
|  | 84 |  | 
|---|
|  | 85 | /************************************************************************/ | 
|---|
|  | 86 | /***********                                                    *********/ | 
|---|
|  | 87 | /***********    definitions communes pour les compresseurs      *********/ | 
|---|
|  | 88 | /***********                                                    *********/ | 
|---|
|  | 89 | /************************************************************************/ | 
|---|
|  | 90 |  | 
|---|
| [657] | 91 | /*      tous les nombres sont des entiers unsigned long pour compress                           */ | 
|---|
|  | 92 | /*Les valeures de la table d'entree sont consideres comme toujours positives et sur 21 bits     */ | 
|---|
|  | 93 | /*  les valeurs de reference pour le calcul des ecarts sont augmentees de ecart_bit=0x10000000  */ | 
|---|
|  | 94 | /*      LES ECARTS SONT DES ENTIERS POSITIFS (ecart_bit +  valeur courante - valeur precedente) */ | 
|---|
| [637] | 95 |  | 
|---|
| [657] | 96 | /*  pour tous les compresseurs  */ | 
|---|
|  | 97 | #define kmax_   15              /*  valeur maximum de l'exposant        */ | 
|---|
|  | 98 | #define ecart_bit       0x10000000 | 
|---|
|  | 99 | #define shif(ec,k,q)    {while(ec>(q|ecart_bit))if(k<kmax_){k++;q<<=1;}else ec=(q|ecart_bit);while(ec<ecart_bit-q)if(k<kmax_){k++;q<<=1;}else ec=ecart_bit-q;} | 
|---|
|  | 100 | #define arrondi(ec,k)   ((ec &  filtre[k]) +( (ec & test[k]) <<1 ) ) /* resultat sur 28 bit  */ | 
|---|
|  | 101 | #define new_val(val,ec,k)       ((val + arrondi(ec,k))&data_mask); | 
|---|
| [637] | 102 |  | 
|---|
| [657] | 103 | /* pour les decompresseurs      */ | 
|---|
|  | 104 | #define recup(ec,sss,k) {ec=((R>>sss)&ecart_mask);if(ec & sgbi_ ) ec|= sign_ ; ec<<=k;} | 
|---|
|  | 105 |  | 
|---|