def aliases_figure(f0, fs): t = np.linspace(0, 1, 50*fs) y = np.sin(f0 * 2*np.pi * t) sig = Signal(t, y) alias_sig = Signal(t, y) fig = sig.get_fig(size=(1080,300),title="Aliases of {} Hz signal".format(f0)) alias_sig.update_line_opts({'line_color' : 'orange', 'line_alpha': 1}) alias_sig.create_line_renderer(fig) alias_x = np.linspace(0, 1, fs, endpoint=False) alias_y = np.sin(f0 * 2*np.pi * alias_x) alias_points = ColumnDataSource({ 'x' : alias_x, 'y' : alias_y, 'y0': np.zeros(alias_x.size) }) fig.circle(x='x', y='y', source=alias_points, fill_color='red', line_width=3, line_color='red') fig.segment(x0='x', x1='x', y0='y0', y1='y', source=alias_points,line_width=3, line_color='red') handle = show(fig, notebook_handle=True) def frame_gen(fv): return {'y': np.sin(fv*2*np.pi*t)} anim_sets = [] for k in range(1, 6): f_previous = f0 + (k-1)*fs f_alias = f0 + k*fs frame_values = np.linspace(f_previous, f_alias, 60) anim = FrameAnimation(alias_sig.data_source(), frame_gen, frame_values) anim_sets.append(AnimationSet([anim])) anim_sets.append(AnimationSet([Pause(1)])) AnimateSets(anim_sets, handle).run()
def scale_time(title='Time scaling', size=(400, 400), animated=False): frames = 50 scale = 2*np.pi m = max(1, scale) + 0.5 t = np.linspace(-m*2, m*2, 256) y = np.sin(2 * np.pi * t) sig1 = Signal(t, y) sig1.remove_view('spans') fig = sig1.get_fig(title=title, size=size, scale='2pi') marker_source = ColumnDataSource({'x':[1, 1], 'y': [0, 1]}) marker_ref = fig.line(x=[1,1], y=[0,1], line_width=2, line_color='purple', line_dash='dashed') marker = fig.line(x='x', y='y', source=marker_source, line_width=2, line_color='purple') label = Label(x=1, y=1, text='1 second marker', render_mode='css') fig.add_layout(label) handle = show(fig, notebook_handle=True) if animated: def gen_marker_frame(frame_value): return {'x': [frame_value, frame_value]} def gen_sig_frame(frame_value): return {'x': t * frame_value} frame_values = np.linspace(1, scale, frames) a1 = FrameAnimation(marker_source, gen_marker_frame, frame_values) a2 = FrameAnimation(sig1.data_source(), gen_sig_frame, frame_values) aset = AnimationSet([a1, a2]) AnimateSets([aset], handle, fps=25).run() else: ones = np.asarray([1, 1]) def update(scale=1): marker_update = { 'x' : ones * scale } signal_update = { 'x' : t * scale } marker_source.data.update(marker_update) sig1.update(signal_update) push_notebook(handle=handle) interact(update, scale=(-1*np.pi, 2*np.pi))