-
Notifications
You must be signed in to change notification settings - Fork 22
/
NEWS
1808 lines (1455 loc) · 85.1 KB
/
NEWS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
10.7.0 (10 June 2022):
The WFDB library now supports storing signals in compressed form, using
the FLAC (Free Lossless Audio Codec) algorithm. Compressed signal
files are designated by the the format code 508, 516, or 524 (depending
on the signal resolution.) In order to read and write signals in these
formats, the FLAC library and header files must be installed when
compiling the WFDB Software Package.
In calibration files, a signal may be listed as "*", which is a
"wildcard" entry that will match any signal description.
There is no longer a limit on the number of characters per line in a
header, calibration, or info file.
'wfdbdesc', 'wfdbmap', and 'heaxml' will correctly handle signal files
where the length cannot be determined.
When reading a multi-frequency record in low-resolution mode, sample
values are rounded to the nearest integer (rather than being truncated
towards zero.)
The WFDB library and applications can now handle multi-segment records
that are more than 2,147,483,647 sample intervals in length, even on
systems where a long integer is 32 bits.
In high-resolution mode, sampfreq() will return the highest sampling
frequency of any signal in the given record.
The osigfopen(), annopen(), setinfo(), and newcal() functions allow the
caller to detect I/O errors when writing an output file.
The getframe() function will handle skewed signals in variable-layout
records, skewed signals with multiple signal files, skewed signals with
signal file prologs, and multi-segment records with signal file
prologs. The wfdbgetskew() and wfdbsetiskew() functions will work
correctly.
URLs in the WFDB path may use colons to designate port numbers, IPv6
addresses, or passwords.
The sample() function will work when reading samples in random order.
The SALLOC(), SUALLOC(), SREALLOC(), and SSTRCPY() macros will check
for overflows and will avoid evaluating their arguments multiple times.
The Fortran wrapper functions in fortran/wfdbf.c will avoid buffer
overflows, and have improved support for native Fortran strings.
10.6.2 (8 March 2019):
Minor bugs have been fixed in the command-line option handling of
'gqfuse' and 'gqpost', so these programs will behave as documented.
Changes to the internal functions get_ann_table() and put_ann_table()
ensure sensible and consistent behavior if a custom annotation type is
defined (using setannstr()) but no description is provided (using
setanndesc()).
Changes in isgsettime() and isgsetframe() avoid incorrect behavior if
the specified time value is large enough to cause integer overflow.
It is now possible to run the package test suite without network
access, by setting the environment variable WFDB_NO_NET_CHECK to 1
before running 'make check'.
10.6.1 (28 November 2018):
'fir', 'mfilt', 'nst', 'snip', 'mit2wav', 'wfdb2mat', and 'xform' have
been updated to work correctly with multi-frequency input records.
(With the exception of xform in '-M' mode, these applications always
produce uniform-frequency output; in the case of multi-frequency input,
all signals will be resampled to either the highest or lowest sampling
frequency.)
'gqrs', 'sqrs', 'sqrs125', 'stepdet', and 'wabp', when invoked in
high-resolution mode, will now write an annotation time resolution
comment, so that other applications can correctly interpret their
output. 'nguess', 'gqfuse', and 'gqpost' will correctly handle
high-resolution input annotations, and produce high-resolution output
annotations in that case.
'rdann' will correctly display the elapsed or absolute time for
annotations in an EDF record. This worked correctly in versions
10.5.24 and earlier, but in version 10.6.0, the time values displayed
were incorrect.
The WFDB library will correctly handle HTTP redirection responses. The
library has also been optimized in various ways to reduce the amount of
unnecessary network traffic.
The internal function edfparse() will correctly calculate the ADC
resolution (digital sample range) of EDF signals, and will correctly
interpret EDF files that have an "unknown number of data records".
Numerous bugs have been corrected in the library functions isigopen(),
getframe(), and isgsettime(), which could cause applications to crash
or produce incorrect results when reading an incorrectly-formatted
record, or a record where some files are missing.
sample() now returns WFDB_INVALID_SAMPLE if the requested sample is not
in the buffer and cannot be read. In previous versions of the library,
sample() would call exit(), forcing the program to exit immediately.
On Mac OS X, multi-architecture binaries are no longer produced by
default. They can be enabled, if desired, by passing the argument
'--enable-arch=i386,x86_64' to configure.
10.6.0 (26 January 2018):
A wide variety of bugs have been fixed in the WFDB library, and several
new features have been added. See the WFDB Programmer's Guide for
details. In particular, the library returns more accurate results when
reading a multi-segment record or an EDF file; many WFDB applications
may produce different output as a result.
The WFDB library now supports reading variable-layout, multi-frequency
records, provided that each signal's sampling frequency is constant
across the entire record.
'sortann' and 'mrgann' preserve the original time resolution of their
input files, and 'rdann' displays the elapsed time with higher
precision, if possible.
'wfdb2mat' uses the "version 5" format instead of "version 4". It
displays the correct instructions for computing physical values, in the
case of an 8-bit data file.
'mrgann' correctly interprets the argument to the first '-mX' option, if
any.
'xform' correctly computes the lower limit of the output ADC range.
This will result in different output if the '-c' option is used and the
signals are clipped.
'psfd' and 'pschart' correctly handle custom annotation mnemonics that
include parentheses or backslashes.
WAVE sets the X resource 'OpenWindows.SelectDisplaysMenu' to 'true' by
default, so that the left mouse button will do what users normally
expect it to do. If you prefer the traditional XView behavior, you can
set this to 'false' in your .Xdefaults or .Xresources.
WAVE permits viewing records at finer time scales, up to 500 mm/ms.
In some circumstances, when jumping to the beginning of a record in
WAVE, the signals would mysteriously disappear. This was most apparent
with very short records; it has now been fixed.
Some systems (particulary those based on systemd) allow programs to open
a larger range of file descriptors than what the C select() function
accepts. This causes older versions of the XView library to crash.
WAVE now works around this bug.
Changes in 'configure' and the various '.def' files make it simpler to
cross-compile WFDB using the GNU toolchain. Further improvements to the
makefiles permit parallel compilation (when using the -j option of GNU
make) and permit installation into a temporary staging directory (using
the DESTDIR variable.)
The 'install-wave32' script has been updated to work on current versions
of Fedora and Scientific Linux.
Now that all of PhysioNet is accessible using secure HTTPS, the
'pnwlogin' script has been updated to use HTTPS for all remote file
access (PhysioBank as well as PhysioNetWorks.)
10.5.24 (28 May 2015):
A security flaw was found in the 'pnwlogin' script used to access
PhysioNetWorks projects, owing to a combination of bugs in WFDB and
libcurl. Previous versions of the WFDB library would unconditionally
set the username and password for every HTTP or HTTPS request, which
caused them to be sent over the network unencrypted. This bug has now
been fixed; note, however, that the old version of 'pnwlogin' is now
blocked at the server side, and the new version of 'pnwlogin' is (by
design) incompatible with older, insecure versions of the WFDB library.
In order to use 'pnwlogin', be sure that you are using the latest
version of the library (both 32-bit and 64-bit, if necessary.)
On most platforms, the WFDB library will now be installed in
/usr/local/lib by default, or /usr/local/lib32 if you are building a
32-bit library on an x86_64 system. You can specify the --libdir option
to 'configure' to change the installation directory if you wish.
The 'wfdb-config' program used by external packages to compile and link
programs with the WFDB library was broken in version 10.5.23, in that if
libcurl was used, it would output the string "`curl-config --libs`",
rather than actually invoking curl-config. This has now been fixed for
the case of a static WFDB library. In the case of a dynamic WFDB
library, the curl flags were unnecessary in the first place, so they are
now omitted.
On MinGW, error messages will now be printed to standard error, rather
than being displayed in a popup message box.
When using libcurl, the environment variable CURL_CA_BUNDLE can be set
to the name of a file containing the trusted root certificate
authorities. (Note that this does not currently work with the 'winssl'
version of libcurl, which uses the system certificate database instead.)
If the environment variable WFDB_NET_DEBUG is set, detailed information
about HTTP transfers will be printed to standard error.
10.5.23 (13 March 2014):
Changes in 'configure', 'Makefile.tpl', 'conf/linux.def', and
'conf/linux-slib.def' simplify installation of shared WFDB libraries
and the applications that use them on Linux platforms.
Two new applications are included in this release. 'stepdet'
(app/stepdet.c), detects and annotates transitions in (possibly noisy)
two-level signals. 'parsescp' (convert/parsescp.c) converts some types
of SCP-ECG files to PhysioNet-compatible format.
The parser in 'wrsamp' has been rewritten in this release to accept a
wider range of non-standard CSV input formats.
The application that converts PhysioBank-compatible records to EDF
files, 'convert/mit2edf', did not properly calculate the range of
signals if the ADC resolution was specified to be 0 in the input .hea
file. In this release, 'mit2edf' guesses the ADC resolution based on
the storage format if necessary, allowing it to produce correct EDF
output given this type of incorrect input in most cases.
Another application, 'parsescp', has been added to the set of data
importers in 'convert/'.
Luca Citi contributed a bug fix and a new feature to 'convert/rdedfann'.
Previous versions did not properly handle input in which the last
annotation in a frame ends with a \024 byte in an even position. The
new '-x' option causes the input EDF+ annotation text to be copied to
the 'aux' position in the output, rather than the 'anntyp' position
(the default).
10.5.22 (8 December 2013):
'snip' has a new '-O' option to select the output format, and the '-l'
option to specify the duration now works properly.
wfdb2mat (convert/wfdb2mat.c) now ensures that all output signals have
non-empty units strings (previous versions did not check for this
possibility when the input was an EDF or EDF+ file).
10.5.21 (21 November 2013):
This release is the first to pass all tests performed by 'make check'
when compiled on MS-Windows using MinGW. Changes in 'configure',
'conf/mingw.def', 'conf/mingw-slib.def', 'lib/wfdbio.c',
'app/ecgeval.c', 'app/psfd.c', 'checkpkg/appcheck', and several of the
test output references in 'checkpkg/expected/', as well as a new script
('checkpkg/dosify'), made this possible.
In previous releases, WFDB library function strtim() did not always
handle bracketed string inputs properly. Thanks to Benjamin Moody,
who reported the problem and provided a patch to fix it. Prompted
by this fix, the deprecated atoi(), atof(), and atol() functions
have been replaced throughout the WFDB library by strtol() and
strtod().
rdedfann (convert/rdedfann.c) now accepts a -F option to specify
the implied sampling frequency for the output it generates
from input that contains EDF annotations only.
WAVE no longer fails when started with the option -VS 2 (to display
valid signals only). Thanks to Benjamin Moody for reporting the
misbehavior and providing a patch. Benjamin also provided a working
set of instructions for compiling WAVE as a 32-bit application on
64-bit Debian Wheezy or Ubuntu 12.04; see 'install-wave32'.
10.5.20 (2 September 2013):
Absolute pathnames are not tested in wfdb_open() unless the WFDB
path contains an empty component.
10.5.19 (21 July 2013):
This release includes fixes in lib/signal.c for several bugs that
sometimes caused findsig(), getvec(), and sample() to return incorrect
values when reading variable-layout multi-segment records with missing
signals.
10.5.18 (16 February 2013):
wfdb_addtopath() now works properly if the path contained only one
component on entry.
10.5.17 (2 January 2013):
A small change in the 'configure' script works around a problem
in building WFDB applications on recent versions of Debian and
Ubuntu GNU/Linux. The solution was first described in conf/linux.def
(version 10.3.17, August 2005, and in all later versions) but it was
not implemented by default since it was not needed at the time, and
because it complicated the process of building 32-bit applications on
64-bit platforms.
In previous releases, wfdb2mat did not correctly report the time of the
beginning of its output unless the conversion started at the beginning
of its input. This problem has been fixed in this release; thanks to
Mayela Zamora for reporting the problem.
The WFDB library internal function wfdb_addtopath() (in lib/wfdbio.c)
adds the path component of its string argument (i.e., everything except
the file name itself) to the WFDB path, inserting it there if it is not
already in the path. This function is called by another WFDB library
internal function, wfdb_open(), which finds and opens files for all
other WFDB library functions that open files; wfdb_open() passes the
paths of files it successfully opens to wfdb_addtopath(), permitting
other files in the same locations to be found. In previous releases,
wfdb_addtopath() appended the new path component to the end of the WFDB
path. As originally noted by David Brooks, this is suboptimal since
the files comprising a given record are most often kept in the same
directory. In this release, the new component is inserted at the head
of the path, or as the second path component if "." (the current
directory) is the first component, thus improving the likelihood that
subsequent files to be opened will be found in the first or second
location wfdb_open() checks.
10.5.16 (27 September 2012):
A bug in WFDB library versions 10.5.13 through 10.5.15 resulted in
an attempt to close an already-closed header file after invoking
putinfo(). Thanks to Benjamin Moody for identifying the bug and
contributing code to correct it (in lib/signal.c and lib/wfdbinit.c).
10.5.15 (25 September 2012):
A new application (app/gqfuse.c) for combining two or more beat
annotation files is included in this release.
Changes to the internal function readheader() in WFDB library version
10.5.14 made the library unable to open EDF files. This bug has been
fixed.
10.5.14 (13 August 2012):
WFDB applications can now read shared and private PhysioNetWorks
projects securely, just as they have been able to read PhysioBank
data since version 10.0.1 (November 1999). A new shell script
(app/pnwlogin) simplifies access to PhysioNetWorks projects. Low-level
functions wfdb_open (in lib/wfdbio.c) and readheader (in lib/signal.c)
incorporate changes to implement this new capability, as well as
another new feature that allows record names to be specified using
absolute pathnames or URLs. As always, a final '.hea' is not
considered to be part of a record name, but it may be included or
omitted as desired.
WFDB library function wfdbquit() no longer frees resources allocated
by libcurl or libwww, in order to avoid doing so more than once in
programs that use wfdbquit() to reset state before opening a new record.
Updates to app/sampfreq, app/sumann, and convert/ahaecg2mit provide
new features. See the WFDB Applications Guide for details.
10.5.13 (13 May 2012):
A flexible high-sensitivity QRS detector for research (app/gqrs.c), and
a companion post-processor (app/gqpost.c) for improving its positive
predictivity with minimal loss of sensitivity, are included in this
release. The algorithms employed in these applications are previously
unpublished.
Versions of the WFDB library up to 10.5.10 ignored embedded empty lines
within the 'info' sections of '.hea' files, but versions 10.5.10 and
10.5.11 treat them as markers of the end of the 'info' section. This
version restores the previous treatment of embedded empty lines. Thanks
to Justin Leo Cheang Loong for reporting this issue.
10.5.12 (24 April 2012):
When called with a NULL argument, getinfo() sometimes behaves
differently in WFDB library version 10.5.11 than it does in previous
versions. This release restores the previous behavior. Thanks to
Benjamin Moody for reporting this issue.
10.5.11 (6 April 2012):
This release of the WFDB library introduces support for '.info' files.
These are files containing 'info' strings in the same format as those
that can be stored in '.hea' files. The '.info' file for a record
named 'record' is named 'record.info', and it may be located anywhere
in the WFDB path. Function getinfo(), as in previous releases, returns
the first info string belonging to the record named as its argument, or
the next info string belonging to the previously specified record if
its argument is NULL. Beginning with this release, successive calls to
getinfo() return the next info string contained in the record's '.info'
file if it exists, and if there are no more in the record's '.hea'
file. Function putinfo() writes an info string to the currently open
output '.hea' file, unless function setinfo() (new in this release) has
been invoked, in which case the info string is appended to the record's
'.info' file in the current directory. getinfo() reads all of the
record's info strings the first time it is invoked, returning them one
at a time; wfdb_freeinfo() frees the memory allocated for getinfo()'s
info strings and closes the '.info' file opened by putinfo(), if any.
After invoking wfdb_freeinfo(), a subsequent call to getinfo() reads
the info strings again (or those of a different record, if a new record
has been opened).
A new application, app/hrstats.c, collects and summarizes heart rate
statistics based on the contents of an annotation file.
Virginia Faro-Maza identified and corrected a bug in WFDB library
function iannsettime() (in lib/annot.c) that caused some annotations
to be missed when two or more annotation files are open simultaneously.
WFDB library function isigopen(), in lib/signal.c, was reverted to that
of version 10.5.9.
Benjamin Moody contributed patches for app/snip.c to ensure that the
output will be written using a format that can accommodate the sample
range.
The signal calibration file, data/wfdbcal, has been updated with
new definitions.
10.5.10 (15 November 2011):
The WFDB library function isigopen(), in lib/signal.c, searches each
component of the WFDB path for the signal file(s) named in the
associated header file, until a match is found. Since signal files are
usually located in the same directories as header files, they can be
located most quickly by looking first in those directories. Thanks to
David Brooks for suggesting this optimization and for a sample
implementation.
Attempts to set the default size for HTTP range requests (using the
environment variable WFDB_PAGESIZE) were ignored in previous versions
of the WFDB library when compiled with libcurl. Thanks again to David
for noting this limitation, which has been eliminated in this release
by a change in www_init() (in lib/wfdbio.c).
'wfdbmap', which has been available in its own directory since release
10.5.6, is a now a standard application (app/wfdbmap.c). 'wfdbmap' is
used by the PhysioBank ATM to produce compact synoptic maps of WFDB-
compatible records. Previous versions of 'wfdbmap' were unable to map
multi-segment records unless all segment headers were local; this
limitation has been removed in this release.
This release also includes 'wfdbsignals' (app/wfdbsignals.c), used by
the PhysioBank ATM to list the signals in a WFDB record. 'wfdbsignals'
is a stripped-down version of 'wfdbdesc'.
10.5.9 (10 September 2011):
When an application passes an array containing WFDB_INVALID_SAMPLE
values to putvec(), the function translates these into the
corresponding invalid-sample sentinel values used by the file format.
(This is the inverse of the transformation done by getvec() and
getframe(), so the effect is that at the application level, invalid
samples are always represented by the value WFDB_INVALID_SAMPLE.)
Previous versions of the library did not perform this transformation
correctly for formats 80 and 160 (they used a value of zero rather than
-128 or -32768, respectively.) This bug was mainly an issue for
programs such as 'snip' and 'xform' that read and modify existing data
files.
In multi-segment mode, 'snip' will attempt to copy the segment
structure of the input record. In older versions, this was done by
parsing the master and layout headers by hand; this version uses the
library function getseginfo() instead, which should be more robust.
This version also fixes a bug that would cause snip to crash or produce
garbage output if asked to read past the end of a multi-segment record.
Thanks to Benjamin Moody for identifying these problems and providing
patches to remedy them.
10.5.8 (11 March 2011):
Previous versions of the WFDB library did not behave properly if
setbasetime() was invoked before setsampfreq(). Also, when dealing
with time-of-day strings, previous versions of mstimstr() and strtim()
round the base time to a number of samples since midnight, and do not
work correctly if the number of samples per day is not an integer.
Benjamin Moody contributed patches to lib/signal.c that remedy these
deficiencies. The patches include three new internal functions
(fstrtim(), ftimstr(), and fmstimstr()) which are equivalent to the
WFDB library functions strtim(), timstr(), and mstimstr(), but take a
second argument specifying the sampling frequency. These internal
functions are used by setbasetime() and setheader() to record the base
time with millisecond precision, independent of the actual sampling
frequency, and independent of the effects of setifreq(), if any.
Moreover, mstimstr() returns a string representation of the base time
plus the given number of sampling intervals, mstimstr(0) returns the
exact base time, and strtim() returns the sample number that is closest
to the given time. In addition to being more precise, both functions
now work correctly even if the number of samples per day is not an
integer. Applications using this version of the WFDB library may call
setbasetime() and setsampfreq() in either order.
'configure' now detects XView (if installed) on Ubuntu, so that 'wave'
can be built automatically by 'make install' on 32-bit Ubuntu.
10.5.7 (12 December 2010):
When opening records with the same name in different directories
successively within a single process, the persistence of WFDB path
changes made by WFDB library function wfdb_addtopath interfered with
locating the correct files in the second and subsequent records.
The solution included addition of a new WFDB library function,
resetwfdb, which restores the WFDB path to the value returned by
the first invocation of getwfdb in the current process (or NULL if
getwfdb has not been invoked); library function wfdbquit now invokes
resetwfdb. In addition, the safe-string copy macro SSTRCPY (defined
in wfdb.h) now properly handles the case of copying null pointers.
Thanks to Benjamin Moody for identifying the problem, providing test
inputs, and contributions to the solution.
The -H option of app/sampfreq.c did not work in recent releases because
of changes in the WFDB library; it works again in 10.5.7.
10.5.6 (29 November 2010):
WFDB records with names of the form 'nnn/nnn' can now be identified
using the short form 'nnn/' in applications built using the WFDB library
(e.g., 'rdsamp -r mimicdb/037/' and 'rdsamp -r mimicdb/037/037' are now
equivalent).
In <wfdb.h>, the maximum lengths of record names, units strings, and
signal description ('.desc') strings have been increased (to 50, 50,
and 100 characters respectively). In lib/wfdbio.c, the maximum length
of a WFDB file name (including path information) has been increased to
1024 characters.
When given an input record with a name containing path information,
previous versions of wfdb2mat preserved the path information in the
output '.hea' file, which made it difficult to use (although the '.mat'
output file was not affected). The current version strips the unneeded
path information.
The previous version of wrsamp did not work if signal numbers were
specified, and the input did not include column headers. Thanks to
Jesus Maria Rodriguez Presedo for reporting this problem. Also,
the previous version of wrsamp did not copy initial samples represented
in E notation (e.g. 1.23e+02). Both of these bugs are corrected in
this release.
If signals with a non-zero baseline were scaled using previous versions
of xform, baseline shifts were possible in the output. This problem
has been corrected in this release.
This release includes wfdbmap, an application that can be used
together with other open-source software to create synoptic maps of
WFDB-compatible records, in the format of those presented by the
PhysioBank ATM. 'wfdbmap' is not compiled by default; see
wfdbmap/README for additional information.
10.5.5 (6 October 2010):
WFDB-compatible signals can now be converted to a simple XML format
using rdsamp's new '-X' option, and XML files in this format can be
converted to WFDB-compatible format using wrsamp (which recognizes
this format automatically, requiring no special option). A document
type description of this format, and of XML formats for annotation
and header files, is available at
http://physionet.org/physiobank/database/XML/wfdb.dtd
This file, together with a set of applications (annxml, heaxml, xmlann,
and xmlhea) that convert WFDB-compatible annotation and header files
to and from these XML formats, are included in the 'xml' subdirectory
of this package.
Since version 10.4.14, app/sortann has not properly sorted annotations
containing non-zero 'chan' or 'num' fields. This bug has now been
fixed; thanks to Jesus Maria Rodriguez Presedo for reporting it and
for providing a test case.
Changes in conf/darwin.def and conf/darwin-slib.def allow creation
of multi-architecture (i386, x86_64, and ppc) binaries on Mac OS X.
Virginia Faro-Maza pointed out that sumstats did not derive aggregate
shutdown statistics described in ANSI/AAMI EC57, and that bxb did not
preserve the raw data needed to derive these statistics. Both bxb.c
and sumstats.c have been revised in this release to remedy these
omissions.
An uninitialized flag may have made ahaecg2mit behave as if its -s
option was always given, and an informational message contained
a formatting error; both problems have been corrected, thanks to
a report from Isaac Henry.
Errors in the formatting of a variety of error and warning messages
have been corrected in app/ecgeval.c, app/psfd.c, app/rdsamp.c,
app/snip.c, app/sumstats.c, app/wrann.c, convert/mit2edf.c,
convert/mit2wav.c, convert/wfdb2mat.c, and psd/lomb.c.
10.5.4 (13 July 2010):
Function getseginfo() has been introduced in WFDB library version
10.5.4, to allow applications to obtain information about the
segments belonging to the current (multi-segment) input record.
In previous versions, integer arithmetic overflow was possible when
converting format 32 samples using aduphys(), if the difference between
the baseline value and the sample to be converted exceeded the range of
signed 32-bit integers. Although rdsamp does not use aduphys(),
similar code in rdsamp also exhibited this problem, which has now
been corrected; thanks to Ikaro Silva for reporting it and providing a
test case.
A wrsamp bug introduced in version 10.4.25 caused it to fail in
some cases if no columns were specified. This has been corrected;
thanks to Tony Cacere for reporting this problem together with a
test case.
WAVE version 6.11, included in this release of the WFDB software
package, allows the user to change display scales using keyboard
commands. This allows one to resize signals independently, a frequently
requested feature. For details, see "How can I enlarge or reduce the
size of individual signals?" in the WAVE FAQ (in WAVE, click on Help
and select "Frequently asked questions").
10.5.3 (22 June 2010):
Function getgvmode() has been introduced in WFDB library version
10.5.3, to allow querying the current operating mode of getvec().
A local variable (_L in lib/signal.c, introduced in 10.5.0) had
a name collision on Solaris with a predefined constant, so it has
been renamed as _lw. A comment in each of the *.def files in conf,
now corrected, erroneously referred to LN, rather than LL.
Tony Ricke reported that test builds (./configure; make) of recent
versions of the WFDB package fail on Cygwin. This problem has been
corrected (in conf/cygwin-slib.def) in 10.5.3.
Tony also pointed out that current versions of the EC38 and EC57
standards no longer exclude episodes of atrial flutter from
evaluations of the positive predictivity of an atrial fibrillation
detector, as in previous versions of EC38. The WFDB application
epicmp has been revised accordingly, so that atrial flutter episodes
are included in these evaluations unless the -x option is given
(to conform with EC38:1998 and earlier).
10.5.2 (18 April 2010):
When reading annotations of multifrequency records opened in
high-resolution mode, a time shift was introduced by getann() in
WFDB library versions 10.4.5 to 10.5.1. This problem has been
corrected in 10.5.2.
Certain malformed segment .hea files were able to cause null pointer
errors in WFDB library function isigopen. This problem has been
corrected. Thanks to Mauro Villarroel for reporting this problem
together with a test case.
The -s option of WFDB applications sqrs, sqrs125, wqrs, and wabp now
works properly. A bug common to all four applications was introduced
in 10.4.12; thanks to Andras Hartmann for reporting it.
WFDB application epicmp did not always match each reference measurement
with the test measurement that was nearest in time, in previous
versions. The effect of this error in normal use (smoothed measurements
recorded in each test beat annotation) would have been very small.
Thanks to Liu Man for reporting this problem and suggesting a solution.
WFDB application xform produced incorrect output when a gain change was
required and the -M option was used. This error has been corrected;
thanks to Joe Mietus for providing a test case that led to discovery of
the problem.
10.5.1 (19 March 2010):
In version 10.5.0, signals in formats 80 and 160 with amplitudes of 0
were incorrectly treated as invalid by getframe() and getvec(). Thanks
to Isaac Henry for reporting this problem, which has been corrected in
signal.c.
10.5.0 (16 March 2010):
The WFDB library now supports signals with 24 and 32 bits of precision,
using new formats 24 and 32, and WFDB applications 'wrsamp' and 'xform'
support user selection of 24- and 32-bit formats for output signal
files. 'wfdb2mat' automatically selects 32-bit .mat format when
exporting records that include format 24 or 32 signals. WFDB
applications can now read BDF and BDF+ files (24-bit EDF and EDF+
variants).
Note that these formats, unlike all previously supported formats,
require more than 16 bits per sample value. If the WFDB software is
compiled on a 16-bit platform (unusual except for embedded processors),
the excess high bits of signals in these formats are not read on input,
and they are replaced by zeroes on output, unless the WFDB_Sample data
type has been redefined as 'long' (in wfdb.h). This is not done by
default since it would increase memory and computational requirements
unnecessarily in embedded applications that do not require 24- or
32-bit precision.
Since support for extended precision samples cannot be introduced
without this limitation in backward compatibility for 16-bit platforms,
the minor version number of the WFDB library has been incremented to 5.
Most users will not be affected by this change, however, apart from the
new functionality it provides.
Memory allocation macros that have been defined previously in wfdblib.h
have been moved to wfdb.h so they are accessible to WFDB applications,
including user-written applications. See the WFDB Programmer's Guide
for information about using these macros (MEMERR, SFREE, SUALLOC,
SALLOC, SREALLOC, and SSTRCPY).
A buffer overflow in the WFDB library's internal function edfparse()
(in lib/signal.c) has been corrected, thanks to a bug report and patch
from Joonas Paalasmaa.
In previous versions of 'rdsamp', the '-pe' and '-Pe' options did not
force output of elapsed times if the selected record had a defined
starting time. These options now work correctly in such cases.
Some combinations of options caused the version of 'wrsamp' included
in version 10.4.25 to fail; this has now been corrected.
WAVE's Find window now provides a means to search for the next valid
sample of a specified signal.
10.4.25 (21 January 2010):
WFDB application 'rdsamp' can now write CSV (comma-separated value)
format output using its new '-c' option, and 'wrsamp' can read CSV
format input. If no input columns are specified, 'wrsamp' converts
all of them. If the input contains signal names, units, or timestamps,
'wrsamp' saves them in the header file it creates. 'wrsamp' also has
two new options ('-O', to select the output format, and '-z', to
suppress output of column 0).
WFDB application 'sigamp' has new options for printing individual
measurements.
The script 'install-wave32', used to build and install a 32-bit version
of WAVE on some 64-bit platforms, has been updated so that it can be
used on Fedora 12 (as well as on previously supported platforms).
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.
10.4.24 (28 October 2009):
A possible string overflow in nst.c has been corrected. Thanks to
Virginia Faro-Maza for finding and reporting this problem.
Recent versions of the Xorg (X11 Window System) server freeze when
applications that use XView (such as WAVE) 'grab' the mouse pointer.
Thanks to Michael Buro, who supplied a run-time workaround for this
problem that can be used with any XView application to disable pointer
grabs. Pointer grabs are now permanently disabled in WAVE.
10.4.23 (7 August 2009):
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.
In some cases, previous versions of WFDB application 'rxr' entered
an infinite loop and did not produce any output if one of the annotation
files being compared ended during an episode of atrial fibrillation.
Thanks to Mathias Gruber, who reported the problem and provided a test
case that made it possible to find and fix this bug.
WFDB application 'wrann' now handles input files containing annotation
mnemonics that it does not recognize by writing the corresponding
annotations as comment annotations, with the unrecognized mnemonics
inserted at the beginning of the 'aux' fields in the output annotations.
(Previous versions of 'wrann' discarded any such input annotations.)
WFDB application 'rdedfann' now preserves the full time resolution of
annotations it extracts from EDF+ input files, and it replaces any
whitespace in those annotations with underscores (_). Coupled with
the changes in wrann described above, it is now possible to use these
two applications to create a WFDB-compatible annotation file from the
annotations in an EDF+ file without manual intervention.
10.4.22 (28 July 2009):
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.
Omar also found and corrected a bug in app/wabp.c that resulted in
premature termination of processing some variable-layout multisegment
records, and improved the autoselection of a default ABP signal.
An uninitialized variable in convert/mit2wav.c caused problems in
previous versions; thanks to Greg Downs for the bug report and fix.
WFDB application 'wrann' from the previous two versions truncated
'aux' strings containing embedded whitespace; this has been corrected.
Thanks to Mauro Villarroel for the bug report.
10.4.21 (14 May 2009):
Changes in lib/Makefile.tpl were needed in order to pass configuration
constants to the functions added to wfdbio.c in 10.4.20, but were
omitted from that release; they have been included in this version.
Several changes in WAVE, including an option (accessible from the View
panel) to display valid signals only, have been designed to provide
more convenient access to variable-layout records such as those in the
MIMIC II Waveform Database.
10.4.20 (4 May 2009):
WFDB application 'snip' can now create excerpts of multi-segment
records that preserve the segmentation of the original records.
WFDB application 'wrann' now determines output annotation times using
the first column of input, if the first column appears to contain
absolute times rather than elapsed times; otherwise, it uses the sample
numbers in the second column, as in previous versions.
WFDB application 'rdsamp' now handles long units strings more cleanly.
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-config.c has been rewritten to
use several of these functions, and has been moved from lib to app.
10.4.19 (26 March 2009):
pschart and psfd now handle signal names in their command-line argument
lists (following the '-s' option).
The version of wfdb2mat included in this release generates a .mat file
of the expected size even if the input ends prematurely. Thanks to
Weixiang Liu for a report that prompted this revision.
10.4.18 (15 March 2009):
The WFDB library no longer reports spurious checksum errors when reading
EDF files, which don't have checksums.
WFDB application wfdb2mat now correctly handles EDF input records, so
it is now possible to use it to convert EDF to .mat format directly.
10.4.17 (5 March 2009):
Internal WFDB library function wfdb_checkname() now allows hyphens
(-) within record and annotator names.
WFDB applications xform and wfdb2mat now properly handle variable-layout
multisegment input records.
10.4.16 (3 March 2009):
WFDB library function strtim() now rounds rather than truncating when
the sampling frequency is not an integer.
WFDB application wrann is now (slightly) less fussy about its input
and no longer requires the tab character preceding an aux string to
occur in a specific column as did earlier versions.
Bug fixes in convert/wfdb2mat.
10.4.15 (26 February 2009):
WFDB library function mstimstr() now outputs time to the nearest
millisecond, rather than truncating its calculation to the nearest
lower 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.
A new WFDB application, convert/wfdb2mat, can convert all or part of
a WFDB-compatible signal file into a Matlab-compatible .mat file that
remains readable by WFDB applications.
10.4.14 (23 February 2009):
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.
A new WFDB application, wfdbtime, is convenient for use in scripts to
convert among absolute and elapsed times and times in sample intervals.
10.4.13 (16 February 2009):
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.
Several options have been added to rdsamp, which can now print the
time of each sample in a variey of formats, and can use the new
tnextvec() function (see above) to search for valid samples of a
signal of interest.
10.4.12 (20 January 2009):
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).
WFDB applications calsig, pschart, psfd, rdsamp, sqrs,
sqrs125, wabp, wqrs, and xform now accept signal names in any
context in which an input signal number can be given.
The install-wave32 script now installs 32-bit libgcc and Open Look
glyph fonts if they are missing, as by default in Fedora 10.
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.
10.4.11 (11 November 2008):
Build process improvements, especially on Cygwin and MinGW targets.
10.4.10 (31 October 2008):
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. A similar bug was also corrected in convert/edf2mit.
Thanks to Joe Mietus for reporting the problem.
Using a block size that is not a power of 2 with the "-n" and "-N"
options of "fft" now works properly (although powers of 2 are still
recommended for best results). Thanks again to Joe Mietus for
reporting the problem and valuable assistance in correcting it.
The "-f" option now works properly in ann2rr (previous versions
worked only if "-t" was also provided).
10.4.9 (10 October 2008):
The "configure" script is now non-interactive by default. A new
"-i" option selects interactive mode.
The new "install-wave32" script simplifies installation of WAVE on
64-bit Linux.
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
5.2, "Using Standard I/O for Database Files", in the WFDB Programmer's
Guide. 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).
10.4.8 (31 July 2008):
New application convert/ahaecg2mit.c converts files from the AHA DB
DVD into WFDB records. (ECRI, distributors of the AHA DB, recently
began shipping it on DVDs in a format incompatible with its previous
formats.)
Applications wrsamp and xform use rand() and srand() rather than the
POSIX rand48() and srand48() to generate dither (the POSIX functions
are not universally available).
10.4.7 (15 July 2008):
Yinqi Zhang reported and contributed a fix for a memory leak in
make_vsd() (an internal WFDB library function defined in signal.c).
Application nguess has new -m option that allows varying the
threshold for inserting inferred sinus beat labels in its output.
Applications wrsamp and xform can now add dithering to their
inputs using a new -d option.
10.4.6 (9 April 2008):
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 the WFDB Programmer's 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