[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Example 6: A Differentiator

The program below inverts and differentiates the signals read by getvec and writes the results with putvec. The output is readable as record `dif'. A wide variety of simple digital filters can be modelled on this example; see section Example 7: A General-Purpose FIR Filter, for a more general approach.

 
 1  #include <stdio.h>
 2  #include <wfdb/wfdb.h>
 3  
 4  main(argc, argv)
 5  int argc;
 6  char *argv[];
 7  {
 8      WFDB_Siginfo *s;
 9      int i, nsig, nsamp=1000;
10      WFDB_Sample *vin, *vout;
11  
12      if (argc < 2) {
13          fprintf(stderr, "usage: %s record\n", argv[0]); exit(1);
14      }
15      if ((nsig = isigopen(argv[1], NULL, 0)) <= 0) exit(2);
16      s = (WFDB_Siginfo *)malloc(nsig * sizeof(WFDB_Siginfo));
17      vin = (WFDB_Sample *)malloc(nsig * sizeof(WFDB_Sample));
18      vout = (WFDB_Sample *)malloc(nsig * sizeof(WFDB_Sample));
19      if (s == NULL || vin == NULL || vout == NULL) {
20          fprintf(stderr, "insufficient memory\n");
21          exit(3);
22      }
23      if (isigopen(argv[1], s, nsig) != nsig) exit(2);
24      if (osigopen("8l", s, nsig) <= 0) exit(3);
25      while (nsamp-- > 0 && getvec(vin) > 0) {
26          for (i = 0; i < nsig; i++)
27              vout[i] -= vin[i];
28          if (putvec(vout) < 0) break;
29          for (i = 0; i < nsig; i++)
30              vout[i] = vin[i];
31      }
32      (void)newheader("dif");
33      wfdbquit();
34      exit(0);
35  }

(See http://www.physionet.org/physiotools/wfdb/examples/example6.c for a copy of this program.)

Notes:

Line 24:
Here we attempt to open as many output signals as there are input signals; if we cannot do so, the program exits after osigopen prints an error message.

Line 25:
The main loop of the program begins here. If 1000 samples can be read from each signal, the loop will end normally; if getvec fails before 1000 samples have been read, the loop ends prematurely.

Lines 26--27:
For each signal, we compute the negated first difference by subtracting the new sample from the previous sample.

Line 28:
One sample of each output signal is written here.

Lines 29--30:
The new input samples are copied into the output sample vector in preparation for the next iteration.

Line 32:
This step is optional. It creates a header file for a new record to be called `dif', which we can then open with another program if we want to read the signals that this program has written. Since the record argument for osigopen was `8l', we can also read these files using record `8l'; one reason for making a new `hea' file here is that the `hea' file for `8l' may not necessarily indicate the proper sampling frequency for these signals.

Line 33:
Since the program writes output signals, it must invoke wfdbquit to close the files properly.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

George B. Moody (george@mit.edu)