NAME
harminv - extract mode frequencies from time-series
data
SYNOPSIS
harminv [OPTION]...
[freq-min-freq-max]...
DESCRIPTION
harminv is a program designed to solve the problem of
"harmonic inversion": given a time series consisting of a sum of
sinusoids ("modes"), extract their frequencies and amplitudes. It
can also handle the case of exponentially-decaying sinusoids, in
which case it extracts their decay rates as well.
harminv is often able to achieve much greater accuracy
and robustness than Fourier-transform methods, essentially because
it assumes a specific form for the input.
It uses a low-storage "filter-diagonalization method" (FDM), as
described in V. A. Mandelshtam and H. S. Taylor, "Harmonic
inversion of time signals," J. Chem. Phys. 107, 6756
(1997). See also erratum, ibid 109, 4128 (1998).
INPUT
harminv reads in a sequence of
whitespace-separated real or complex numbers from standard input,
as well as command-line arguments indicating one or more frequency
ranges to search, and outputs the modes that it extracts from the
data. (It preferentially finds modes in the frequency range you
specify, but may sometimes find additional modes outside of that
range.) The data should correspond to equally-spaced time
intervals, but there is no constraint on the number of points.
Complex numbers in the input should be expressed in the format
RE+IMi (no whitespace). Otherwise, whitespace is
ignored. Also, comments beginning with "#" and extending to the end
of the line are ignored.
A typical invocation is something like
- harminv -t 0.02 1-5 < input.dat
which reads a sequence of samples, spaced at 0.02 time intervals
(in ms, say, corresponding to 50 kHz), and searches for modes in
the frequency range 1-5 kHz. (See below on units.)
OUTPUT
harminv writes six comma-delimited columns to
standard output, one line for each mode: frequency, decay constant,
Q, amplitude, phase, and error. Each mode corresponds to a function
of the form:
amplitude * exp[-i (2 pi frequency t -
phase) - decay t]
Here, i is sqrt(-1), t is the time (see below for units), and
the other parameters in the output columns are:
- frequency
- The frequency of the mode. If you don't recognize that from the
expression above, you should recall Euler's formula: exp(i x) =
cos(x) + i sin(x). Note that for complex data, there is a
distinction between positive and negative frequencies.
- decay constant
- The exponential decay constant, indicated by decay in
the above formula. The inverse of this is often called the
"lifetime" of the mode. The "half-life" is ln(2)/decay.
- Q
- A conventional, dimensionless expression of the decay lifetime:
Q = pi |frequency| / decay. Q, which stands for "quality
factor", is the number of periods for the "energy" in the mode (the
squared amplitude) to decay by exp(-2 pi). Equivalently, if you
look at the power spectrum (|Fourier transform|^2), 1/Q is the
fractional width of the peak at half maximum.
- amplitude
- The (real, positive) amplitude of the sinusoids. The amplitude
(and phase) information generally seems to be less accurate than
the frequency and decay constant.
- phase
- The phase shift (in radians) of the sinusoids, as given by the
formula above.
- error
- A crude estimate of the relative error in the (complex)
frequency. This is not really an error bar, however, so you should
treat it more as a figure of merit (smaller is better) for each
mode.
SPURIOUS MODES
Typically, harminv will find a number of
spurious solutions in addition to the desired solutions, especially
if your data are noisy. Such solutions are characterized by large
errors, small amplitudes, and/or small Q (large decay rates / broad
linewidths). You can omit these from the output by the
error/Q/amplitude screening options defined below.
By default, modes with error > 0.1 and Q < 10 are
automatically omitted, but it is likely that you will need to set
stricter limits.
UNITS
The frequency (and decay) values, both input and
output, are specified in units of 1/time, where the units of time
are determined by the sampling interval dt (the time between
consecutive inputs). dt is by default 1, unless you specify
it with the -t dt option.
In other words, pick some units (e.g. ms in the example above)
and use them to express the time step. Then, be consistent and use
the inverse of those units (e.g. kHz = 1/ms) for frequency.
Note that the frequency is the usual 1/period definition; it is
not the angular frequency.
OPTIONS
- -h
- Display help on the command-line options and usage.
- -V
- Print the version number and copyright info for harminv.
- -v
- Enable verbose output, printed to standard output as comment
lines (starting with a "#" character). Also, any "#" comments in
the input are echoed to the output.
- -T
- Specify period-ranges instead of frequency-ranges on the
command line (in units of time corresponding to those specified by
-t). The output is still frequency and not period, however.
- -w
- Specify angular frequencies instead of frequencies, and output
angular frequency instead of frequency. (Angular frequency is
frequency multiplied by 2 pi).
- -n
- Flip the sign of the frequency (and phase) convention used in
harminv. (The sign of the frequency is only important if you have
complex-valued input data, in which case the positive and negative
frequency amplitudes can differ.)
- -t dt
- Specify the sampling interval dt; this determines the
units of time used throughout the input and output. Defaults to
1.0.
- -d d
- Specify the spectral "density" d to search for modes,
where a density of 1 indicates the usual Fourier resolution. That
is, the number of basis functions (which sets an upper bound on the
number of modes) is given by d times (freq-max -
freq-min) times dt times the number of samples in
your dataset. A maximum of 300 is used, however, to prevent the
matrices from getting too big (you can force a larger number with
-f, below).
Note that the frequency resolution of the outputs is not
limited by the spectral density, and can generally be much greater
than the Fourier resolution. The density determines how many modes,
at most, to search for, and in some sense is the density with which
the bandwidth is initially "searched" for modes.
The default density is 0.0, which means that the number of basis
functions is determined by -f (which defaults to 100). This often
corresponds to a much larger density than the usual Fourier
resolution, but the resulting singularities in the system matrices
are automatically removed by harminv.
- -f nf
- Specify a lower bound nf on the number of spectral basis
functions (defaults to 100), setting a lower bound on the number of
modes to search for. This option is often a more convenient way to
specify the number of basis functions than the -d option,
above, which is why it is the default.
-f also allows you to employ more than 300 basis
functions, but careful: the computation time scales as O(N nf) +
O(nf^3), where N is the number of samples, and very large matrices
can also have degraded accuracy.
- -s sort
- Specify how the outputs are sorted, where sort is one of
frequency/error/Q/decay/amplitude. (Only the first character of
sort matters.) All sorts are in ascending order. The default
is to sort by frequency.
- -e err
- Omit any modes with error (see above) greater than err
times the largest error among the computed modes. Defaults to no
limit.
- -E err
- Omit any modes with error (see above) greater than err.
Defaults to 0.1.
- -F
- Omit any modes with frequencies outside the specified range.
(Such modes are not necessarily spurious, however.)
- -a amp
- Omit any modes with amplitude (see above) less than amp
times the largest amplitude among the computed modes. Defaults to
no limit.
- -A amp
- Omit any modes with amplitude (see above) less than amp.
Defaults to no limit.
- -Q q
- Omit any modes with |Q| (see above) less than q.
Defaults to 10.
BUGS
Send bug reports to S. G. Johnson, stevenj@alum.mit.edu.
AUTHORS
Written by Steven G. Johnson. Copyright (c) 2005 by
the Massachusetts Institute of Technology.