Diff of /HRV.src/pwr.c [000000] .. [1a3ddc]

Switch to unified view

a b/HRV.src/pwr.c
1
/* pwr.c        Joe Mietus      Oct 7 2008 */
2
3
/*
4
pwr :
5
Usage: pwr [-r] [-L] lo1 hi1 ... [lo10 hi10]
6
  Calculate total (and relative) power in fft between lo and hi.
7
  options :
8
  [-r] : print ratio of powers to total
9
  [-L] : print powers on one line
10
*/
11
12
13
#include <stdio.h>
14
#include <stdlib.h>
15
16
#define MAXBANDS 10
17
18
main(argc, argv)
19
int argc;
20
char *argv[];
21
{
22
23
    int i, n, nbands, rflag, lflag;
24
    double lo[MAXBANDS], hi[MAXBANDS], pr[MAXBANDS], tot;
25
    double freq[2], mag[2], hbin[2], pwr;
26
27
28
    if (argc < 3) {
29
        usage(argv[0]);
30
        exit(1);
31
    }
32
33
    rflag = lflag = 0;
34
    for (i=1, argc--; argv[i][0] == '-'; i++, argc--) {
35
        switch(argv[i][1]) {
36
        case 'r': rflag = 1;
37
                  break;
38
        case 'L': lflag = 1;
39
                  break;
40
        default: usage(argv[0]);
41
                 exit(1);
42
        }
43
    }
44
        
45
    if (argc % 2 != 0) {
46
        usage(argv[0]);
47
        exit(1);
48
    }
49
50
    if ((nbands = argc/2) > 10) {
51
        fprintf(stderr, "%s : max power bands = MAXBANDS\n");
52
        exit(1);
53
    }
54
55
    for (n=0; n<nbands; n++) {
56
        lo[n] = atof(argv[i++]);
57
        hi[n] = atof(argv[i++]);
58
        pr[n] = 0.0;
59
    }
60
61
    tot = 0.0;
62
63
    if (scanf("%lf%lf", &freq[0], &mag[0]) != 2)
64
        exit(2);
65
    if (scanf("%lf%lf", &freq[1], &mag[1]) != 2)
66
        exit(2);
67
68
    pwr = mag[0]*mag[0];
69
    tot += pwr;
70
    for (n=0; n<nbands; n++) {
71
        if (freq[0] >= lo[n] && freq[0] <= hi[n])
72
            pr[n] += pwr;
73
    }
74
    freq[0] = freq[1];
75
    mag[0] = mag[1];
76
77
    while (scanf("%lf%lf", &freq[1], &mag[1]) == 2) {
78
        pwr = mag[0]*mag[0];
79
        tot += pwr;
80
        for (n=0; n<nbands; n++) {
81
            if (freq[0] >= lo[n] && freq[0] <= hi[n])
82
                pr[n] += pwr;
83
        }
84
        freq[0] = freq[1];
85
    mag[0] = mag[1];
86
    }
87
88
    pwr = mag[0]*mag[0];
89
    tot += pwr;
90
    for (n=0; n<nbands; n++) {
91
        if (freq[0] >= lo[n] && freq[0] <= hi[n])
92
        pr[n] += pwr;
93
    }
94
95
    if (lflag) {
96
        printf("%g ", tot);
97
        for (n=0; n<nbands; n++) {
98
            printf("%g ", pr[n]);
99
            if (rflag)
100
                printf("(%.3f) ", pr[n]/tot);
101
        }
102
        printf("\n");
103
    }
104
    else {
105
        printf("Total = %g\n", tot);
106
        for (n=0; n<nbands; n++) {
107
            printf("%g - %g = %g", lo[n], hi[n], pr[n]);
108
            if (rflag)
109
                printf(" (%.3f)\n", pr[n]/tot);
110
            else
111
                printf("\n");
112
        }
113
    }
114
}
115
116
117
usage(prog)
118
char *prog;
119
{
120
    fprintf(stderr, "Usage: %s [-r] [-L] lo1 hi1 ... [lo10 hi10]\n", prog);
121
    fprintf(stderr, " Calculate total (and relative) power");
122
    fprintf(stderr, " in fft between lo and hi.\n");
123
    fprintf(stderr, " options :\n");
124
    fprintf(stderr, " [-r] : print ratio of powers to total\n");
125
    fprintf(stderr, " [-L] : print powers on one line\n");
126
127
}