Module pyspecan.utils.pmf

Classes

class ComplexPMF (bins=100, scale=0.2)
Expand source code
class ComplexPMF(PMF):
    def __init__(self, bins=100, scale=0.2):
        super().__init__(bins, scale)
        self._val = self._val.astype(np.complex64)
        self._bin = self._bin.astype(np.complex64)

    def update(self, samples):
        if self.b_range is None:
            self.b_range = (
                np.min([np.min(samples.real), np.min(samples.imag)])*(1 + self._scale),
                np.max([np.max(samples.real), np.max(samples.imag)])*(1 + self._scale)
            )
        r_pmf, r_bins = np.histogram(samples.real, bins=self.num_bin, range=self.b_range, density=False)
        i_pmf, i_bins = np.histogram(samples.imag, bins=self.num_bin, range=self.b_range, density=False)

        self._val += r_pmf.astype(np.float32) + 1j*i_pmf.astype(np.float32)
        self.num += 1
        self._count += len(samples)

        bins = r_bins + 1j*i_bins
        if not np.any(bins == self._bin):
            self._bin[:] = bins

Ancestors

Methods

def update(self, samples)
Expand source code
def update(self, samples):
    if self.b_range is None:
        self.b_range = (
            np.min([np.min(samples.real), np.min(samples.imag)])*(1 + self._scale),
            np.max([np.max(samples.real), np.max(samples.imag)])*(1 + self._scale)
        )
    r_pmf, r_bins = np.histogram(samples.real, bins=self.num_bin, range=self.b_range, density=False)
    i_pmf, i_bins = np.histogram(samples.imag, bins=self.num_bin, range=self.b_range, density=False)

    self._val += r_pmf.astype(np.float32) + 1j*i_pmf.astype(np.float32)
    self.num += 1
    self._count += len(samples)

    bins = r_bins + 1j*i_bins
    if not np.any(bins == self._bin):
        self._bin[:] = bins
class PMF (bins=100, scale=0.2)
Expand source code
class PMF:
    def __init__(self, bins=100, scale=0.2):
        self.num_bin = bins
        self.num = 0
        self._count = 0
        self._scale = scale
        self.b_range = None

        self._val = np.zeros(bins)
        self._bin = np.zeros(bins+1)

    def update(self, samples):
        mag = np.abs(samples)
        if self.b_range is None:
            self.b_range = (
                np.min(mag)*(1 + self._scale),
                np.max(mag)*(1 + self._scale)
            )
        pmf, bins = np.histogram(mag, bins=self.num_bin, range=self.b_range)

        self._val += pmf
        self.num += 1
        self._count += len(samples)

        if not np.any(bins == self._bin):
            self._bin[:] = bins

    @property
    def mean(self):
        y = self.y
        mean = 0
        for i in range(0, self.num_bin):
            mean = mean + i * y[i]
        mean = mean / self._count
        return mean

    @property
    def var(self):
        y = self.y
        mean = self.mean
        var = 0
        for i in range(0, self.num_bin):
            var = var + y[i] * (i - mean)**2
        var = var / (self._count-1)
        return var

    @property
    def std(self):
        return np.sqrt(self.var)

    @property
    def x(self):
        return self._bin[:-1]

    @property
    def y(self):
        r_pmf = self._val.real / self.num
        i_pmf = self._val.imag / self.num

        return (r_pmf/np.max(r_pmf)) + 1j*(i_pmf/np.max(i_pmf))

    @property
    def x_lim(self):
        return (self.b_range[0], self.b_range[1]) # type: ignore

    @property
    def y_lim(self):
        return (0, 1)

Subclasses

Instance variables

prop mean
Expand source code
@property
def mean(self):
    y = self.y
    mean = 0
    for i in range(0, self.num_bin):
        mean = mean + i * y[i]
    mean = mean / self._count
    return mean
prop std
Expand source code
@property
def std(self):
    return np.sqrt(self.var)
prop var
Expand source code
@property
def var(self):
    y = self.y
    mean = self.mean
    var = 0
    for i in range(0, self.num_bin):
        var = var + y[i] * (i - mean)**2
    var = var / (self._count-1)
    return var
prop x
Expand source code
@property
def x(self):
    return self._bin[:-1]
prop x_lim
Expand source code
@property
def x_lim(self):
    return (self.b_range[0], self.b_range[1]) # type: ignore
prop y
Expand source code
@property
def y(self):
    r_pmf = self._val.real / self.num
    i_pmf = self._val.imag / self.num

    return (r_pmf/np.max(r_pmf)) + 1j*(i_pmf/np.max(i_pmf))
prop y_lim
Expand source code
@property
def y_lim(self):
    return (0, 1)

Methods

def update(self, samples)
Expand source code
def update(self, samples):
    mag = np.abs(samples)
    if self.b_range is None:
        self.b_range = (
            np.min(mag)*(1 + self._scale),
            np.max(mag)*(1 + self._scale)
        )
    pmf, bins = np.histogram(mag, bins=self.num_bin, range=self.b_range)

    self._val += pmf
    self.num += 1
    self._count += len(samples)

    if not np.any(bins == self._bin):
        self._bin[:] = bins