source: Sophya/trunk/Poubelle/archediab.old/archediab.sources/c/compress.c@ 657

Last change on this file since 657 was 657, checked in by ansari, 26 years ago

4 bit pour bolo on-of/bolo transmis

File size: 12.0 KB
RevLine 
[657]1#include "manip.h"
[637]2#include "compress.h"
3
4
5/*******************************************************************************************/
[657]6/**************** ************/
7/**************** compress_3 ************/
8/**************** ************/
[637]9/*******************************************************************************************/
10
[657]11static int filtre[16]={0xfffffff,0xffffffe,0xffffffc,0xffffff8,
12 0xffffff0,0xfffffe0,0xfffffc0,0xfffff80,
13 0xfffff00,0xffffe00,0xffffc00,0xffff800,
14 0xffff000,0xfffe000,0xfffc000,0xfff8000};
15int test[16]= {0x00000000,0x00000001,0x00000002,0x00000004,
16 0x00000008,0x00000010,0x00000020,0x00000040,
17 0x00000080,0x00000100,0x00000200,0x00000400,
18 0x00000800,0x00001000,0x00002000,0x00004000};
[637]19
20
[657]21void com_3(unsigned long val,unsigned long* in,unsigned long*out,int n,int pasin);
[637]22
[657]23#define data_mask 0xffff /* masque pour les données en entree */
24#define ecart_(i,n,val) (( (in[(i*9+n)*pasin]&data_mask) | ecart_bit )-val);
25
26#define ecart_mask 0x7 /* masque pour l'ecart */
27
28
29
30/* compress un tableau in de n*9 points disposé avec un pas pasin */
[637]31/* les data compressées sont ecrites dans le tableau out de n points */
[657]32/* la valeur val est la valeur de reference du point origine */
[637]33
34
[657]35/* comprime 9*n points : 1er point dans 1er mot */
36/* tous les ecarts dans les n mots suivants */
37/* 9*n ==> n+1 pour 72 points : 9 mots */
[637]38
[657]39void compress_3_1(unsigned long* in,unsigned long*out,int n,int pasin)
[637]40{
[657]41unsigned long val;
[637]42val=in[0]; out[0]=val;
43com_3(val,in,out+1,n/9,pasin);
44}
45
46
47
[657]48
49void com_3(unsigned long val,unsigned long* in,unsigned long*out,int n,int pasin)
[637]50{
[657]51unsigned long val1;
52unsigned long ec1,ec2,ec3,ec4,ec5,ec6,ec7,ec8,ec9;
53int i,k,k1;unsigned long q;
[637]54
55
56for(i=0;i<n;i++)
57 {
58 k=0;q=3; /* 3 bit = 7 = +-3 */
59
[657]60 ec1=ecart_(i,0,val);
[637]61 shif(ec1,k,q);
[657]62 val1=new_val(val,ec1,k);
[637]63
64 k1=k;
[657]65 ec2=ecart_(i,1,val1);
[637]66 shif(ec2,k,q);
67
[657]68 if(k>k1) {k1=k;val1=new_val(val,ec1,k);}
69 val1=new_val(val1,ec2,k);
[637]70
[657]71 ec3=ecart_(i,2,val1);
[637]72 shif(ec3,k,q);
73
[657]74 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k))&data_mask;}
75 val1=new_val(val1,ec3,k);
[637]76
[657]77 ec4=ecart_(i,3,val1);
[637]78 shif(ec4,k,q);
79
[657]80 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k))&data_mask;}
81 val1=new_val(val1,ec4,k);
[637]82
[657]83 ec5=ecart_(i,4,val1);
[637]84 shif(ec5,k,q);
85
[657]86 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k)
87 + arrondi(ec4,k))&data_mask;}
88 val1=new_val(val1,ec5,k);
[637]89
[657]90 ec6=ecart_(i,5,val1);
[637]91 shif(ec6,k,q);
92
[657]93 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k)
94 + arrondi(ec4,k) + arrondi(ec5,k))&data_mask;}
95 val1=new_val(val1,ec6,k);
[637]96
[657]97 ec7=ecart_(i,6,val1);
[637]98 shif(ec7,k,q);
99
[657]100 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k)
101 + arrondi(ec3,k) + arrondi(ec4,k) + arrondi(ec5,k) + arrondi(ec6,k))&data_mask;}
102 val1=new_val(val1,ec7,k);
[637]103
[657]104 ec8=ecart_(i,7,val1);
[637]105 shif(ec8,k,q);
106
[657]107 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k)
108 + arrondi(ec4,k) + arrondi(ec5,k) + arrondi(ec6,k) + arrondi(ec7,k))&data_mask;}
109 val1=new_val(val1,ec8,k);
[637]110
[657]111 ec9=ecart_(i,8,val1);
[637]112 shif(ec9,k,q);
113
114/*printf("i=%d k=%d ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]); */
115
116 ec1 = arrondi(ec1,k) >> k;
117 ec2 = arrondi(ec2,k) >> k;
118 ec3 = arrondi(ec3,k) >> k;
119 ec4 = arrondi(ec4,k) >> k;
120 ec5 = arrondi(ec5,k) >> k;
121 ec6 = arrondi(ec6,k) >> k;
122 ec7 = arrondi(ec7,k) >> k;
123 ec8 = arrondi(ec8,k) >> k;
124 ec9 = arrondi(ec9,k) >> k;
125
[657]126 out[i]= ((ec1&ecart_mask)<<29) | ((ec2&ecart_mask)<<26) | ((ec3&ecart_mask)<<23)
127 | ((ec4&ecart_mask)<<20) | ((ec5&ecart_mask)<<17) | ((ec6&ecart_mask)<<14)
128 | ((ec7&ecart_mask)<<11) | ((ec8&ecart_mask)<<8) | ((ec9&ecart_mask)<<5) | k ;
[637]129
130
131/* if(i<30) printf("i=%d k=%d ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]);*/
132
[657]133 val=(val + ( (ec1 + ec2 + ec3 + ec4 + ec5 + ec6 + ec7 + ec8 + ec9 ) << k )) & data_mask;
[637]134 }
135}
136
137
138
139/*******************************************************************************************/
140/**************** *****************/
141/**************** compress_4 *****************/
142/**************** *****************/
143/*******************************************************************************************/
144
[657]145void com_4(unsigned long val,unsigned long* in,unsigned long*out,int n,int pasin);
146void com_4_paire(unsigned long val1,unsigned long val2,unsigned long* in,unsigned long*out,int n,int pasin);
[637]147
148
[657]149#undef ecart_mask
150#define ecart_mask 0xf /* masque pour l'ecart */
[637]151
[657]152#undef data_mask
153#define data_mask 0xffff /* masque pour les données en entree */
154#undef ecart_
155#define ecart_(i,n,val) (( (in[(i*7+n)*pasin]&data_mask) | ecart_bit )-val);
[637]156
157
158/* compress un tableau in de n*7 points disposé avec un pas pasin */
159/* les data compressées sont ecrites dans le tableau out de n points*/
160/* la valeur val est la valeur de reference du point origine*/
161
162
163/* comprime 7*n + 2 points (de 16 bit chacun) */
164/* 1er et 2 eme point dans 1er mot, les ecarts dans les n mots suivants*/
165/* 7*n + 2 ==> n+1 ==> pour 72 points : 11 mots */
166
[657]167void compress_4_1(unsigned long* in,unsigned long*out,int n,int pasin)
[637]168{
[657]169unsigned long val1,val2;
[637]170val1=in[0];val2=in[1];
171*out=( (val1<<16) & 0xffff0000 ) | ( ( val2 ) & 0xffff ) ;
172
173com_4(val2,in+2,out+1,n/7,pasin);
174}
175
176
177
[657]178void com_4(unsigned long val,unsigned long* in,unsigned long*out,int n,int pasin)
[637]179{
[657]180unsigned long val1;
181unsigned long ec1,ec2,ec3,ec4,ec5,ec6,ec7;
182int i,k,k1;unsigned long q;
[637]183
184
185for(i=0;i<n;i++)
186 {
187 k=0;q=7; /* 4 bit = 15 = +-7 */
188
[657]189 ec1=ecart_(i,0,val);
[637]190 shif(ec1,k,q);
[657]191 val1=new_val(val,ec1,k);
[637]192
193 k1=k;
[657]194 ec2=ecart_(i,1,val1);
[637]195 shif(ec2,k,q);
196
[657]197 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k))&data_mask;}
198 val1=new_val(val1,ec2,k);
[637]199
[657]200 ec3=ecart_(i,2,val1);
[637]201 shif(ec3,k,q);
202
[657]203 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k))&data_mask;}
204 val1=new_val(val1,ec3,k);
[637]205
[657]206 ec4=ecart_(i,3,val1);
[637]207 shif(ec4,k,q);
208
[657]209 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k))&data_mask;}
210 val1=new_val(val1,ec4,k);
[637]211
[657]212 ec5=ecart_(i,4,val1);
[637]213 shif(ec5,k,q);
214
[657]215 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k) + arrondi(ec4,k))&data_mask;}
216 val1=new_val(val1,ec5,k);
[637]217
[657]218 ec6=ecart_(i,5,val1);
[637]219 shif(ec6,k,q);
220
[657]221 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k) + arrondi(ec3,k)
222 + arrondi(ec4,k) + arrondi(ec5,k))&data_mask;}
223 val1=new_val(val1,ec6,k);
[637]224
[657]225 ec7=ecart_(i,6,val1);
[637]226 shif(ec7,k,q);
227
228/*printf("i=%d k=%d ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]);*/
229
230 ec1 = arrondi(ec1,k) >> k;
231 ec2 = arrondi(ec2,k) >> k;
232 ec3 = arrondi(ec3,k) >> k;
233 ec4 = arrondi(ec4,k) >> k;
234 ec5 = arrondi(ec5,k) >> k;
235 ec6 = arrondi(ec6,k) >> k;
236 ec7 = arrondi(ec7,k) >> k;
237
[657]238 out[i]= ((ec1&ecart_mask)<<28) | ((ec2&ecart_mask)<<24) | ((ec3&ecart_mask)<<20)
239 | ((ec4&ecart_mask)<<16) | ((ec5&ecart_mask)<<12) | ((ec6&ecart_mask)<<8) | ((ec7&ecart_mask)<<4) | k ;
[637]240
241
242/* if(i<30) printf("i=%d k=%d ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]);*/
243
[657]244 val=(val+ ( (ec1 + ec2 + ec3 + ec4 + ec5 + ec6 + ec7 ) << k ))&data_mask;
[637]245 }
246}
247
248/********************************************************************************************/
249
250/* compresse en 4 bit mais par paire (pour data provenant de la detection synchrone) */
251
252/* 21 bit maleur maximum */
253/* comprime 7*n+2 points : 1er et 2eme point dans 1er et 2eme mot, suite dans n mots */
254/* différences entre valeures paires et entre valeures impaires uniquement */
255/* 7*n+2 ==> n+2 ==> pour 72 points : 12 mots */
256
[657]257#undef data_mask
258#define data_mask 0x1fffff /* masque pour les données en entree 21 bit */
259#undef ecart_
260#define ecart_(i,n,val) (( (in[(i*7+n)*pasin]&data_mask) | ecart_bit )-val);
261
262void compress_4_2(unsigned long* in,unsigned long*out,int n,int pasin)
[637]263{
[657]264unsigned long val1,val2;
265val1=in[0]&data_mask; val2=in[1]&data_mask;
[637]266out[0]=val1; out[1]=val2;
267com_4_paire(val1,val2,in+2,out+2,n/7,pasin);
268}
269
270
[657]271void com_4_paire(unsigned long val1,unsigned long val2,unsigned long* in,unsigned long*out,int n,int pasin)
[637]272{
[657]273unsigned long val1p,val2p;
274unsigned long ec1,ec2,ec3,ec4,ec5,ec6,ec7;
275int i,k,k1;unsigned long q;
[637]276
277
278for(i=0;i<n;i++)
279 {
280 k=0;q=7; /* 4 bit = 15 = +-7 */
281
[657]282 ec1=ecart_(i,0,val1);
[637]283 shif(ec1,k,q);
284
[657]285 ec2=ecart_(i,1,val2);
[637]286 shif(ec2,k,q);
287
288 k1=k;
[657]289 val1p=new_val(val1,ec1,k);
[637]290
291
[657]292 ec3=ecart_(i,2,val1p);
[637]293 shif(ec3,k,q);
294
[657]295 val2p=new_val(val2,ec2,k);
[637]296
[657]297 ec4=ecart_(i,3,val2p);
[637]298 shif(ec4,k,q);
299
[657]300 if(k>k1) {k1=k;val1p=new_val(val1,ec1,k);val2p=new_val(val2,ec2,k);}
[637]301
[657]302 val1p=new_val(val1p,ec3,k);
[637]303
[657]304 ec5=ecart_(i,4,val1p);
[637]305 shif(ec5,k,q);
306
307 if(k>k1) { k1=k;
[657]308 val1p=(val1 + arrondi(ec1,k) + arrondi(ec3,k))&data_mask;
309 val2p=(val2 + arrondi(ec2,k))&data_mask;
[637]310 }
[657]311 val2p=new_val(val2p,ec4,k);
[637]312
[657]313 ec6=ecart_(i,5,val2p);
[637]314 shif(ec6,k,q);
315
316 if(k>k1) { k1=k;
[657]317 val1p=(val1 + arrondi(ec1,k) + arrondi(ec3,k))&data_mask;
318 val2p=(val2 + arrondi(ec2,k) + arrondi(ec4,k))&data_mask;
[637]319 }
[657]320 val1p=new_val(val1p,ec5,k);
[637]321
[657]322 ec7=ecart_(i,6,val1p);
[637]323 shif(ec7,k,q);
324
325/*printf("i=%d k=%d ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]);*/
326
327 ec1 = arrondi(ec1,k) >> k;
328 ec2 = arrondi(ec2,k) >> k;
329 ec3 = arrondi(ec3,k) >> k;
330 ec4 = arrondi(ec4,k) >> k;
331 ec5 = arrondi(ec5,k) >> k;
332 ec6 = arrondi(ec6,k) >> k;
333 ec7 = arrondi(ec7,k) >> k;
334
[657]335 out[i]= ((ec1&ecart_mask)<<28) | ((ec2&ecart_mask)<<24) | ((ec3&ecart_mask)<<20)
336 | ((ec4&ecart_mask)<<16) | ((ec5&ecart_mask)<<12) | ((ec6&ecart_mask)<<8) | ((ec7&ecart_mask)<<4) | k ;
[637]337
338
339/* if(i<30) printf("i=%d k=%d ec= %d %d %d \n",i,k,ec1,ec2,ec3,out[(i+8)/7]);*/
340
[657]341 val1p = (val1 + ( (ec1 + ec3 + ec5 + ec7 ) << k ))&data_mask;
342 val1= (val2 + ( (ec2 + ec4 + ec6 ) << k ))&data_mask;
[637]343 val2 = val1p;
344 }
345}
346
347
348
349
350
351/*******************************************************************************************/
352/**************** *****************/
353/**************** compress_7 *****************/
354/**************** *****************/
355/*******************************************************************************************/
356
357/*******************************************************************************************/
358
359/* compresse en 7 bit mais par paire (pour data provenant de la detection synchrone */
360
361/* ne prend que les 21 bit de poid faible dans le mot en entree */
362/* comprime 4*n points : 1er et 2eme point dans 1er mot (16 bit chacun), suite dans n mots */
363/* différences entre valeures paires et entre valeures impaires uniquement */
364/* 4*n ==> n+1 */
365
366
367
[657]368void compress_7_paire(unsigned long val1,unsigned long val2,unsigned long* in,unsigned long*out,int n,int pasin);
369
370#undef data_mask
371#define data_mask 0x1fffff /* masque pour les données en entree 21 bit */
372#undef ecart_mask
373#define ecart_mask 0x7f /* masque pour l'ecart 7 bits */
374
375#undef ecart_
376#define ecart_(i,n,val) (( (in[(i*4+n)*pasin]&data_mask) | ecart_bit )-val);
377
378
379void compress_7_2(unsigned long* in,unsigned long*out,int n,int pasin)
[637]380{
[657]381unsigned long val1,val2;
382val1=in[0]&0x1fffe0;val2=in[pasin]&0x1fffe0;
[637]383*out=( (val1<<11) & 0xffff0000 ) | ( (val2 >> 5) & 0xffff ) ;
384
[657]385/*printf("in[0]=%x val1=%x in[1]=%x val2=%x \n",in[0],val1,in[1],val2);
[637]386printf("in[2]=%x in[3]=%x \n",in[2],in[3]);*/
387compress_7_paire(val1,val2,in,out+1,n/4,pasin);
388}
389
390
[657]391void compress_7_paire(unsigned long val1,unsigned long val2,unsigned long* in,unsigned long*out,int n,int pasin)
[637]392{
393
[657]394unsigned long val1p,val2p;
395unsigned long ec1,ec2,ec3,ec4;
396int i,k;unsigned long q;
[637]397
398
399for(i=0;i<n;i++)
400 {
401 k=0;q=63; /* 7 bit -> 127 -> +-63 */
402
[657]403 ec1=ecart_(i,0,val1); shif(ec1,k,q);
[637]404
[657]405 ec2=ecart_(i,1,val2); shif(ec2,k,q);
406 val1p =new_val(val1,ec1,k);
[637]407
[657]408 ec3=ecart_(i,2,val1p); shif(ec3,k,q);
409 val2p=new_val(val2,ec2,k);
[637]410
[657]411 ec4=ecart_(i,3,val2p); shif(ec4,k,q);
[637]412
413 ec1 = arrondi(ec1,k) >> k;
414 ec2 = arrondi(ec2,k) >> k;
415 ec3 = arrondi(ec3,k) >> k;
416 ec4 = arrondi(ec4,k) >> k;
417
[657]418 out[i]= ((ec1&ecart_mask)<<25) | ((ec2&ecart_mask)<<18) | ((ec3&ecart_mask)<<11) | ((ec4&ecart_mask)<<4) | k ;
[637]419
[657]420 /*if(i<5) printf("i=%d k=%d ec= %x %x %x %x out=%x \n",i,k,ec1,ec2,ec3,ec4,out[i]); */
[637]421
[657]422 val1=(val1+ ( (ec1 + ec3 ) << k ))&data_mask;
423 val2=(val2+ ( (ec2 + ec4 ) << k ))&data_mask;
[637]424 }
425}
426
427
428
429
Note: See TracBrowser for help on using the repository browser.