def calc_adc_params(self):
        """
        Compute appropriate adc_gain and baseline parameters for adc
        conversion, given the physical signal and the fmts.

        Returns
        -------
        adc_gains : list
            List of calculated `adc_gain` values for each channel.
        baselines : list
            List of calculated `baseline` values for each channel.

        Notes
        -----
        This is the mapping equation:
            `digital - baseline / adc_gain = physical`
            `physical * adc_gain + baseline = digital`

        The original WFDB library stores `baseline` as int32.
        Constrain abs(adc_gain) <= 2**31 == 2147483648

        This function does carefully deal with overflow for calculated
        int32 `baseline` values, but does not consider over/underflow
        for calculated float `adc_gain` values.

        """
        adc_gains = []
        baselines = []

        if np.where(np.isinf(self.p_signal))[0].size:
            raise ValueError('Signal contains inf. Cannot perform adc.')

        # min and max ignoring nans, unless whole channel is nan.
        # Should suppress warning message.
        minvals = np.nanmin(self.p_signal, axis=0)
        maxvals = np.nanmax(self.p_signal, axis=0)

        for ch in range(np.shape(self.p_signal)[1]):
            # Get the minimum and maximum (valid) storage values
            dmin, dmax = _digi_bounds(self.fmt[ch])
            # add 1 because the lowest value is used to store nans
            dmin = dmin + 1

            pmin = minvals[ch]
            pmax = maxvals[ch]

            # Figure out digital samples used to store physical samples

            # If the entire signal is nan, gain/baseline won't be used
            if pmin == np.nan:
                adc_gain = 1
                baseline = 1
            # If the signal is just one value, store one digital value.
            elif pmin == pmax:
                if pmin == 0:
                    adc_gain = 1
                    baseline = 1
                else:
                    # All digital values are +1 or -1. Keep adc_gain > 0
                    adc_gain = abs(1 / pmin)
                    baseline = 0
            # Regular varied signal case.
            else:
                # The equation is: p = (d - b) / g

                # Approximately, pmax maps to dmax, and pmin maps to
                # dmin. Gradient will be equal to, or close to
                # delta(d) / delta(p), since intercept baseline has
                # to be an integer.

                # Constraint: baseline must be between +/- 2**31
                adc_gain = (dmax-dmin) / (pmax-pmin)
                baseline = dmin - adc_gain*pmin

                # Make adjustments for baseline to be an integer
                # This up/down round logic of baseline is to ensure
                # there is no overshoot of dmax. Now pmax will map
                # to dmax or dmax-1 which is also fine.
                if pmin > 0:
                    baseline = int(np.ceil(baseline))
                else:
                    baseline = int(np.floor(baseline))

                # After baseline is set, adjust gain correspondingly.Set
                # the gain to map pmin to dmin, and p==0 to baseline.
                # In the case where pmin == 0 and dmin == baseline,
                # adc_gain is already correct. Avoid dividing by 0.
                if dmin != baseline:
                    adc_gain = (dmin - baseline) / pmin

            # Remap signal if baseline exceeds boundaries.
            # This may happen if pmax < 0
            if baseline > MAX_I32:
                # pmin maps to dmin, baseline maps to 2**31 - 1
                # pmax will map to a lower value than before
                adc_gain = (MAX_I32) - dmin / abs(pmin)
                baseline = MAX_I32
            # This may happen if pmin > 0
            elif baseline < MIN_I32:
                # pmax maps to dmax, baseline maps to -2**31 + 1
                adc_gain = (dmax - MIN_I32) / pmax
                baseline = MIN_I32

            adc_gains.append(adc_gain)
            baselines.append(baseline)

        return (adc_gains, baselines)
def calc_adc_params ( self ) : adc_gains = [ ] baselines = [ ] if np . where ( np . isinf ( self . p_signal ) ) [ 0 ] . size : raise ValueError ( 'Signal contains inf. Cannot perform adc.' ) minvals = np . nanmin ( self . p_signal , axis = 0 ) maxvals = np . nanmax ( self . p_signal , axis = 0 ) for ch in range ( np . shape ( self . p_signal ) [ 1 ] ) : dmin , dmax = _digi_bounds ( self . fmt [ ch ] ) dmin = dmin + 1 pmin = minvals [ ch ] pmax = maxvals [ ch ] if pmin == np . nan : adc_gain = 1 baseline = 1 elif pmin == pmax : if pmin == 0 : adc_gain = 1 baseline = 1 else : adc_gain = abs ( 1 / pmin ) baseline = 0 else : adc_gain = ( dmax - dmin ) / ( pmax - pmin ) baseline = dmin - adc_gain * pmin if pmin > 0 : baseline = int ( np . ceil ( baseline ) ) else : baseline = int ( np . floor ( baseline ) ) if dmin != baseline : adc_gain = ( dmin - baseline ) / pmin if baseline > MAX_I32 : adc_gain = ( MAX_I32 ) - dmin / abs ( pmin ) baseline = MAX_I32 elif baseline < MIN_I32 : adc_gain = ( dmax - MIN_I32 ) / pmax baseline = MIN_I32 adc_gains . append ( adc_gain ) baselines . append ( baseline ) return ( adc_gains , baselines )
Compute appropriate adc_gain and baseline parameters for adc
        conversion, given the physical signal and the fmts.

        Returns
        -------
        adc_gains : list
            List of calculated `adc_gain` values for each channel.
        baselines : list
            List of calculated `baseline` values for each channel.

        Notes
        -----
        This is the mapping equation:
            `digital - baseline / adc_gain = physical`
            `physical * adc_gain + baseline = digital`

        The original WFDB library stores `baseline` as int32.
        Constrain abs(adc_gain) <= 2**31 == 2147483648

        This function does carefully deal with overflow for calculated
        int32 `baseline` values, but does not consider over/underflow
        for calculated float `adc_gain` values.