MODULE BITCombineSignals EXPORTS Main; (* Last edited on 1999-12-22 21:11:41 by hcgl *) (* Computes the mean and difference of two real-valued signals. *) (* This program reads two signals "a(t)" and "b(t)", sampled at the same collection of instants "t[i]". It writes the difference "d(t) = a(t) - b(t)" and the mean "m(t) = (a(t) + b(t))/2". *) IMPORT ParseParams, Process, FileRd, Wr, FileWr; IMPORT OSError, Thread, Stdio; IMPORT PZLRChain; FROM Stdio IMPORT stderr; FROM PZTypes IMPORT LONGS; <* FATAL Wr.Failure, Thread.Alerted, OSError.E *> TYPE Options = RECORD name: TEXT; (* Input/output signal name prefix. *) END; PROCEDURE Main() = BEGIN WITH o = GetOptions(), ra = PZLRChain.Read(FileRd.Open(o.name & "/a.fsh"), headerOnly := FALSE), a = ra.c^, rb = PZLRChain.Read(FileRd.Open(o.name & "/b.fsh"), headerOnly := FALSE), b = rb.c^, unit = 0.5d0 * MAX(ra.unit, rb.unit), cmt = "=== signal \"a\" ===\n" & ra.cmt & "\n\n" & "=== signal \"b\" ===\n" & rb.cmt, N = NUMBER(a), d = NEW(REF LONGS, N)^, m = NEW(REF LONGS, N)^ DO <* ASSERT NUMBER(b) = N *> FOR i := 0 TO N-1 DO m[i] := (a[i] + b[i])/2.0d0; d[i] := b[i] - a[i] END; PZLRChain.Write( FileWr.Open(o.name & "/m.fsh"), "mean signal m = (a+b)/2\n" & cmt, m, stride := 0.0d0, unit := unit ); PZLRChain.Write( FileWr.Open(o.name & "/d.fsh"), "difference signal d = b-a\n" & cmt, d, stride := 0.0d0, unit := unit ) END END Main; PROCEDURE GetOptions(): Options = VAR o: Options; BEGIN WITH pp = NEW(ParseParams.T).init(stderr) DO TRY pp.getKeyword("-name"); o.name := pp.getNext(); pp.finish(); EXCEPT | ParseParams.Error => Wr.PutText(stderr, "Usage: BITCombineSignals -name NAME \n"); Process.Exit(1); END; END; RETURN o END GetOptions; BEGIN Main() END BITCombineSignals.