tomwalters@0
|
1 /*
|
tomwalters@0
|
2 integrate.c Integrate (ie average) SAI frames over time or frequency.
|
tomwalters@0
|
3 -----------
|
tomwalters@0
|
4
|
tomwalters@0
|
5 Sequence of frames must have an SAI header.
|
tomwalters@0
|
6 The whole of every frame read in is integrated (in either time or freq).
|
tomwalters@0
|
7 Use edframe to set integration limits and select frames.
|
tomwalters@0
|
8 The output is a sequence of arrays without a header, one per input frame,
|
tomwalters@0
|
9 each of length `framewidth'.
|
tomwalters@0
|
10 If `average=on' the output is one array of length `framewidth' which is
|
tomwalters@0
|
11 the average of the sequence of arrays.
|
tomwalters@0
|
12
|
tomwalters@0
|
13 Example:
|
tomwalters@0
|
14
|
tomwalters@0
|
15 1. Integrate the 2nd SAI frame over time from 10ms to 20ms.
|
tomwalters@0
|
16 gensai output=stdout ... | select frame=2 time=10ms-20ms | integrate var=time > ...
|
tomwalters@0
|
17
|
tomwalters@0
|
18 2. Integrate the 2nd SAI frame over frequency from channels 5 to 8 inclusive.
|
tomwalters@0
|
19 gensai output=stdout ... | select frame=2 freq=5-8 | integrate var=time > ...
|
tomwalters@0
|
20
|
tomwalters@0
|
21 */
|
tomwalters@0
|
22
|
tomwalters@0
|
23 #include <stdio.h>
|
tomwalters@0
|
24 #include <math.h>
|
tomwalters@0
|
25 #include "header.h"
|
tomwalters@0
|
26 #include "options.h"
|
tomwalters@0
|
27 #include "strmatch.h"
|
tomwalters@0
|
28
|
tomwalters@0
|
29
|
tomwalters@0
|
30 char applic[] = "Integrate SAI frames over time or frequency. " ;
|
tomwalters@0
|
31
|
tomwalters@0
|
32 static char *helpstr, *debugstr, *varstr, *avstr, *typestr, *infostr ;
|
tomwalters@0
|
33
|
tomwalters@0
|
34 static Options option[] = {
|
tomwalters@0
|
35 { "help" , "off" , &helpstr , "help" , DEBUG },
|
tomwalters@0
|
36 { "debug" , "off" , &debugstr , "debugging switch" , DEBUG },
|
tomwalters@0
|
37 { "variable" , "time" , &varstr , "variable of integration (time or frequency)" , VAL },
|
tomwalters@0
|
38 { "average" , "off" , &avstr , "average all integrated frames" , VAL },
|
tomwalters@0
|
39 { "type" , "short" , &typestr , "output data type" , VAL },
|
tomwalters@0
|
40 { "info" , "off" , &infostr , "print frame size info" , VAL },
|
tomwalters@0
|
41 ( char * ) 0 } ;
|
tomwalters@0
|
42
|
tomwalters@0
|
43
|
tomwalters@0
|
44 int frameheight, framewidth ; /* Parameters read from header */
|
tomwalters@0
|
45 int framebytes ;
|
tomwalters@0
|
46 int average ;
|
tomwalters@0
|
47 int type ;
|
tomwalters@0
|
48
|
tomwalters@0
|
49
|
tomwalters@0
|
50 main(argc, argv)
|
tomwalters@0
|
51 int argc ;
|
tomwalters@0
|
52 char *argv[] ;
|
tomwalters@0
|
53 {
|
tomwalters@0
|
54 FILE *fp ;
|
tomwalters@0
|
55 char *header, *SaiHeader();
|
tomwalters@0
|
56 short *frame ;
|
tomwalters@0
|
57 float *buf, *avbuf ;
|
tomwalters@0
|
58 int i, j, k, n ;
|
tomwalters@0
|
59
|
tomwalters@0
|
60 fp = openopts( option,argc,argv ) ;
|
tomwalters@0
|
61 if ( !isoff( helpstr ) )
|
tomwalters@0
|
62 helpopts( helpstr, argv[0], applic, option ) ;
|
tomwalters@0
|
63
|
tomwalters@0
|
64 average = ison( avstr ) ;
|
tomwalters@0
|
65 if ( ( type = typeindex( typestr ) ) < 0 ) {
|
tomwalters@0
|
66 fprintf( stderr, "integframe: bad type [%s]\n", typestr ) ;
|
tomwalters@0
|
67 exit( 1 ) ;
|
tomwalters@0
|
68 }
|
tomwalters@0
|
69
|
tomwalters@0
|
70 if ( (header = ReadHeader(fp)) == (char *) 0 ) {
|
tomwalters@0
|
71 fprintf(stderr,"integrate: header not found\n");
|
tomwalters@0
|
72 exit(1);
|
tomwalters@0
|
73 }
|
tomwalters@0
|
74
|
tomwalters@0
|
75 frameheight = HeaderInt( header, "frameheight" );
|
tomwalters@0
|
76 framewidth = HeaderInt( header, "framewidth" );
|
tomwalters@0
|
77 framebytes = HeaderInt( header, "framebytes" );
|
tomwalters@0
|
78
|
tomwalters@0
|
79 if ( ison( infostr ) )
|
tomwalters@0
|
80 fprintf( stderr,"frameheight=%d framewidth=%d\n", frameheight, framewidth ) ;
|
tomwalters@0
|
81
|
tomwalters@0
|
82 /* Allocate space for framebytes of data */
|
tomwalters@0
|
83
|
tomwalters@0
|
84 if ( (frame = (short *)malloc( framebytes )) == (short *)0 ) {
|
tomwalters@0
|
85 fprintf(stderr,"integrate: malloc out of space\n");
|
tomwalters@0
|
86 exit(1);
|
tomwalters@0
|
87 }
|
tomwalters@0
|
88
|
tomwalters@0
|
89 if ( iststr( varstr, "time" ) ) {
|
tomwalters@0
|
90 if ( (buf = (float *)malloc( frameheight * sizeof( float ) )) == (float *)0 ) {
|
tomwalters@0
|
91 fprintf(stderr,"integrate: malloc out of space\n");
|
tomwalters@0
|
92 exit(1);
|
tomwalters@0
|
93 }
|
tomwalters@0
|
94 if ( average ) {
|
tomwalters@0
|
95 if ( (avbuf = (float *)malloc( frameheight * sizeof( float ) )) == (float *)0 ) {
|
tomwalters@0
|
96 fprintf(stderr,"integrate: malloc out of space\n");
|
tomwalters@0
|
97 exit(1);
|
tomwalters@0
|
98 }
|
tomwalters@0
|
99 for ( i=0 ; i<frameheight ; i++ )
|
tomwalters@0
|
100 avbuf[i] = 0 ;
|
tomwalters@0
|
101 }
|
tomwalters@0
|
102 for ( n = 0 ; fread( frame,framebytes,1,fp ) ; n++ ) {
|
tomwalters@0
|
103 for ( i=0, j=0 ; i<frameheight ; i++, j+=framewidth )
|
tomwalters@0
|
104 buf[i] = frame[j] ;
|
tomwalters@0
|
105 for ( k=1 ; k<framewidth ; k++)
|
tomwalters@0
|
106 for ( i=0, j=k ; i<frameheight ; i++, j+=framewidth )
|
tomwalters@0
|
107 buf[i] += frame[j] ;
|
tomwalters@0
|
108 if ( average )
|
tomwalters@0
|
109 for ( i=0 ; i<frameheight ; i++ )
|
tomwalters@0
|
110 avbuf[i] += ( buf[i] / framewidth ) ;
|
tomwalters@0
|
111 else {
|
tomwalters@0
|
112 for ( i=0 ; i<frameheight ; i++ ) {
|
tomwalters@0
|
113 buf[i] = buf[i] / framewidth ;
|
tomwalters@0
|
114 writeitem( &buf[i], type, 1, stdout ) ;
|
tomwalters@0
|
115 }
|
tomwalters@0
|
116 }
|
tomwalters@0
|
117 }
|
tomwalters@0
|
118 if ( average && n > 0 ) {
|
tomwalters@0
|
119 for ( i=0 ; i<frameheight ; i++ ) {
|
tomwalters@0
|
120 avbuf[i] = avbuf[i] / n ;
|
tomwalters@0
|
121 writeitem( &avbuf[i], type, 1, stdout ) ;
|
tomwalters@0
|
122 }
|
tomwalters@0
|
123 }
|
tomwalters@0
|
124 }
|
tomwalters@0
|
125
|
tomwalters@0
|
126 else if ( iststr( varstr, "frequency" ) ) {
|
tomwalters@0
|
127 if ( (buf = (float *)malloc( framewidth * sizeof( float ) )) == (float *)0 ) {
|
tomwalters@0
|
128 fprintf(stderr,"integrate: malloc out of space\n");
|
tomwalters@0
|
129 exit(1);
|
tomwalters@0
|
130 }
|
tomwalters@0
|
131 if ( average ) {
|
tomwalters@0
|
132 if ( (avbuf = (float *)malloc( framewidth * sizeof( float ) )) == (float *)0 ) {
|
tomwalters@0
|
133 fprintf(stderr,"integrate: malloc out of space\n");
|
tomwalters@0
|
134 exit(1);
|
tomwalters@0
|
135 }
|
tomwalters@0
|
136 for ( i=0 ; i<framewidth ; i++ )
|
tomwalters@0
|
137 avbuf[i] = 0 ;
|
tomwalters@0
|
138 }
|
tomwalters@0
|
139 for ( n = 0 ; fread( frame,framebytes,1,fp ) ; n++ ) {
|
tomwalters@0
|
140 for ( i=0 ; i<framewidth ; i++ )
|
tomwalters@0
|
141 buf[i] = frame[i] ;
|
tomwalters@0
|
142 for ( k=1 ; k<frameheight ; k++)
|
tomwalters@0
|
143 for ( i=0, j=k*framewidth ; i<framewidth ; i++, j++ )
|
tomwalters@0
|
144 buf[i] += frame[j] ;
|
tomwalters@0
|
145 if ( average ) {
|
tomwalters@0
|
146 for ( i=0 ; i<framewidth ; i++ )
|
tomwalters@0
|
147 avbuf[i] += ( buf[i] / frameheight ) ;
|
tomwalters@0
|
148 }
|
tomwalters@0
|
149 else {
|
tomwalters@0
|
150 for ( i=0 ; i<framewidth ; i++ ) {
|
tomwalters@0
|
151 buf[i] = buf[i] / frameheight ;
|
tomwalters@0
|
152 writeitem( &buf[i], type, 1, stdout ) ;
|
tomwalters@0
|
153 }
|
tomwalters@0
|
154 }
|
tomwalters@0
|
155 }
|
tomwalters@0
|
156 if ( average && n > 0 ) {
|
tomwalters@0
|
157 for ( i=0 ; i<framewidth ; i++ ) {
|
tomwalters@0
|
158 avbuf[i] = avbuf[i] / n ;
|
tomwalters@0
|
159 writeitem( &avbuf[i], type, 1, stdout ) ;
|
tomwalters@0
|
160 }
|
tomwalters@0
|
161 }
|
tomwalters@0
|
162 }
|
tomwalters@0
|
163
|
tomwalters@0
|
164 else {
|
tomwalters@0
|
165 fprintf( stderr,"unknown variable of integration [%s]\n", varstr ) ;
|
tomwalters@0
|
166 exit( 1 ) ;
|
tomwalters@0
|
167 }
|
tomwalters@0
|
168
|
tomwalters@0
|
169 if ( ison( infostr ) )
|
tomwalters@0
|
170 fprintf( stderr,"frames=%d\n", n ) ;
|
tomwalters@0
|
171
|
tomwalters@0
|
172 fclose( fp ) ;
|
tomwalters@0
|
173 }
|
tomwalters@0
|
174
|
tomwalters@0
|
175
|