source: Sophya/trunk/Poubelle/archTOI.old/compress.c@ 623

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

archtoi 2 aout 99

File size: 12.0 KB
Line 
1#include "manip.h"
2#include "compress.h"
3
4
5/*******************************************************************************************/
6/**************** ************/
7/**************** compress_3 ************/
8/**************** ************/
9/*******************************************************************************************/
10
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};
19
20
21void com_3(unsigned long val,unsigned long* in,unsigned long*out,int n,int pasin);
22
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 */
31/* les data compressées sont ecrites dans le tableau out de n points */
32/* la valeur val est la valeur de reference du point origine */
33
34
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 */
38
39void compress_3_1(unsigned long* in,unsigned long*out,int n,int pasin)
40{
41unsigned long val;
42val=in[0]; out[0]=val;
43com_3(val,in,out+1,n/9,pasin);
44}
45
46
47
48
49void com_3(unsigned long val,unsigned long* in,unsigned long*out,int n,int pasin)
50{
51unsigned long val1;
52unsigned long ec1,ec2,ec3,ec4,ec5,ec6,ec7,ec8,ec9;
53int i,k,k1;unsigned long q;
54
55
56for(i=0;i<n;i++)
57 {
58 k=0;q=3; /* 3 bit = 7 = +-3 */
59
60 ec1=ecart_(i,0,val);
61 shif(ec1,k,q);
62 val1=new_val(val,ec1,k);
63
64 k1=k;
65 ec2=ecart_(i,1,val1);
66 shif(ec2,k,q);
67
68 if(k>k1) {k1=k;val1=new_val(val,ec1,k);}
69 val1=new_val(val1,ec2,k);
70
71 ec3=ecart_(i,2,val1);
72 shif(ec3,k,q);
73
74 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k))&data_mask;}
75 val1=new_val(val1,ec3,k);
76
77 ec4=ecart_(i,3,val1);
78 shif(ec4,k,q);
79
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);
82
83 ec5=ecart_(i,4,val1);
84 shif(ec5,k,q);
85
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);
89
90 ec6=ecart_(i,5,val1);
91 shif(ec6,k,q);
92
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);
96
97 ec7=ecart_(i,6,val1);
98 shif(ec7,k,q);
99
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);
103
104 ec8=ecart_(i,7,val1);
105 shif(ec8,k,q);
106
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);
110
111 ec9=ecart_(i,8,val1);
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
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 ;
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
133 val=(val + ( (ec1 + ec2 + ec3 + ec4 + ec5 + ec6 + ec7 + ec8 + ec9 ) << k )) & data_mask;
134 }
135}
136
137
138
139/*******************************************************************************************/
140/**************** *****************/
141/**************** compress_4 *****************/
142/**************** *****************/
143/*******************************************************************************************/
144
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);
147
148
149#undef ecart_mask
150#define ecart_mask 0xf /* masque pour l'ecart */
151
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);
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
167void compress_4_1(unsigned long* in,unsigned long*out,int n,int pasin)
168{
169unsigned long val1,val2;
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
178void com_4(unsigned long val,unsigned long* in,unsigned long*out,int n,int pasin)
179{
180unsigned long val1;
181unsigned long ec1,ec2,ec3,ec4,ec5,ec6,ec7;
182int i,k,k1;unsigned long q;
183
184
185for(i=0;i<n;i++)
186 {
187 k=0;q=7; /* 4 bit = 15 = +-7 */
188
189 ec1=ecart_(i,0,val);
190 shif(ec1,k,q);
191 val1=new_val(val,ec1,k);
192
193 k1=k;
194 ec2=ecart_(i,1,val1);
195 shif(ec2,k,q);
196
197 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k))&data_mask;}
198 val1=new_val(val1,ec2,k);
199
200 ec3=ecart_(i,2,val1);
201 shif(ec3,k,q);
202
203 if(k>k1) {k1=k;val1=(val + arrondi(ec1,k) + arrondi(ec2,k))&data_mask;}
204 val1=new_val(val1,ec3,k);
205
206 ec4=ecart_(i,3,val1);
207 shif(ec4,k,q);
208
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);
211
212 ec5=ecart_(i,4,val1);
213 shif(ec5,k,q);
214
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);
217
218 ec6=ecart_(i,5,val1);
219 shif(ec6,k,q);
220
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);
224
225 ec7=ecart_(i,6,val1);
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
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 ;
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
244 val=(val+ ( (ec1 + ec2 + ec3 + ec4 + ec5 + ec6 + ec7 ) << k ))&data_mask;
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
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)
263{
264unsigned long val1,val2;
265val1=in[0]&data_mask; val2=in[1]&data_mask;
266out[0]=val1; out[1]=val2;
267com_4_paire(val1,val2,in+2,out+2,n/7,pasin);
268}
269
270
271void com_4_paire(unsigned long val1,unsigned long val2,unsigned long* in,unsigned long*out,int n,int pasin)
272{
273unsigned long val1p,val2p;
274unsigned long ec1,ec2,ec3,ec4,ec5,ec6,ec7;
275int i,k,k1;unsigned long q;
276
277
278for(i=0;i<n;i++)
279 {
280 k=0;q=7; /* 4 bit = 15 = +-7 */
281
282 ec1=ecart_(i,0,val1);
283 shif(ec1,k,q);
284
285 ec2=ecart_(i,1,val2);
286 shif(ec2,k,q);
287
288 k1=k;
289 val1p=new_val(val1,ec1,k);
290
291
292 ec3=ecart_(i,2,val1p);
293 shif(ec3,k,q);
294
295 val2p=new_val(val2,ec2,k);
296
297 ec4=ecart_(i,3,val2p);
298 shif(ec4,k,q);
299
300 if(k>k1) {k1=k;val1p=new_val(val1,ec1,k);val2p=new_val(val2,ec2,k);}
301
302 val1p=new_val(val1p,ec3,k);
303
304 ec5=ecart_(i,4,val1p);
305 shif(ec5,k,q);
306
307 if(k>k1) { k1=k;
308 val1p=(val1 + arrondi(ec1,k) + arrondi(ec3,k))&data_mask;
309 val2p=(val2 + arrondi(ec2,k))&data_mask;
310 }
311 val2p=new_val(val2p,ec4,k);
312
313 ec6=ecart_(i,5,val2p);
314 shif(ec6,k,q);
315
316 if(k>k1) { k1=k;
317 val1p=(val1 + arrondi(ec1,k) + arrondi(ec3,k))&data_mask;
318 val2p=(val2 + arrondi(ec2,k) + arrondi(ec4,k))&data_mask;
319 }
320 val1p=new_val(val1p,ec5,k);
321
322 ec7=ecart_(i,6,val1p);
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
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 ;
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
341 val1p = (val1 + ( (ec1 + ec3 + ec5 + ec7 ) << k ))&data_mask;
342 val1= (val2 + ( (ec2 + ec4 + ec6 ) << k ))&data_mask;
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
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)
380{
381unsigned long val1,val2;
382val1=in[0]&0x1fffe0;val2=in[pasin]&0x1fffe0;
383*out=( (val1<<11) & 0xffff0000 ) | ( (val2 >> 5) & 0xffff ) ;
384
385/*printf("in[0]=%x val1=%x in[1]=%x val2=%x \n",in[0],val1,in[1],val2);
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
391void compress_7_paire(unsigned long val1,unsigned long val2,unsigned long* in,unsigned long*out,int n,int pasin)
392{
393
394unsigned long val1p,val2p;
395unsigned long ec1,ec2,ec3,ec4;
396int i,k;unsigned long q;
397
398
399for(i=0;i<n;i++)
400 {
401 k=0;q=63; /* 7 bit -> 127 -> +-63 */
402
403 ec1=ecart_(i,0,val1); shif(ec1,k,q);
404
405 ec2=ecart_(i,1,val2); shif(ec2,k,q);
406 val1p =new_val(val1,ec1,k);
407
408 ec3=ecart_(i,2,val1p); shif(ec3,k,q);
409 val2p=new_val(val2,ec2,k);
410
411 ec4=ecart_(i,3,val2p); shif(ec4,k,q);
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
418 out[i]= ((ec1&ecart_mask)<<25) | ((ec2&ecart_mask)<<18) | ((ec3&ecart_mask)<<11) | ((ec4&ecart_mask)<<4) | k ;
419
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]); */
421
422 val1=(val1+ ( (ec1 + ec3 ) << k ))&data_mask;
423 val2=(val2+ ( (ec2 + ec4 ) << k ))&data_mask;
424 }
425}
426
427
428
429
Note: See TracBrowser for help on using the repository browser.