| 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 |  | 
|---|
| 19 | void compress_7_1(unsigned int4* in,unsigned int4*out,int n,int pasin); | 
|---|
| 20 | void decompress_7_1(int4* in,int4*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 |  | 
|---|
| 31 | void compress_4_1(unsigned int4* in,unsigned int4*out,int n,int pasin); | 
|---|
| 32 | void decompress_4_1(int4* in,int4*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 |  | 
|---|
| 44 | void compress_3_1(unsigned int4* in,unsigned int4*out,int n,int pasin); | 
|---|
| 45 | void decompress_3_1(int4* in,int4*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 |  | 
|---|
| 65 | void compress_7_2(unsigned int4* in,unsigned int4*out,int n,int pasin); | 
|---|
| 66 | void decompress_7_2(int4* in,int4*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 |  | 
|---|
| 80 | void compress_4_2(unsigned int4* in,unsigned int4*out,int n,int pasin); | 
|---|
| 81 | void decompress_4_2(int4* in,int4*out,int n); | 
|---|
| 82 |  | 
|---|
| 83 |  | 
|---|
| 84 |  | 
|---|
| 85 | /************************************************************************/ | 
|---|
| 86 | /***********                                                    *********/ | 
|---|
| 87 | /***********    definitions communes pour les compresseurs      *********/ | 
|---|
| 88 | /***********                                                    *********/ | 
|---|
| 89 | /************************************************************************/ | 
|---|
| 90 |  | 
|---|
| 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) */ | 
|---|
| 95 |  | 
|---|
| 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); | 
|---|
| 102 |  | 
|---|
| 103 | /* pour les decompresseurs      */ | 
|---|
| 104 | #define recup(ec,sss,k) {ec=((R>>sss)&ecart_mask);if(ec & sgbi_ ) ec|= sign_ ; ec<<=k;} | 
|---|
| 105 |  | 
|---|