annotate tools/integframe.c @ 0:5242703e91d3 tip

Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author tomwalters
date Fri, 20 May 2011 15:19:45 +0100
parents
children
rev   line source
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