Logo Coherent WaveBurst  
Reference Guide
Logo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
lossy.cc
Go to the documentation of this file.
1 /*-------------------------------------------------------
2  * Package: Wavelet Analysis Tool
3  * File name: lossy.cc
4  * Author: S.Klimenko University of Florida
5  *-------------------------------------------------------
6 */
7 
8 // Changes in version 2.0:
9 // new set of wavelet classes
10 // Base version number is 2.0. Uses WAT v.2.0
11 
12 #include <stdio.h>
13 #include "waverdc.hh"
14 #include "Biorthogonal.hh"
15 #include "wseries.hh"
16 #include "lossy.hh"
17 
18 int Compress(wavearray<double> &in, int* &out, int Lwt, int Lbt,
19  const double g1, const double g2, int np1, int np2)
20 {
21 // in - input data
22 // Lw - decomposition depth for wavelet Tree
23 // Lb - decomposition depth for wavelet binary Tree
24 // g1, g2 - are value of losses in percents
25 // np1, np2 - are orders of wavelets
26 
27  int i;
28  WaveRDC z;
29  bool sign = (g1<0 || g2<0) ? true : false;
30  bool skip = (g1>=100 && g2>=100) ? true : false;
31 
32  if (np1<=0) np1=8;
33  if (np2<=0) np2=8;
34 
35  wavearray<double> *p = &in; // temporary pointer
36  wavearray<double> wl; // temporary storage
37  wavearray<short> ws; // temporary short array
38 
39  Biorthogonal<double> B1(np1,0,B_POLYNOM); // Lifting wavelet
40  Biorthogonal<double> B2(np2,1,B_POLYNOM); // Lifting wavelet
41 // Biorthogonal<double> B1(np1,0,B_PAD_EDGE); // Lifting wavelet
42 // Biorthogonal<double> B2(np2,1,B_PAD_EDGE); // Lifting wavelet
43  WSeries<double> W1; // wavelet data container
44  WSeries<double> W2; // wavelet data container
45 
46  double mean, rms, a;
47 
48  if(!sign && !skip){
49  a=in.getStatistics(mean,rms);
50  z.rmsLimit=fabs(a)<0.5 ? fabs(2*rms*a) : rms;
51  }
52 
53 // wavelet tree
54 
55  if(Lwt>0 && !skip){
56  W1.Forward(in,B1,Lwt);
57 
58  if(sign){
59  W1.getLayer(wl,0);
60  p = (wavearray<double>*)&W1;
61  }
62 
63  else
64  for(i=Lwt; i>=0; i--) {
65  W1.getLayer(wl,i);
66  if(Lbt>0 && i==0) break;
67  z.Compress(wl,g1);
68  }
69  }
70 
71 // binary tree
72 
73  if(Lbt>0 && !skip) {
74  p = (Lwt>0) ? &wl : &in;
75  W2.Forward(*p,B2,Lbt);
76  p = (wavearray<double>*)&W2;
77 
78  if(sign){
79  if(Lwt>0){
80  W1.putLayer(*p,0);
81  p = (wavearray<double>*)&W1;
82  }
83  }
84 
85  else
86  for(i=(1<<Lbt)-1; i>=0; i--) {
87  W2.getLayer(wl,i);
88  z.Compress(wl,g2);
89  }
90  }
91 
92 // no wavelets or sign transform
93 
94  if (skip || sign || ((Lwt==0) && (Lbt==0))) {
95 
96  if(!sign && !skip)
97  z.Compress(in, (g1>g2) ? g1 : g2);
98 
99  else if(sign){
100  z.getSign(*p,ws);
101  z.Compress(ws);
102  }
103 
104  else{
105  ws.resize(p->size());
106  ws = 0;
107  z.Compress(ws);
108  }
109  }
110 
111 // z.Dir(1);
112 
113 /****************************************************************
114  * COMPRESSED DATA OUTPUT FORMAT *
115  ****************************************************************
116  * out = { "WZVv", NN, NU, np1, np2, Lwt, Lbt, *
117  * sl1[Lwt], sl2[2^Lbt], z.dataz[NZ] }, *
118  * NZ = NN-(4+NL) - packed data length in 32-bit words *
119  * NL = Lwt+2^Lbt - total number of compressed data layers *
120  * -------------------------------------------------------------*
121  * shift|length: meaning (shift and lenght in bytes) *
122  * -------------------------------------------------------------*
123  * 0|4 : WZVv - ID string with version number (ver 1.5 -> WZ15) *
124  * 4|4 : NN - length of output data in 32-bit words *
125  * 8|4 : NU - length of unpacked data in 16-bit words *
126  * 12|4: np1, np2, Lwt, Lbt - byte-length numbers *
127  * 16|4: skew=data[end]-data[start] - floating point number *
128  * 20|4*NL : sl1 and sl2 - arrays of floating point numbers *
129  * 20+4*NL|4*NZ : dataz[NZ] - array of compressed data *
130  ****************************************************************
131 */
132  size_t nsw = 4; // length of service block
133  int N = nsw+z.size();
134 
135  if (!out) {
136  out = (int *) malloc(N*sizeof(int));
137  if (!out) cout << "Memory allocation error\n";
138  }
139 
140  i = 0;
141 
142 // write id "WZ16" in byte-order dependent manner
143  out[0] = ('W'<<24) + ('Z'<<16) + ('2'<<8) + ('0');
144  out[1] = N; // output data length in 32-bit words
145  out[2] = z.nSample; // uncompressed data length in 16-bit words
146  out[3] = (Lwt & 0xFF) << 24;
147  out[3] |= (Lbt & 0xFF) << 16;
148  out[3] |= (np1 & 0xFF) << 8;
149  out[3] |= (np2 & 0xFF) << 1;
150  out[3] |= (sign) ? 1 : 0;
151 
152  for (i=nsw; i<N ; i++) {
153  out[i] = z.data[i-nsw];
154  }
155  return N;
156 }
157 
159 {
160 /****************************************************************
161  * COMPRESSED DATA INPUT FORMAT *
162  ****************************************************************
163  * in = { "WZVv", NN, NU, np1, np2, Lwt, Lbt, *
164  * sl1[Lwt], sl2[2^Lbt], z.dataz[NZ] }, *
165  * NZ = NN-(4+NL) - packed data length in 32-bit words *
166  * NL = Lwt+2^Lbt - total number of compressed data layers *
167  * -------------------------------------------------------------*
168  * shift|length: meaning (shift and lenght in bytes) *
169  * -------------------------------------------------------------*
170  * 0|4 : WZVv - ID string with version number (ver 1.5 -> WZ15) *
171  * 4|4 : NN - length of output data in 32-bit words *
172  * 8|4 : NU - length of unpacked data in 16-bit words *
173  * 12|4: Lwt, Lbt, np1, np2 - byte-length numbers *
174  * 16|4: skew=data[end]-data[start] - floating point number *
175  * 20|4*NL : sl1 and sl2 - arrays of loating point numbers *
176  * 20+4*NL|4*NZ : dataz[NZ] - array of compressed data *
177  ****************************************************************
178 */
179  int *p = in+4;
180  int n;
181  short *id, *iv; // pointers to 2-byte id and version #
182  short aid, aiv; // actual id and ver.# taken from input
183  short swp=0x1234;
184  char *pswp=(char *) &swp;
185 // size_t nsw = 4; // length of the service block
186 
187 // it is assumed, that frame-reading software already changed byte order if
188 // compress and uncompress is performed on machines with different endness
189  if (pswp[0]==0x34) { // little-endian machine
190  id = (short *)"ZW";
191  iv = (short *)"02";
192  }
193  else { // big-endian machine
194  id = (short *)"WZ";
195  iv = (short *)"20";
196  }
197  aid = short(in[0] >> 16);
198  aiv = short(in[0] & 0xFFFF);
199 
200 // printf(" in[0]=%4s id=%2s, iv=%2s\n", (char*)in, (char*)id, (char*)iv);
201 
202  if (aid != *id) {
203  cout << " unCompress: error, unknown input data format.\n";
204  return -1;
205  }
206  if (aiv!= *iv) {
207  cout << " unCompress: error, unsupported version of input data format.\n";
208  return -1;
209  }
210 
211  int i = 0;
212  int n32 = in[1]; // length of input data in 32-bit words
213  if (n32<4) return -1;
214 
215  int n16 = in[2]; // length of uncompressed data in 16-bit words
216  int Lwt = (in[3]>>24) & 0xFF; // number of Wavelet Tree decomposition levels
217  int Lbt = (in[3]>>16) & 0xFF; // number of Binary Tree decomposition levels
218  int np1 = (in[3]>>8) & 0xFF;
219  int np2 = (in[3]>>1) & 0x7F;
220  bool sign = in[3] & 1; // check sign bit
221 
222  n32 -= 4; // length of compressed data in 32-bit words
223  if (n32<=0) return -1;
224 
225 
226  int nl1=0, nl2=0;
227  if (Lwt >= 0) nl1 = Lbt>0 ? Lwt : Lwt+1;
228  if (Lbt > 0) nl2 = 1<<Lbt;
229 
230  WaveRDC z;
231  z.resize(n32);
232  z.nLayer = (1<<Lbt) + Lwt;
233 
234  for (int j=0; j<n32 ; j++) {
235  z.data[j] = *(p++);
236  }
237 
238  if (sign || (Lwt==0 && Lbt==0)) {
239  return z.unCompress(out);
240  }
241 
242  wavearray<double>* pwl; // temporary pointer
243  wavearray<double> wl; // temporary storage
244 
245  Biorthogonal<double> B1(np1,0,B_POLYNOM); // Lifting wavelet
246  Biorthogonal<double> B2(np2,1,B_POLYNOM); // Lifting wavelet
247 // Biorthogonal<double> B1(np1,0,B_PAD_EDGE); // Lifting wavelet
248 // Biorthogonal<double> B2(np2,1,B_PAD_EDGE); // Lifting wavelet
249  WSeries<double> W1(B1); // wavelet data container
250  WSeries<double> W2(B2); // wavelet data container
251 
252  int nL; // number of layers
253 
254  if(Lbt>0){ // binary tree processing
255  nL = 1<<Lbt;
256  W2.resize(n16/(1<<Lwt));
257  W2.pWavelet->setLevel(Lbt);
258 
259  for(i=nL; i>0; i--) {
260  n=z.unCompress(wl,Lwt+i); // the last layer is layer 0
261  W2.putLayer(wl,nL-i);
262  }
263  W2.Inverse();
264  }
265 
266  pwl = &wl;
267  if(Lwt>0){ // wavelet tree processing
268  W1.resize(n16);
269  W1.pWavelet->setLevel(Lwt);
270 
271  for(i=Lwt; i>=0; i--) {
272  if(Lbt==0 || i>0) n=z.unCompress(*pwl,Lwt-i+1);
273  else pwl = (wavearray<double>*)&W2;
274  W1.putLayer(*pwl,i);
275  }
276  W1.Inverse();
277  }
278 
279  if(out.size() != (size_t)n16) out.resize(n16);
280 
281  if (Lwt==0)
282  for (i=0; i<n16; i++) out.data[i] = (float)W2.data[i];
283  else
284  for (i=0; i<n16; i++) out.data[i] = (float)W1.data[i];
285 
286  return n16;
287 }
288 
289 int Compress(float in[], int nn, int* &out, int Lwt, int Lbt,
290  double g1, double g2, int np1, int np2)
291 {
292  wavearray<double> wa(nn);
293  for (int i=0; i<nn; i++) wa.data[i]=in[i];
294  return Compress(wa, out, Lwt, Lbt, g1, g2, np1, np2);
295 }
296 
297 int Compress(int in[], int nn, int* &out, int Lwt, int Lbt,
298  double g1, double g2, int np1, int np2)
299 {
300  wavearray<double> wa(nn);
301  for (int i=0; i<nn; i++) wa.data[i]=in[i];
302  return Compress(wa, out, Lwt, Lbt, g1, g2, np1, np2);
303 }
304 
305 int Compress(short in[], int nn, int* &out, int Lwt, int Lbt,
306  double g1, double g2, int np1, int np2)
307 {
308  wavearray<double> wa(nn);
309  for (int i=0; i<nn; i++) wa.data[i]=in[i];
310  return Compress(wa, out, Lwt, Lbt, g1, g2, np1, np2);
311 }
312 
313 int unCompress(int* in, short* &out)
314 {
315  wavearray<float> wa;
316  int nn, n16;
317  double d;
318  n16 = unCompress(in, wa);
319  nn = wa.size();
320  if(out) free(out);
321  out = (short *) malloc(nn*sizeof(short));
322 
323 // rounding data
324  for(int i=0; i<nn; i++) {
325  d=wa.data[i];
326  out[i]=short(d>0.? d+0.5: d-0.5);
327  }
328 
329  return n16;
330 }
331 
332 int unCompress(int* in, float* &out)
333 {
334  wavearray<float> wa;
335  int n16=unCompress(in, wa);
336  int nn = wa.size();
337  if(out) free(out);
338  out = (float *) malloc(nn*sizeof(float));
339  for (int i=0; i<nn; i++) out[i] = wa.data[i];
340  return n16;
341 }
342 
343 
344 
345 
346 
347 
348 
349 
350 
351 
virtual void resize(unsigned int)
Definition: wseries.cc:883
float rmsLimit
Definition: waverdc.hh:67
virtual size_t size() const
Definition: wavearray.hh:127
TF1 * g2
Definition: slag.C:248
wavearray< double > a(hp.size())
int n
Definition: cwb_net.C:10
wavearray< double > z
Definition: Test10.C:32
double getStatistics(double &mean, double &rms) const
Definition: wavearray.cc:2105
virtual void setLevel(int level)
Definition: Wavelet.hh:69
int unCompress(int *in, wavearray< float > &out)
Definition: lossy.cc:158
int j
Definition: cwb_net.C:10
i drho i
void getSign(const waveDouble &, waveShort &)
Definition: waverdc.cc:286
#define N
ofstream out
Definition: cwb_merge.C:196
int nLayer
Definition: waverdc.hh:23
TF1 * g1
Definition: compare_bkg.C:505
int getLayer(wavearray< DataType_t > &w, double n)
param: n - layer number
Definition: wseries.cc:175
ifstream in
double fabs(const Complex &x)
Definition: numpy.cc:37
void Forward(int n=-1)
param: wavelet - n is number of steps (-1 means full decomposition)
Definition: wseries.cc:228
int unCompress(waveFloat &, int level=1)
Definition: waverdc.cc:599
DataType_t * data
Definition: wavearray.hh:301
Long_t id
WaveDWT< DataType_t > * pWavelet
Definition: wseries.hh:438
int Compress(const waveShort &)
Definition: waverdc.cc:327
virtual void resize(unsigned int)
Definition: wavearray.cc:445
void Inverse(int n=-1)
param: n - number of steps (-1 means full reconstruction)
Definition: wseries.cc:273
int nSample
Definition: waverdc.hh:22
void putLayer(wavearray< DataType_t > &, double n)
param: n - layer number
Definition: wseries.cc:201
int Compress(wavearray< double > &in, int *&out, int Lwt, int Lbt, const double g1, const double g2, int np1, int np2)
Definition: lossy.cc:18