# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# +
# %pylab inline

import ipywidgets


# -

# ## Сигналы
#
# Существует много определений "сигнала" в разных областях, но нам это не так важно. Поэтому будем считать, что сигнал -- это описание того, как один параметр зависит от другого параметра [[<NAME>]](http://www.dspguide.com/ch2/1.htm). Наиболее распространенным типом сигнала в аналоговой электронике является напряжение, которое изменяется со временем. Также, например, сейсмические колебания или аудио сигнал.
#
# Нас будут интересовать **аудио сигналы**, поэтому стоит немного понимать физику этого объекта. Если коротко — это волнообразные сгущения и разрежения воздуха или другой среды. А как высокоуровнево происходит запись звука? Обычно мы подключаем микрофон и с его помощью записываем что-то в компьютер. Итак, у нас есть звук, представляющий собой колебания давления воздуха. Звук попадает в микрофон, который является входным преобразователем и преобразует колебания давления воздуха в колебания электрического напряжения.
#
# По способу задания сигналы можно разделить на два типа:
# * **Детерминированные сигналы**. Они задаются с помощью какой то аналитической функции.
# * **Случайные сигналы**. Это в основном про случайные процессы и не на этом курсе :)
#
# Детерминированные сигналы можно разделить на **периодическими** и **непериодическими**. Непериодические сигналы, как правило, ограничены во времени.
# Периодический сигнал - это сигнал, который повторяется во времени с определенным периодом $T$, то есть для которого выполняется условие:
#
# $$
# f(t) = f(t + kT), \: k \in \mathbb{Z}, T \in \mathbb{R}
# $$
#
# Например, рассмотрим гармоническое колебание, описываемое следующим образом:
# $$
#     f(t) = A \cos\Big(\frac{2\pi \cdot t}{T} + \phi \Big)
# $$
# где $A$ амлитуда, $T$ период, а $\phi$ фаза сигнала.
#
# Посмотрим на гармоническое колебание более подробно, так как это является важной штукой, для преобразования Фурье.

# + code_folding=[0, 5]
@ipywidgets.widgets.interact_manual(
    A=(0, 5.),
    T=(pi / 2, 4 * pi),
    phi=(-pi, pi)
)
def harmonic_motion(A=1, T=2 * pi, phi=0):
    t = linspace(0, 6 * pi, 1000)
    s = A * cos((2 * pi * t) / T + phi)
    _, ax = plt.subplots(1, 1, figsize=(10, 3))
    ax.plot(t, s)
    ax.set_xlabel('Time')
    ax.set_ylabel('Amplitude')
    ax.grid()


# -

# Все сигналы можно разделить на четыре группы:
# * Аналоговые
# * Дискретные
# * Квантованные
# * Цифровые
#
# **Аналоговый сигнал** - это любой непрерывный сигнал. Практически все физические процессы описываются непрерывными функциями времени, поэтому представляют собой аналоговые сигналы. Для аналогового сигнала область значений и определения описывается непрерывным множеством.
#
# **Дискретный сигнал** -- это дискретизованный с интревалов $\Delta$ аналоговый сигнал. Дискретизация аналогового сигнала состоит в том, что сигнал представляется в виде последовательности значений (samples), взятых в дискретные моменты времени $t_i$ c шагом $\Delta$.
#
# **Квантованный сигнал** -- это сигнал чьи значения квантованы. Квантование сигнала заключается в том, что область значений сигнала разбивается на $N$ уровней с шагом $\Delta$ и для каждого отсчета выбирается уровень, который ему соответсвует. Стоит отметить, что уровень можно закодировать бинарным словом длинны $\log N$
#
# **Цифровой сигнал** -- это сигнал, к которому применили дискетизацию, а потом квантование. Но порядок на самом деле не важен.

# + code_folding=[0, 7, 13]
@ipywidgets.widgets.interact_manual(
    A=(0, 5.),
    T=(pi / 2, 4 * pi),
    phi=(-pi, pi),
    delta=(0, 50),
    N=(2, 50),
)
def signal_types(
    A=1,
    T=2 * pi,
    phi=0,
    delta=5,
    N=5,
):
    t = linspace(0, 6 * pi, 1000)
    s = A * cos((2 * pi * t) / T + phi)
            
    _, axes = plt.subplots(2, 2, figsize=(10 * 2, 8))
    axes = axes.flatten()
    axes[0].plot(t, s)
    axes[0].set_title('Analog signal')
    
    axes[1].set_title('Discrete signal')
    axes[1].stem(t[::delta], s[::delta], use_line_collection=True)
    
    def quantize(s):
        levels = linspace(-A, A, N)
        quantized = levels[((s.reshape(-1, 1) - levels) ** 2).argmin(axis=-1)]
        return quantized
        
    axes[2].set_title('Quantized signal')
    axes[2].plot(t, quantize(s))
    
    axes[3].set_title('Digital signal')
    axes[3].stem(t[::delta], quantize(s[::delta]), use_line_collection=True)
    
    for i, ax in enumerate(axes):
        ax.grid()
# -

# Устройства, осуществляющие дискретизацию по времени и квантование по уровню, называются аналого-цифровыми преобразователями (АЦП). Устройства, переводящие цифровой сигнал в аналоговый называются цифро-аналоговыми преобразователями (ЦАП).



StarcoderdataJupyterScriptsDedupFiltered