Composed ALSSM Windows (Weighting Window) [ex106.0]#

Each ALSSM cost term from lmlib.statespace.cost is weighted by its own window (or window weighting function). This example demonstrates the application of the basic exponentially decaying window of finite and infinte support. A more complex, symmetric windows (cf. lmlib.statespace.cost.Segment) is generated by composing multiple exponential windows.

See also: lmlib.statespace.model.Segment.windows(),

(Composed) Window localized at index $k=500$
import numpy as np
import matplotlib.pyplot as plt
import lmlib as lm

K = 1000 # signal length
ks = [500] # (arbitrary) window location
k = range(K)

segment_left_infinite = lm.Segment(a=-np.inf, b=-40, direction=lm.FORWARD, g=100, delta=-40) # left decaying window
segment_left_finite = lm.Segment(a=-39, b=-1, direction=lm.FORWARD, g=1e6, delta=0) # (nearly) rectangular windwow
segment_right_finite = lm.Segment(a=0, b=39, direction=lm.BACKWARD, g=1e6, delta=0) # (nearly) rectangular window
segment_right_infinite = lm.Segment(a=40, b=np.inf, direction=lm.BACKWARD, g=100, delta=40) # right decying window

cost = lm.CompositeCost((lm.AlssmPoly(3),),
                        [segment_left_infinite, segment_left_finite, segment_right_finite, segment_right_infinite],
                        F=[[1, 1, 1, 1]])


# Generating Windows - for illustrative and plotting purpose only
display_thd = 0.1 # Defines the minmium window weight (threshold) that is displayed as a non-zero value.
                   # (only relevant for exponentially decaying windows with infinite support, since they never exactly reach 0 and, thus, displaying becomes cumbersome)
wins = lm.map_windows(cost.windows([0, 1, 2, 3]), ks, K, merge_ks=True, merge_seg=False) # display with window thresholding

wins_all_no_thd = lm.map_windows(cost.windows([0, 1, 2, 3], display_thd), ks, K, merge_ks=True, merge_seg=True) # display without window thresholding
wins_all = lm.map_windows(cost.windows([0, 1, 2, 3]), ks, K, merge_ks=True, merge_seg=True) # display without window thresholding

# plot
plt.figure(figsize=(6,2))
for p, win in enumerate(wins):
    line = plt.plot(k, win, '-', lw=0.3, label=f'Segment {p}')
    plt.fill_between(k, win, color=line[0].get_color(), alpha=0.3)
plt.plot(k, wins_all, '--k', lw=1.0, label=f'Overall window \n with threshold')
plt.plot(k, wins_all_no_thd, '-k', lw=1.0, label=f'Overall window \n without threshold')

plt.axhline(display_thd, lw=0.6, c='k', ls='--', label='')
plt.xlabel('time index $k$')
plt.ylabel('window weight(s)')
plt.title(f'(Composed) Window localized at index $k={ks[0]}$')
plt.legend(loc=1, fontsize=8)
plt.show()

Total running time of the script: ( 0 minutes 0.044 seconds)

Gallery generated by Sphinx-Gallery