4
4
5
5
from . import download
6
6
import pdb
7
+
8
+ MAX_I32 = 2147483647
9
+ MIN_I32 = - 2147483648
7
10
# WFDB dat formats - https://www.physionet.org/physiotools/wag/signal-5.htm
8
11
SIMPLE_FMTS = ['80' , '16' , '24' , '32' ]
9
12
SPECIAL_FMTS = ['212' , '310' , '311' ]
@@ -548,10 +551,13 @@ def calc_adc_params(self):
548
551
# Regular varied signal case.
549
552
else :
550
553
# The equation is: p = (d - b) / g
554
+
551
555
# Approximately, pmax maps to dmax, and pmin maps to
552
556
# dmin. Gradient will be equal to, or close to
553
557
# delta(d) / delta(p), since intercept baseline has
554
558
# to be an integer.
559
+
560
+ # Constraint: baseline must be between +/- 2**31
555
561
adc_gain = (dmax - dmin ) / (pmax - pmin )
556
562
baseline = dmin - adc_gain * pmin
557
563
# Make adjustments for baseline to be an integer
@@ -571,9 +577,18 @@ def calc_adc_params(self):
571
577
if dmin != baseline :
572
578
adc_gain = (dmin - baseline ) / pmin
573
579
574
- # Safety check for WFDB library limit.
575
- if abs (baseline )> 2147483648 :
576
- raise Exception ('baseline must have magnitude < 2147483648' )
580
+ # Remap signal if baseline exceeds boundaries.
581
+ # This may happen if pmax < 0
582
+ if baseline > MAX_I32 :
583
+ # pmin maps to dmin, baseline maps to 2**31 - 1
584
+ # pmax will map to a lower value than before
585
+ adc_gain = (MAX_I32 ) - dmin / abs (pmin )
586
+ baseline = MAX_I32
587
+ # This may happen if pmin > 0
588
+ elif baseline < MIN_I32 :
589
+ # pmax maps to dmax, baseline maps to -2**31 + 1
590
+ adc_gain = (dmax - MIN_I32 ) / pmax
591
+ baseline = MIN_I32
577
592
578
593
adc_gains .append (adc_gain )
579
594
baselines .append (baseline )
@@ -1232,13 +1247,16 @@ def checksigdims(sig, readlen, n_sig, samps_per_frame):
1232
1247
#------------------- /Reading Signals -------------------#
1233
1248
1234
1249
1235
- # Return min and max digital values for each format type. Accepts lists.
1250
+
1236
1251
def digi_bounds (fmt ):
1252
+ """
1253
+ Return min and max digital values for each format type.
1254
+ Accepts lists.
1255
+
1256
+ """
1237
1257
if isinstance (fmt , list ):
1238
1258
digibounds = []
1239
- for f in fmt :
1240
- digibounds .append (digi_bounds (f ))
1241
- return digibounds
1259
+ return [digi_bounds (f ) for f in fmt ]
1242
1260
1243
1261
if fmt == '80' :
1244
1262
return (- 128 , 127 )
@@ -1254,10 +1272,7 @@ def digi_bounds(fmt):
1254
1272
# Return nan value for the format type(s).
1255
1273
def digi_nan (fmt ):
1256
1274
if isinstance (fmt , list ):
1257
- diginans = []
1258
- for f in fmt :
1259
- diginans .append (digi_nan (f ))
1260
- return diginans
1275
+ return [digi_nan (f ) for f in fmt ]
1261
1276
1262
1277
if fmt == '80' :
1263
1278
return - 128
@@ -1333,7 +1348,6 @@ def est_res(signals):
1333
1348
return res
1334
1349
1335
1350
1336
-
1337
1351
def wfdbfmt (res , single_fmt = True ):
1338
1352
"""
1339
1353
Return the most suitable wfdb format(s) to use given signal
@@ -1396,7 +1410,6 @@ def fmt_res(fmt, max_res=False):
1396
1410
raise ValueError ('Invalid WFDB format.' )
1397
1411
1398
1412
1399
-
1400
1413
def np_dtype (res , discrete ):
1401
1414
"""
1402
1415
Given the resolution of a signal, return the minimum
0 commit comments