import time
import math
import random
import lightningchart as lc
lc.set_license('my-license-key')
random.seed(0)
NUM_CHANNELS = 5
SAMPLE_RATE_HZ = 100
WINDOW_SECONDS = 30
CHANNEL_NAMES = [f'CH{i+1}' for i in range(NUM_CHANNELS)]
chart = lc.ChartXY(theme=lc.Themes.Light, title='EEG data monitoring (synthetic)')
chart.get_default_y_axis().dispose()
series_list = []
for i, name in enumerate(CHANNEL_NAMES):
axis_y = chart.add_y_axis(stack_index=i)
axis_y.set_title(title=name)
series = chart.add_line_series(
y_axis=axis_y,
schema={
'x': {'pattern': 'progressive'},
'y': {'pattern': None},
}
)
series.set_name(name)
series_list.append(series)
chart.get_default_x_axis() \
.set_title('Time (s)') \
.set_scroll_strategy('scrolling') \
.set_interval(-WINDOW_SECONDS, 0, stop_axis_after=False)
chart.open(live=True)
base_freqs = [0.2 + 0.1*i for i in range(NUM_CHANNELS)]
drifts = [0.02 * (i+1) for i in range(NUM_CHANNELS)]
phases = [random.uniform(0, 2*math.pi) for _ in range(NUM_CHANNELS)]
noise_amp = 0.2
t0 = time.perf_counter()
dt = 1.0 / SAMPLE_RATE_HZ
while True:
t = time.perf_counter() - t0
x = t - WINDOW_SECONDS
for i, series in enumerate(series_list):
y = math.sin(2 * math.pi * base_freqs[i] * t + phases[i])
y += 0.5 * math.sin(2 * math.pi * (base_freqs[i]*2.3) * t + phases[i]/2)
y += drifts[i] * math.sin(2 * math.pi * 0.01 * t)
y += random.uniform(-noise_amp, noise_amp)
series.add(x, y)
time.sleep(dt)