Skip to content

blur.py🔗

aimsprop.blur 🔗

Functions🔗

blur_property(bundle: Bundle, key: str, key2: str, R: ndarray, alpha: float) -> Bundle 🔗

Blur a property via Gaussian convolution (blurring applied in the "spatial" coordinate).

Pararms

the Bundle object to compute the property for (modified in

place)

key: the name of the original property key2: the name of the blurred property

the grid of property values to blur to (usually R or

theta or Q).

alpha: the Gaussian blurring exponent

Result/Return: bundle (Bundle): reference to the input Bundle object. The property key2 is set to the np.ndarray value of the blurred property.

Source code in aimsprop/blur.py
def blur_property(
    bundle: Bundle,
    key: str,
    key2: str,
    R: np.ndarray,
    alpha: float,
) -> Bundle:

    """Blur a property via Gaussian convolution (blurring applied in the "spatial" coordinate).

    Pararms:
        bundle: the Bundle object to compute the property for (modified in
            place)
        key: the name of the original property
        key2: the name of the blurred property
        R2: the grid of property values to blur to (usually R or
            theta or Q).
        alpha: the Gaussian blurring exponent
    Result/Return:
        bundle (Bundle): reference to the input Bundle object. The
            property key2 is set to the np.ndarray value of the blurred
            property.

    """

    for frame in bundle.frames:
        V = frame.properties[key]
        V2 = np.zeros_like(R)
        if np.array(V).ndim == 0:
            # Yak shave, I hates it!!
            V2 += np.sqrt(alpha / np.pi) * np.exp(-alpha * (R - V) ** 2)
        else:
            for RAB in V:
                V2 += np.sqrt(alpha / np.pi) * np.exp(-alpha * (R - RAB) ** 2)
        frame.properties[key2] = V2
    return bundle

compute_time_blur(I: ndarray, t1: ndarray, t2: ndarray, fwhm: float) -> ndarray 🔗

Compute Gaussian blurring in time for an arbitrary property.

Uses the trapezoid rule over provided t1 (t1/t2 need not be uniformly spaced).

Parameters:

Name Type Description Default
I ndarray

signal to Gaussian blur in the 0-th dim, shape (nt1, ...).

required
t1 ndarray

t1 values (can be irregular), shape (nt1,).

required
t2 ndarray

t2 values (can be irregular), shape (nt2,).

required
fwhm float

the full width at half maximum (FWHM) of the blurring kernel.

required

Returns:

Type Description
ndarray

I2 - Gaussian blurred signal, shape (nt2, ...).

Source code in aimsprop/blur.py
def compute_time_blur(
    I: np.ndarray,
    t1: np.ndarray,
    t2: np.ndarray,
    fwhm: float,
) -> np.ndarray:

    """Compute Gaussian blurring in time for an arbitrary property.

    Uses the trapezoid rule over provided t1 (t1/t2 need not be uniformly spaced).

    Params:
        I: signal to Gaussian blur in the 0-th dim, shape (nt1, ...).
        t1: t1 values (can be irregular), shape (nt1,).
        t2: t2 values (can be irregular), shape (nt2,).
        fwhm: the full width at half maximum (FWHM) of the blurring
            kernel.
    Returns:
        I2 - Gaussian blurred signal, shape (nt2, ...).
    """

    # Irregular trapezoid weights in t1
    dt = np.diff(t1)
    w = np.zeros_like(t1)
    w[:-1] += 0.5 * dt
    w[1:] += 0.5 * dt

    # Gaussian exponent corresponding to fwhm
    a = 4.0 * np.log(2.0) / (fwhm ** 2)

    # Blurring kernel
    tt1, tt2 = np.meshgrid(t1, t2, indexing="ij")
    K = (a / np.pi) ** (0.5) * np.exp(-a * (tt1 - tt2) ** 2)

    if I.ndim == 2:
        V = I * np.outer(w, np.ones((I.shape[1],)))
        I2 = np.dot(K, V)
    else:
        raise ValueError("ndim case %d not coded" % I.ndim)

    return I2