[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
In WFDB library versions 10.4.5 through 10.4.24, strtim("e")
did not
work properly when the open input record was an EDF file and high
resolution input mode had not been selected. This problem has been
corrected.
(WFDB library version 10.4.24 was identical to version 10.4.23.)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Several changes in ‘lib/signal.c’ eliminate unintended interactions that
occurred in previous versions between the input modes that can be
selected using setgvmode()
. The effects of these interactions were
first observed in newly written code; existing WFDB applications were
apparently unaffected.
On Cygwin/Windows, the WFDB library is now installed in both ‘/usr/bin’ and ‘/usr/lib’, to simplify building user applications that use the WFDB library and to simplify running compiled WFDB applications outside of the Cygwin environment.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When reading multifrequency records in WFDB_LOWRES mode, invalid
sample values occurring in signals that need to be decimated were not
always handled properly in WFDB library function getvec()
, resulting
in spurious artifacts during intervals that contained a mixture of
valid and invalid samples. This bug has been corrected; thanks to
Omar Abdala for a report that brought this problem to light.
A declaration for WFDB library function findsig()
has been added
to ‘wfdb.h’. Thanks to Thomas Heldt for reporting a warning that
resulted from its omission in previous versions.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Changes in ‘lib/Makefile.tpl’ were needed in order to pass configuration constants to the functions added to ‘lib/wfdbio.c’ in 10.4.20, but were omitted from that release; they have been included in this version.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Several new functions have been added to ‘lib/wfdbio.c’, to make configuration constants accessible at run time; these are needed by the WFDB Toolkit for Matlab.
(WFDB library version 10.4.19 was identical to version 10.4.18.)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The WFDB library no longer reports spurious checksum errors when reading EDF files, which don’t have checksums.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Internal WFDB library function wfdb_checkname
now allows hyphens
(-
) within record and annotator names.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
WFDB library function strtim
now rounds rather than truncating when
the sampling frequency is not an integer.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
WFDB library function mstimstr
now outputs time to the nearest
millisecond, rather than truncating its calculation to the next lowest number
of milliseconds.
A new WFDB library function, wfdbputprolog
, can write a prolog at the
beginning of a signal file. WFDB applications ignore embedded prologs.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
WFDB library function setwfdb()
now exports the WFDB library
environment variables (WFDB
, WFDBCAL
,
WFDBANNSORT,
and WFDBGVMODE
) on all modern platforms, so
that a process started by a WFDB application inherits the WFDB
environment of its parent. (This is not possible on platforms that do
not provide a working putenv()
function, such as MacOS 9 and
earlier, and 16-bit versions of MS-Windows.) Some previous versions
also included this capability, but the older implementation caused a
memory leak, and it was disabled in version 10.4.6. Thanks to Omar
Abdala and Dan Scott for reporting the problem and help in identifying
its cause.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A new WFDB library function, tnextvec()
, finds the next valid sample
from a chosen signal, occurring at or after a specified time. This
function is particularly useful when reading variable-layout
multi-segment records that may have lengthy gaps in signals of interest.
For portability, the WFDB library has always stored parameters such as
sampling frequency and gain as strings rather than as floating-point
numbers. Although the resultant loss of precision has been almost
always negligible, it has been observable in the specific case of
converting very large time intervals from sample intervals to seconds,
when the sampling frequency in Hz cannot be represented exactly in
binary (e.g., if the sampling frequency is once per minute, or 1/60
Hz). This situation cannot be wholly avoided, but it can be
minimized. Changes in this release, in setheader()
and in functions
that record time units in annotation files, increase the precision
with which non-integer parameters are recorded, so that loss of
precision as a result of converting them to and from strings should
almost never be observable.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The rule for sorting annotations within a file has been changed to allow a much
larger number of simultaneous annotations (i.e., annotations in a given
annotation file with identical time
fields) than was previously
possible. Since version 6.1, the WFDB library sorts simultaneous annotations
according to the value of their chan
fields, allowing for 256
simultaneous annotations at any given time. Beginning in version 10.4.12, the
library sorts simultaneous annotations according to their num
fields,
then sorts those with identical num
fields according to their
chan
fields, allowing up to 65,536 simultaneous annotations at any given
time.
A new WFDB library function, findsig
, returns the signal number of the
input signal matching its string argument, or -1 if no such input signal
exists. If the string argument could be interpreted as an input signal number,
it is taken as such; otherwise, the string argument must be an exact match to a
signal name (desc
field in the siginfo
structure).
Previous versions of WFDB library function setifreq
entered an infinite
loop if invoked (contrary to specifications) before opening an input record.
setifreq
now detects the error, emits an appropriate warning, and
returns.
If a WFDB application that uses WFDB library version 10.4.5 through 10.4.11
attempted to read an annotation file before reading the sampling frequency of
the associated record (for example, by invoking isigopen
or
sampfreq
), the annotation times might all appear to be zero. This may
occur when reading annotations created using WFDB 10.4.5 or later. The times
supplied when creating the file are correctly written but may be incorrectly
read in these cases. This problem was corrected in this release; thanks to
Thomas Heldt for reporting it and providing a reproducible example of it.
(WFDB library version 10.4.11 was identical to version 10.4.10.)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
EDF digital maximum and minimum values are now read properly in 64-bit
builds; previous versions had a bug in edfparse
(an internal WFDB
library function defined in ‘lib/signal.c’) that did not appear in
32-bit builds. Thanks to Joe Mietus for reporting the problem.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The WFDB library once again correctly interprets a hyphen (-
)
(used in place of a record name, annotator name, signal file name,
or calibration file name) as a reference to the standard input or
output, for platforms that support POSIX standard I/O (see section Using Standard I/O for Database Files).
This feature was broken in 10.4.5 as a side effect of changes
in wfdb_open
(an internal WFDB library function defined in
‘lib/wfdbio.c’).
(WFDB library version 10.4.8 was identical to version 10.4.7.)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Yinqi Zhang reported and contributed a fix for a memory leak in
make_vsd()
(an internal WFDB library function defined in
‘signal.c’).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The WFDB functions setafreq()
and getafreq()
(for
setting and getting the time resolution of newly-created output
annotation files in ticks per second) were new in version 10.4.5, but
were undocumented. They are now described in this Guide, and wrappers
for these functions are now included in ‘fortran/wfdbf.c’.
An important change in the WFDB library: memory allocation errors are
now treated as fatal by default (in previous versions, the functions
that encountered them returned error values that permitted the
application to handle them). These errors occur when there is
insufficient memory available to the WFDB library. To obtain the old
behavior, in which the calling function will continue execution if
possible after a memory allocation error, invoke wfdbmemerr(0)
.
By default, however, such an error will cause the process to
terminate. In either case, the WFDB library emits an appropriate
error message to aid in troubleshooting.
New macros for handling dynamically allocated memory are defined in
‘lib/wfdblib.h’ and used throughout the WFDB library, eliminating most
known memory leaks. Three known leaks remain (in setecgstr()
,
setannstr()
, and setanndesc()
); these are documented and
harmless in current applications. Thanks to Yinqi Zhang for reporting a leak
in copysi()
(an internal WFDB library function defined in
‘signal.c’), which prompted the cleanup.
WFDB functions strecg()
, setecgstr()
, strann()
,
setannstr()
, and setanndesc()
now handle NULL string inputs
properly. (Previous versions passed NULL strings to strcmp()
, with
undesirable results.)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Bob Farrell and Tony Ricke chased down and provided fixes for memory leaks in several WFDB library functions, and also provided revisions to permit additional type checking and to avoid type mismatch warnings.
Changes in the build system make it easier to build WFDB using Cygwin gcc (with or without the Cygwin POSIX library).
When creating annotation files, if the input sampling frequency differs
from the frame rate of the input record (either because of using
WFDB_HIGHRES
mode while reading a multifrequency record, or because
of having used setifreq()
to modify the sampling frequency), a comment
is written to the beginning of the annotation file indicating the
resolution of the annotation times in ticks per second (thus allowing
the application to store its annotations with whatever time resolution
is desired). When reading an annotation file, if such a resolution
comment is found, getann adjusts the times of annotations to match the
currently defined sampling frequency. The resolutions are kept
independently for each annotation file, so (for example) bxb
can
compare two annotation files written with different resolutions.
The ability to set the time resolution of annotation files has required
a minor change in the semantics of setifreq()
. It is now necessary
to invoke setifreq()
before creating an annotation file that will
have a resolution matching the (modified) input sampling frequency.
Since setifreq()
must be invoked after opening the input signals,
this implies that wfdbinit()
cannot be used to open both input signals
and output annotation files if setifreq()
is to be used; rather, the
sequence should be isigopen()
, setifreq()
, and finally
annopen()
.
If a string that includes a ‘.’ is supplied to a WFDB library function where a record name is expected, the WFDB library assumes that it is the name of a file located in the WFDB path. If the name ends in ‘.hea’, the file is assumed to be a WFDB-format header file, and its record name is assumed to be the first part of the string, exclusive of the ‘.hea'’.
This version also includes support for reading EDF files natively. If a string supplied as a record name contains a ‘.’ but does not end in ‘.hea’, it is assumed to be the record name of an EDF file of the same name.
(WFDB library versions 10.4.3 and 10.4.4 were identical to version 10.4.2.)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Mathias Gruber reported a line in wfdbio.c that used void pointer arithmetic (permitted as an extension by gcc but not allowed by ANSI/ISO C or most other C compilers). This operation has been replaced by ANSI/ISO C-conformant code.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
A bug caused incorrect output from WFDB library function strtim() when called with the argument "i", following use of setifreq() to change the effective sampling frequency, resulting in incorrect output from example 10 in the WFDB Programmer’s Guide. This has now been corrected.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Version 10.4.0 and later versions of the WFDB library are intended to be compiled using ANSI/ISO C (and C++) compilers only; previous versions also supported the use of traditional (K&R) C compilers. The most obvious change resulting from this decision is in the use of prototypes in function declarations, an innovation of ANSI C that permits better error-checking by compilers. The ANSI/ISO C standard is now more than 15 years old, and it has been over 10 years since a C compiler that does not support function prototypes was used for development of the WFDB library. Code in ‘wfdbio.c’ that provides limited support for compilers that do not provide an ANSI/ISO C library has been retained for now, and ‘wfdb.h’ still includes a set of K&R C function declarations; both of these features are deprecated, however, and may be removed in future versions of the WFDB library. Users who still need to use a K&R C compiler to compile the library itself may find ’unprotoize’ (included in the GNU gcc distribution) to be helpful.
The mapping of lowest expressible sample values to WFDB_INVALID_SAMPLE
performed by getframe()
(in ‘lib/signal.c’) did not work properly
for signal formats 80 and 160 (in which samples are recorded as unsigned
integers); this has now been corrected.
The symbol WFDB_GVPAD
is newly defined in ‘<wfdb/wfdb.h>’.
It may be added to WFDB_HIGHRES
or WFDB_LOWRES
and given
as input to setgvmode()
.
The effect of doing so is that missing samples, and samples recognized
as invalid, are replaced by getframe()
, getvec()
, and
sample()
with the most recently read valid values rather than by
the special value WFDB_INVALID_SAMPLE
.
This behavior allows applications such as digital filters to remain
ignorant of missing data without significant performance penalties.
sample()
now checks that its signal number input
is valid, and returns WFDB_INVALID_SAMPLE
if not. In previous
versions, sample
returned a sample from signal 0 if the requested
signal was unavailable.
sample_valid()
now returns -1 in the case of a signal that becomes
unavailable before the end of the record (previous versions returned 1 in this case).
The FIR filter example (see section Example 7: A General-Purpose FIR Filter) now works properly. The previous version always began processing the input at sample 0, regardless of start time specified in its argument list.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
PhysioNet (wfdb@physionet.org)