Edinburgh Speech Tools  2.1-release
EST_Wave.cc
Go to the documentation of this file.
1 /*************************************************************************/
2 /* */
3 /* Centre for Speech Technology Research */
4 /* University of Edinburgh, UK */
5 /* Copyright (c) 1996 */
6 /* All Rights Reserved. */
7 /* */
8 /* Permission is hereby granted, free of charge, to use and distribute */
9 /* this software and its documentation without restriction, including */
10 /* without limitation the rights to use, copy, modify, merge, publish, */
11 /* distribute, sublicense, and/or sell copies of this work, and to */
12 /* permit persons to whom this work is furnished to do so, subject to */
13 /* the following conditions: */
14 /* 1. The code must retain the above copyright notice, this list of */
15 /* conditions and the following disclaimer. */
16 /* 2. Any modifications must be clearly marked as such. */
17 /* 3. Original authors' names are not deleted. */
18 /* 4. The authors' names are not used to endorse or promote products */
19 /* derived from this software without specific prior written */
20 /* permission. */
21 /* */
22 /* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
23 /* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
24 /* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
25 /* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
26 /* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
27 /* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
28 /* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
29 /* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
30 /* THIS SOFTWARE. */
31 /* */
32 /*************************************************************************/
33 /* Author : Paul Taylor and Alan Black */
34 /* Date : May 1996 */
35 /*-----------------------------------------------------------------------*/
36 /* EST_Wave Class source file */
37 /* */
38 /*=======================================================================*/
39 
40 #include <iostream>
41 #include <cstdlib>
42 #include <cstdio>
43 #include <cmath>
44 #include <cstring>
45 #include "EST_cutils.h"
46 #include "EST_Wave.h"
47 #include "EST_wave_utils.h"
48 #include "EST_wave_aux.h"
49 #include "EST_TNamedEnum.h"
50 #include "EST_WaveFile.h"
51 #include "EST_File.h"
52 #include "EST_Track.h"
53 
54 #include "waveP.h"
55 
56 using namespace std;
57 
58 const EST_String DEF_FILE_TYPE = "riff";
59 const EST_String DEF_SAMPLE_TYPE = "short";
60 
61 const int EST_Wave::default_sample_rate=16000;
62 
64 {
65  default_vals();
66 }
67 
69 {
70  default_vals();
71  copy(w);
72 }
73 
75 {
76  default_vals(n,c);
77  set_sample_rate(sr);
78 }
79 
81  short *memory, int offset, int sample_rate,
82  int free_when_destroyed)
83 {
84  default_vals();
85  p_values.set_memory(memory, offset, samps, chans, free_when_destroyed);
86  set_sample_rate(sample_rate);
87 }
88 
90 {
91  // real defaults
92  p_values.resize(n,c);
94 
95  init_features();
96 }
97 
99 {
100  if (!p_values.p_sub_matrix)
101  p_values.resize(0L,0L);
102  clear_features();
103 }
104 
106 {
107  free_wave();
108 }
109 
111 {
113  copy_features(w);
114 }
115 
117 {
119 }
120 
121 void EST_Wave::copy(const EST_Wave &w)
122 {
123  copy_setup(w);
124 
125  copy_data(w);
126 }
127 
129 {
130  if ((int) i<0 || i>= num_samples())
131  {
132  cerr << "Attempt to access sample " << i << " of a " << num_samples() << " sample wave.\n";
133  if (num_samples()>0)
134  return *(p_values.error_return);
135  }
136 
137  if ( (int)channel<0 || channel>= num_channels())
138  {
139  cerr << "Attempt to access channel " << channel << " of a " << num_channels() << " channel wave.\n";
140  if (num_samples()>0)
141  return *(p_values.error_return);
142  }
143 
144  return p_values.a_no_check(i,channel);
145 }
146 
148 {
149  return ((EST_Wave *)this)->a(i,channel);
150 }
151 
153 {
154  static short out_of_bound_value = 0;
155 
156  if (( (int)i < 0) || (i >= num_samples()))
157  { // need to give them something but they might have changed it
158  // so reinitialise it to 0 first
159  out_of_bound_value = 0;
160  return out_of_bound_value;
161  }
162  else
163  return a_no_check(i,channel);
164 }
165 
167 {
168  if ((int) channel == EST_ALL)
169  {
170  if (v == 0) // this is *much* more efficient and common
171  memset(values().memory(),0,num_samples()*num_channels()*2);
172  else
173  p_values.fill(v);
174  }
175  else
176  for (ssize_t i = 0; i < num_samples(); ++i)
177  p_values.a_no_check(i,channel) = v;
178 }
179 
181  int offset, ssize_t length,
182  int rate)
183 {
185  EST_TokenStream ts;
186 
187  if ((ts.open(filename)) == -1)
188  {
189  cerr << "Wave load: can't open file \"" << filename << "\"" << endl;
190  return stat;
191  }
192 
193  stat = load(ts,offset,length,rate);
194  ts.close();
195  return stat;
196 }
197 
199  int offset, ssize_t length,
200  int rate)
201 {
203  EST_FilePos pos = ts.tell();
204 
205  for(int n=0; n< EST_WaveFile::map.n() ; n++)
206  {
208 
209  if (t == wff_none)
210  continue;
211 
212  EST_WaveFile::Info *info = &(EST_WaveFile::map.info(t));
213 
214  if (! info->recognise)
215  continue;
216 
217  EST_WaveFile::Load_TokenStream * l_fun =info->load;
218 
219  if (l_fun == NULL)
220  continue;
221 
222  if (ts.seek(pos) != 0) {
223  stat = read_error;
224  break;
225  }
226  stat = (*l_fun)(ts, *this,
227  rate, st_short, EST_NATIVE_BO, 1,
228  offset, length);
229 
230  if (stat == read_ok)
231  {
233  break;
234  }
235  else if (stat == read_error)
236  break;
237  }
238 
239  return stat;
240 }
241 
243  const EST_String type,
244  int offset, ssize_t length,
245  int rate)
246 {
248  EST_TokenStream ts;
249 
250  if (filename == "-")
251  ts.open(stdin,FALSE);
252  else if ((ts.open(filename)) == -1)
253  {
254  cerr << "Wave load: can't open file \"" << filename << "\"" << endl;
255  return stat;
256  }
257 
258  stat = load(ts,type,offset,length,rate);
259  ts.close();
260  return stat;
261 }
262 
264  const EST_String type,
265  int offset, ssize_t length,
266  int rate)
267 {
269 
270  if (t == wff_none)
271  {
272  cerr << "Unknown Wave file type " << type << endl;
273  return read_error;
274  }
275 
277 
278  if (l_fun == NULL)
279  {
280  cerr << "Can't load waves to files type " << type << endl;
281  return read_error;
282  }
283 
285  return (*l_fun)(ts, *this,
286  rate, st_short, EST_NATIVE_BO, 1,
287  offset, length);
288 
289 }
290 
292  const EST_String type, int sample_rate,
293  const EST_String stype, int bov, ssize_t nc, int offset,
294  ssize_t length)
295 {
297  EST_TokenStream ts;
298 
299  if (filename == "-")
300  ts.open(stdin,FALSE);
301  else if ((ts.open(filename)) == -1)
302  {
303  cerr << "Wave load: can't open file \"" << filename << "\"" << endl;
304  return stat;
305  }
306 
307  stat = load_file(ts,type,sample_rate,stype,bov,nc,offset,length);
308  ts.close();
309  return stat;
310 }
311 
313  const EST_String type, int sample_rate,
314  const EST_String stype, int bov, ssize_t nc, int offset,
315  ssize_t length)
316 
317 {
319 
320  EST_sample_type_t values_type = EST_sample_type_map.token(stype);
321 
322  if (t == wff_none)
323  {
324  cerr << "Unknown Wave file type " << type << endl;
325  return read_error;
326  }
327 
329 
330  if (l_fun == NULL)
331  {
332  cerr << "Can't load waves to files type " << type << endl;
333  return read_error;
334  }
335 
336  return (*l_fun)(ts, *this,
337  sample_rate, values_type, bov, nc,
338  offset, length);
339 
340 }
341 
343  int offset, ssize_t num,
344  ssize_t start_c, ssize_t nchan)
345 {
346  if ((int)num == EST_ALL)
347  num = num_samples()-offset;
348  if ((int)nchan == EST_ALL)
349  nchan = num_channels()-start_c;
350 
351  p_values.sub_matrix(sw.p_values, offset, num, start_c, nchan);
353 }
354 
356  const EST_String type)
357 {
358  FILE *fp;
359 
360  if (filename == "-")
361  fp = stdout;
362  else if ((fp = fopen(filename,"wb")) == NULL)
363  {
364  cerr << "Wave save: can't open output file \"" <<
365  filename << "\"" << endl;
366  return write_fail;
367  }
368 
369  EST_write_status r = save(fp,type);
370  if (fp != stdout)
371  fclose(fp);
372  return r;
373 }
374 
376 {
377  EST_String save_type = (type == "") ? DEF_FILE_TYPE : type;
378 
380 
381  if (t == wff_none)
382  {
383  cerr << "Wave: unknown filetype in saving " << save_type << endl;
384  return write_fail;
385  }
386 
388 
389  if (s_fun == NULL)
390  {
391  cerr << "Can't save waves to files type " << save_type << endl;
392  return write_fail;
393  }
394 
395  return (*s_fun)(fp, *this, st_short, EST_NATIVE_BO);
396 }
397 
399  EST_String ftype,
400  EST_String stype, int obo, const char *mode)
401 {
402  FILE *fp;
403 
404  if (filename == "-")
405  fp = stdout;
406  else if ((fp = fopen(filename, mode)) == NULL)
407  {
408  cerr << "Wave save: can't open output file \"" <<
409  filename << "\"" << endl;
410  return write_fail;
411  }
412 
413  EST_write_status r = save_file(fp,ftype,stype,obo);
414  if (fp != stdout)
415  fclose(fp);
416  return r;
417 }
418 
420  EST_String ftype,
421  EST_String stype, int obo)
422 {
425 
426  if (t == wff_none)
427  {
428  cerr << "Unknown Wave file type " << ftype << endl;
429  return write_fail;
430  }
431 
433 
434  if (s_fun == NULL)
435  {
436  cerr << "Can't save waves to files type " << ftype << endl;
437  return write_fail;
438  }
439 
440  return (*s_fun)(fp, *this, sample_type, obo);
441 }
442 
444  EST_String ftype,
445  EST_String stype, int obo)
446 {
449 
450  if (t == wff_none)
451  {
452  cerr << "Unknown Wave file type " << ftype << endl;
453  return write_fail;
454  }
455 
457 
458  if (s_fun == NULL)
459  {
460  cerr << "Can't save wave data to files type " << ftype << endl;
461  return write_fail;
462  }
463 
464  return (*s_fun)(fp, *this, sample_type, obo);
465 }
466 
467 
469  EST_String ftype,
470  EST_String stype, int obo)
471 {
474 
475  if (t == wff_none)
476  {
477  cerr << "Unknown Wave file type " << ftype << endl;
478  return write_fail;
479  }
480 
482 
483  if (s_fun == NULL)
484  {
485  cerr << "Can't save wave header to files type " << ftype << endl;
486  return write_fail;
487  }
488 
489  return (*s_fun)(fp, *this, sample_type, obo);
490 }
491 
492 void EST_Wave::resample(int new_freq)
493 {
494  // Resample wave to new sample rate
495  if (new_freq != p_sample_rate)
496  {
497  if (p_values.rateconv(p_sample_rate, new_freq) != 0)
498  cerr << "rateconv: failed to convert from " << p_sample_rate <<
499  " to " << new_freq << "\n";
500  else
501  set_sample_rate(new_freq);
502  }
503 
504 }
505 
506 void EST_Wave::rescale(float gain, int normalize)
507 {
508  int ns;
509  float factor = gain;
510  float nsf;
511 
512  if (normalize)
513  {
514  int max = 0;
515  for (ssize_t i = 0; i < num_samples(); ++i)
516  for (ssize_t j = 0; j < num_channels(); ++j)
517  if (abs(a_no_check(i,j)) > max)
518  max = abs(a_no_check(i,j));
519  if (fabs(max/32766.0-gain) < 0.001) {
520  return; /* already normalized */
521  } else {
522  if (max != 0.0) /* prevent div by zero */
523  factor *= 32766.0/(float)max;
524  else /* signal is zero everywhere */
525  factor = 1.0;
526  }
527  }
528 
529  for (ssize_t i = 0; i < num_samples(); ++i)
530  for (ssize_t j = 0; j < num_channels(); ++j)
531  {
532  if (factor == 1.0)
533  ns = a_no_check(i,j); // avoid float fluctuations
534  else if (factor == -1.0)
535  ns = -a_no_check(i,j); // avoid float fluctuations
536  else
537  {
538  nsf = (float)a_no_check(i,j) * factor;
539  if (nsf < 0.0)
540  ns = (int)(nsf - 0.5);
541  else
542  ns = (int)(nsf + 0.5);
543  }
544  if (ns < -32766)
545  a_no_check(i,j)= -32766;
546  else if (ns > 32766)
547  a_no_check(i,j)= 32766;
548  else
549  a_no_check(i,j)= ns;
550  }
551 }
552 
553 void EST_Wave::rescale( const EST_Track &fc )
554 {
555  int ns;
556  ssize_t start_sample, end_sample;
557  float target1, target2, increment, factor, nsf;
558 
559  ssize_t fc_length = fc.length();
560  ssize_t _num_channels = num_channels();
561 
562  cerr << ((ssize_t)(fc.t(fc_length-1) * p_sample_rate)) << endl;
563 
564  if( ((ssize_t)(fc.t(fc_length-1) * p_sample_rate)) > num_samples() )
565  EST_error( "Factor contour track exceeds waveform length (%d samples)",
566  (fc.t(fc_length-1) * p_sample_rate) - num_samples() );
567 
568  start_sample = fc.t(0L)*p_sample_rate;
569  target1 = fc.a(static_cast<ssize_t>(0),0); // could use separate channels for each waveform channel
570 
571  for (ssize_t k = 1; k<fc_length; ++k ){
572  end_sample = fc.t( k )*p_sample_rate;
573  target2 = fc.a(k);
574 
575  increment = (target2-target1)/(end_sample-start_sample+1);
576 
577  factor = target1;
578  for( ssize_t i=start_sample; i<end_sample; ++i, factor+=increment )
579  for( ssize_t j=0; j<_num_channels; ++j ){
580  if (factor == 1.0)
581  ns = a_no_check(i,j); // avoid float fluctuations
582  else if (factor == -1.0)
583  ns = -a_no_check(i,j); // avoid float fluctuations
584  else
585  {
586  nsf = (float)a_no_check(i,j) * factor;
587  if (nsf < 0.0)
588  ns = (int)(nsf - 0.5);
589  else
590  ns = (int)(nsf + 0.5);
591  }
592  if (ns < -32766)
593  a_no_check(i,j)= -32766;
594  else if (ns > 32766)
595  a_no_check(i,j)= 32766;
596  else
597  a_no_check(i,j)= ns;
598  }
599  start_sample = end_sample;
600  target1 = target2;
601  }
602 }
603 
604 
605 
607 {
608  copy(w);
609  return *this;
610 }
611 
613 {
614  EST_Wave w2;
615  const EST_Wave *toadd = &w;
616 
617  if (w.num_channels() != num_channels())
618  {
619  cerr << "Cannot concatenate waveforms with differing numbers of channels\n";
620  return *this;
621  }
622 
623  if (p_sample_rate != w.sample_rate())
624  {
625  w2 = w;
627  toadd= &w2;
628  }
629 
630  p_values.add_rows(toadd->p_values);
631 
632  return *this;
633 }
634 
635 // add wave p_values to existing wave in parallel to create multi-channel wave.
637 {
638  ssize_t i, k;
639  EST_Wave w = wi; // to allow resampling of const
640 
641  w.resample(p_sample_rate); // far too difficult otherwise
642 
643  int o_channels = num_channels();
644  int r_channels = num_channels()+w.num_channels();
645  int r_samples = Gof(num_samples(), w.num_samples());
646 
647  resize(r_samples, r_channels);
648 
649  for (k = 0; k < w.num_channels(); ++k)
650  for (i=0; i < w.num_samples(); i++)
651  a(i,k+o_channels) += w.a(i, k);
652 
653  return *this;
654 }
655 
656 ostream& operator << (ostream& p_values, const EST_Wave &sig)
657 {
658  for (ssize_t i = 0; i < sig.num_samples(); ++i)
659  p_values << sig(i) << "\n";
660 
661  return p_values;
662 }
663 
665  { (void)a; (void)b; return 1; }
667  { (void)a; (void)b; return 0; }
A class for storing digital waveforms. The waveform is stored as an array of 16 bit shorts...
Definition: EST_Wave.h:64
EST_Wave & operator+=(const EST_Wave &a)
Definition: EST_Wave.cc:612
void copy_setup(const EST_Wave &w)
Definition: EST_Wave.cc:110
void set_sample_rate(const int n)
Set sampling rate to n
Definition: EST_Wave.h:149
EST_write_status save_file_data(FILE *fp, EST_String ftype, EST_String stype, int obo)
Definition: EST_Wave.cc:443
Load_TokenStream * load
EST_write_status
The file was read in successfully.
ssize_t length() const
return number of frames in track
Definition: EST_Track.h:654
EST_TMatrix & add_rows(const EST_TMatrix &s)
The two versions of what might have been operator +=.
Definition: EST_TMatrix.cc:167
ssize_t length() const
return the size of the waveform, i.e. the number of samples.
Definition: EST_Wave.h:151
int p_sample_rate
Definition: EST_Wave.h:69
bool p_sub_matrix
Definition: EST_TVector.h:161
void close(void)
Close stream.
Definition: EST_Token.cc:419
EST_TNamedEnum< EST_sample_type_t > EST_sample_type_map
void copy(const EST_Wave &from)
Definition: EST_Wave.cc:121
void set_file_type(const EST_String t)
Definition: EST_Wave.h:167
EST_FilePos tell(void) const
tell, synonym for filepos
Definition: EST_Token.h:369
EST_read_status Load_TokenStream(LoadWave_TokenStreamArgs)
Definition: EST_WaveFile.h:91
ssize_t num_samples() const
return the number of samples in the waveform
Definition: EST_Wave.h:143
int ssize_t
const int EST_ALL
void rescale(float gain, int normalize=0)
Definition: EST_Wave.cc:506
short & a(ssize_t i, ssize_t channel=0)
Definition: EST_Wave.cc:128
EST_write_status save(const EST_String filename, const EST_String EST_filetype="")
Definition: EST_Wave.cc:355
void channel(EST_TVector< short > &cv, ssize_t n)
Definition: EST_Wave.h:213
void sub_wave(EST_Wave &sw, int offset=0, ssize_t num=EST_ALL, ssize_t start_c=0, ssize_t nchan=EST_ALL)
Definition: EST_Wave.cc:342
EST_Wave()
default constructor
Definition: EST_Wave.cc:63
EST_Wave & operator=(const EST_Wave &w)
Assignment operator.
Definition: EST_Wave.cc:606
short & a_safe(ssize_t i, ssize_t channel=0)
Definition: EST_Wave.cc:152
static const int default_sample_rate
Definition: EST_Wave.h:78
ENUM token(VAL value) const
int open(const EST_String &filename)
open a EST_TokenStream for a file.
Definition: EST_Token.cc:213
float max(float a, float b)
Definition: EST_cluster.cc:143
const EST_String DEF_SAMPLE_TYPE
Definition: EST_Wave.cc:59
An error occurred while reading.
EST_write_status save_file(const EST_String filename, EST_String filetype, EST_String sample_type, int bo, const char *mode="wb")
Definition: EST_Wave.cc:398
void fill(const T &v)
fill matrix with value v
Definition: EST_TMatrix.cc:314
float & t(ssize_t i=0)
return time position of frame i
Definition: EST_Track.h:478
float & a(ssize_t i, int c=0)
Definition: EST_Track.cc:1025
EST_read_status load_file(const EST_String filename, const EST_String filetype, int sample_rate, const EST_String sample_type, int bo, ssize_t nc, int offset=0, ssize_t length=0)
Definition: EST_Wave.cc:291
void default_vals(ssize_t n=0, ssize_t c=1)
Definition: EST_Wave.cc:89
const EST_SMatrix & values() const
Definition: EST_Wave.h:177
EST_SMatrix p_values
Definition: EST_Wave.h:67
void copy(const EST_TSimpleMatrix< T > &a)
copy one matrix into another
int n(void) const
EST_write_status Save_TokenStream(SaveWave_TokenStreamArgs)
Definition: EST_WaveFile.h:93
const EST_String DEF_FILE_TYPE
Definition: EST_Wave.cc:58
Save_TokenStream * save_data
Definition: EST_WaveFile.h:100
INLINE short & a_no_check(ssize_t i, ssize_t channel=0)
Definition: EST_Wave.h:105
#define FALSE
Definition: EST_bool.h:119
void sub_matrix(EST_TMatrix< T > &sm, ssize_t r=0, ptrdiff_t numr=EST_ALL, ssize_t c=0, ptrdiff_t numc=EST_ALL)
Make the matrix sm a window into this matrix.
Definition: EST_TMatrix.cc:578
friend ostream & operator<<(ostream &p_values, const EST_Wave &sig)
print waveform
Definition: EST_Wave.cc:656
NULL
Definition: EST_WFST.cc:55
#define EST_error
Definition: EST_error.h:104
getString int
Definition: EST_item_aux.cc:50
The file was not written successfully.
Save_TokenStream * save
void resize(int num_samples, int num_channels=EST_ALL, int set=1)
resize the waveform
Definition: EST_Wave.h:184
int sample_rate() const
return the sampling rate (frequency)
Definition: EST_Wave.h:147
static T * error_return
Definition: EST_TVector.h:227
#define Gof(a, b)
Definition: EST_cutils.h:95
EST_read_status
void free_wave()
Definition: EST_Wave.cc:98
INFO & info(ENUM token) const
void set_memory(T *buffer, ptrdiff_t offset, ssize_t rows, ssize_t columns, int free_when_destroyed=0)
Definition: EST_TMatrix.cc:371
EST_write_status save_file_header(FILE *fp, EST_String ftype, EST_String stype, int obo)
Definition: EST_Wave.cc:468
float t(ssize_t i) const
return the time position in seconds of the ith sample
Definition: EST_Wave.h:137
ssize_t num_channels() const
return the number of channels in the waveform
Definition: EST_Wave.h:145
EST_sample_type_t
Definition: EST_wave_aux.h:105
EST_WaveFileType
Definition: EST_WaveFile.h:50
int operator!=(EST_Wave a, EST_Wave b)
Definition: EST_Wave.cc:664
#define EST_NATIVE_BO
Definition: EST_cutils.h:72
INLINE const T & a_no_check(ssize_t row, ssize_t col) const
const access with no bounds check, care recommend
Definition: EST_TMatrix.h:182
void resize(int rows, int cols, int set=1)
resize matrix
EST_Wave & operator|=(const EST_Wave &a)
Definition: EST_Wave.cc:636
int operator==(EST_Wave a, EST_Wave b)
Definition: EST_Wave.cc:666
void resample(int rate)
Resample waveform to rate
Definition: EST_Wave.cc:492
LISP fp
Definition: kkcompile.cc:63
Save_TokenStream * save_header
Definition: EST_WaveFile.h:99
void copy_data(const EST_Wave &w)
Definition: EST_Wave.cc:116
EST_String sample_type() const
Definition: EST_Wave.h:163
int seek(int position)
seek, reposition file pointer
Definition: EST_Token.cc:318
off_t EST_FilePos
Definition: EST_File.h:69
int rateconv(int old_sr, int new_sr)
Definition: EST_SMatrix.cc:64
void fill(short v=0, ssize_t channel=EST_ALL)
Definition: EST_Wave.cc:166
EST_read_status load(const EST_String filename, int offset=0, ssize_t length=0, int rate=default_sample_rate)
Definition: EST_Wave.cc:180
static EST_TNamedEnumI< EST_WaveFileType, Info > map
Definition: EST_WaveFile.h:154
~EST_Wave()
Definition: EST_Wave.cc:105