diff --git a/dcs/frames/__init__.py b/dcs/frames/__init__.py
index f6aa703..3e1318c 100644
--- a/dcs/frames/__init__.py
+++ b/dcs/frames/__init__.py
@@ -9,12 +9,14 @@
 
 from .ch02_phasor import Ch02PhasorWindow
 from .ch02_fourier import Ch02FourierWindow
+from .ch03_ergodic import Ch03ErgodicWindow
 
 
 def get_windows() -> List[Type[base.Window]]:
     return [
         Ch02PhasorWindow,
         Ch02FourierWindow,
+        Ch03ErgodicWindow,
     ]
 
 
diff --git a/dcs/frames/ch03_ergodic.py b/dcs/frames/ch03_ergodic.py
new file mode 100644
index 0000000..8563c4b
--- /dev/null
+++ b/dcs/frames/ch03_ergodic.py
@@ -0,0 +1,177 @@
+#  SPDX-License-Identifier: MPL-2.0
+#    Copyright (c) 2022 Philipp Le <philipp@philipple.de>.
+#  This Source Code Form is subject to the terms of the Mozilla Public
+#  License, v. 2.0. If a copy of the MPL was not distributed with this
+#  file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+from __future__ import annotations
+
+from tkinter import ttk, Listbox, LEFT, BOTH
+from pydantic import confloat, conint
+from dcs.config import default_store, ConfigObject, ui_create, ConfigControlFrame
+import numpy as np
+from dcs.frames.base import BaseFrame, Window
+from dcs.frames.groups import Ch03Group
+from typing import List
+
+import matplotlib
+matplotlib.use('TkAgg')
+from matplotlib.figure import Figure
+from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
+
+
+@ui_create
+class Function(ConfigObject):
+    freq_mult: conint(ge=0, lt=3) = 0
+    amplitude: confloat(ge=0.0, lt=10.0, multiple_of=0.01) = 5.0
+    phase: confloat(ge=-180.0, le=180.0, multiple_of=0.1) = 0.0
+
+    offset: confloat(ge=-5.0, lt=5.0, multiple_of=0.01) = 0.0
+
+    sigma: confloat(ge=0, le=3.0, multiple_of=0.01) = 1.0
+
+    def make_config_widget(self, parent: ttk.Widget) -> ConfigControlFrame:
+        frm = ConfigControlFrame(parent, borderwidth=1, relief='raised')
+
+        ttk.Label(frm, text='Frequency:').grid(row=0, column=0)
+        self.ui_create_freq_mult(frm).grid(row=0, column=1)
+
+        ttk.Label(frm, text='Amplitude:').grid(row=1, column=0)
+        self.ui_create_amplitude(frm).grid(row=1, column=1)
+
+        ttk.Label(frm, text='Phase:').grid(row=2, column=0)
+        self.ui_create_phase(frm).grid(row=2, column=1)
+        ttk.Label(frm, text='°').grid(row=2, column=2)
+
+        ttk.Label(frm, text='Offset:').grid(row=3, column=0)
+        self.ui_create_offset(frm).grid(row=3, column=1)
+
+        ttk.Label(frm, text='Standard Deviation:').grid(row=4, column=0)
+        self.ui_create_sigma(frm).grid(row=4, column=1)
+
+        return frm
+
+    def calc_signal(self, t: np.ndarray | int = 0) -> np.ndarray:
+        phas = self.amplitude * np.exp(1j * self.phase * np.pi / 180)
+        phi = np.exp(1j * 2 * np.pi * self.freq_mult * t)
+        if type(t) == int:
+            ran_vec = np.random.normal(self.offset, self.sigma)
+        else:
+            ran_vec = np.random.normal(self.offset, self.sigma, len(t))
+        return (phas * phi) + ran_vec
+
+    def make_title(self):
+        return f'n={self.freq_mult}, {self.amplitude}, {self.phase}°, sigma={self.sigma}'
+
+
+class ConfigCh03ErgodicFrame(ConfigControlFrame):
+    wdg_seed: ttk.Spinbox
+    wdg_funcs: Listbox
+
+
+@ui_create
+class ConfigCh03Ergodic(ConfigObject):
+    _KEY = 'ch03_ergodic'
+
+    random_seed: conint(ge=0, lt=10000) = 1000
+    functions: List[Function] = [
+        Function(),
+        Function(),
+        Function(),
+        Function(),
+        Function(),
+        Function(),
+    ]
+
+    def make_config_widget(self, parent: ttk.Widget) -> ConfigControlFrame:
+        frm = ConfigCh03ErgodicFrame(parent, borderwidth=1, relief='raised')
+
+        frm1 = ttk.Frame(frm)
+        frm1.pack()
+
+        ttk.Label(frm1, text='Random Seed:').grid(row=0, column=0)
+        frm.wdg_seed = self.ui_create_random_seed(frm1)
+        frm.wdg_seed.grid(row=0, column=1)
+
+        ttk.Label(frm, text='Functions:').pack()
+        frm.wdg_funcs = self.ui_create_functions_list(frm, lambda e: e.make_title())
+        frm.wdg_funcs.pack()
+
+        return frm
+
+
+class Ch03ErgodicFrame(BaseFrame):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+
+        self._config: ConfigCh03Ergodic = default_store().get_config(ConfigCh03Ergodic)
+
+        ctrl_frm = self._create_control()
+        ctrl_frm.pack(side=LEFT)
+
+        signal_frm = self._create_signal_canvas()
+        signal_frm.pack(expand=True, fill=BOTH)
+
+    def _create_control(self) -> ConfigCh03ErgodicFrame:
+        frm: ConfigCh03ErgodicFrame = self._config.make_config_widget(self)
+        frm.wdg_seed.listen_change(self._on_change)
+        frm.wdg_funcs.listen_change(self._on_change)
+        return frm
+
+    def _on_change(self, _, __, ___):
+        default_store().save()
+        self.draw_signal()
+
+    def _create_signal_canvas(self) -> ttk.Widget:
+        frm = ttk.Frame(self)
+
+        self._signal_fig = Figure(figsize=(12, 6), dpi=100)
+
+        self._signal_canvas = FigureCanvasTkAgg(self._signal_fig, frm)
+        self._signal_canvas.get_tk_widget().pack(expand=True, fill=BOTH)
+
+        self.draw_signal()
+
+        return frm
+
+    def draw_signal(self):
+        LENGTH = 200
+
+        np.random.seed(self._config.random_seed)
+
+        self._signal_fig.clear()
+        ax = self._signal_fig.add_subplot(1, 1, 1)
+        ax.set_xlim(-1.2, 1.2)
+        ax.set_xlabel('time')
+        ax.set_ylabel('value')
+        ax.set_title('Signal')
+
+        t = np.linspace(-1.0, 1.0, LENGTH)
+
+        x = np.zeros((len(self._config.functions), LENGTH))
+        temp_mean = np.zeros((len(self._config.functions), ))
+        for index, func in enumerate(self._config.functions):
+            x[index, :] = func.calc_signal(t)
+            temp_mean[index] = np.mean(x[index, :])
+
+        stoch_mean = np.mean(x, axis=0)
+
+        for index, func in enumerate(self._config.functions):
+            ax.plot(t, x[index, :], label=f'{func.make_title()}', linestyle='solid', linewidth=1)
+            ones = np.ones(len(t))
+            ax.plot(t, ones*temp_mean[index], label=f'Temp. Mean {func.make_title()}', linestyle='solid', linewidth=2)
+        ax.plot(t, stoch_mean, label='Stochastic Mean', linestyle='solid', linewidth=3)
+        ax.legend()
+
+        self._signal_canvas.draw()
+
+
+class Ch03ErgodicWindow(Window):
+    GROUP = Ch03Group
+    TITLE = 'Ergodic Process'
+    FRAME = Ch03ErgodicFrame
+
+
+if __name__ == '__main__':
+    Ch03ErgodicWindow.main()
+
diff --git a/dcs/frames/groups.py b/dcs/frames/groups.py
index 4ad16f4..a7e2f4d 100644
--- a/dcs/frames/groups.py
+++ b/dcs/frames/groups.py
@@ -9,3 +9,7 @@
 
 class Ch02Group(Group):
     NAME = 'Chapter 02'
+
+
+class Ch03Group(Group):
+    NAME = 'Chapter 03'
