def thirteen_task():
    gs = gr.GridSpec(2, 1)
    wav = wav_values()
    plt.subplot(gs[0, :])
    plot(wav, desc='Запись')
    plt.subplot(gs[1, :])
    ft_wav = fourier_transform(wav, len(wav))
    plot(ft_wav, desc='Фурье записи')
    plt.show()
def min_image_statistics_output(picture):
    # дисперсию, рседнее значение, минимум, максимум
    min = picture.min()
    max = picture.max()
    std = picture.std()
    # print(f"Min: {min}, Max: {max}, Std: {std}")
    rows = picture.shape[0]
    row_average = np.zeros(rows)
    row_variance = np.zeros(rows)
    for i in range(rows):
        row_average[i] = picture[i].mean()
        row_variance[i] = picture[i].var()
    # построчный вывод
    gs = gr.GridSpec(2, 2)
    plt.subplot(gs[0, 0])
    plot(row_variance, desc='Дисперсия по строкам')
    plt.subplot(gs[0, 1])
    plot(row_average, desc='Среднее по строкам')
    # вывод по столбцам
    columns = picture.shape[1]
    column_average = np.zeros(columns)
    column_variance = np.zeros(columns)
    for i in range(columns):
        column_average[i] = picture[:, i].mean()
        column_variance[i] = picture[:, i].var()
    plt.subplot(gs[1, 0])
    plot(column_variance, desc='Дисперсия по столбцам')
    plt.subplot(gs[1, 1])
    plot(column_average, desc='Среднее по столбцам')
    plt.show()
def fifth_task(n):
    tmp = np.zeros(100)
    for i in range(0, 100):
        tmp[i] = correlation(normalize(numpy_random(n), 1),
                             normalize(numpy_random(n), 1), i)
    plt.subplot(211)
    plot(tmp, desc='Взаимная корреляционная ф-ция')
    tmp = np.zeros(1000)
    for i in range(0, 1000):
        a = normalize(numpy_random(n), 1)
        tmp[i] = correlation(a, a, i)
    harm = harmonic_motion(x, 100, 3, 0.002)
    plt.subplot(212)
    plot(harm, desc='Гармонический процесс')
    plt.show()
def eight_task(x):
    harm = harmonic_motion(x, 100, 37, 0.002)
    xk = np.zeros(len(harm))
    plt.subplot(221)
    plot(shift(harm, 100), desc='Shift')
    plt.subplot(222)
    plot(reverse_shift(harm), desc='Anti-shift')
    plt.subplot(223)
    plot(peaks(0.01, 5, xk), desc='Peaks for zero function')
    plt.subplot(224)
    plot(remove_peaks(xk), desc='Remove peaks for zero function')
    plt.show()
def seventh_task(x, n):
    harmonic_autocorrelation = np.zeros(n)
    linear_autocorrelation = np.zeros(n)
    exponential_autocorrelation = np.zeros(n)
    harm = harmonic_motion(x, 100, 37, 0.002)
    for i in range(n):
        harmonic_autocorrelation[i] = correlation(harm, harm, i)
        linear_autocorrelation[i] = correlation(linear(1.3, x, 10000),
                                                linear(1.3, x, 10000), i)
        exponential_autocorrelation[i] = correlation(expon(0.0016, x),
                                                     expon(0.0016, x), i)
    plt.subplot(211)
    plot(harmonic_autocorrelation,
         desc='Автокорреляция гармонического процесса')
    plt.subplot(212)
    distribution(harm, desc='Плотность вероятности гармонического процесса')
    plt.show()
    ft = fourier_transform(shift(my_random(n), 0), n)
    plt.subplot(211)
    plot(ft[1], desc='Преобразование Фурье для случайного набора')
    ift = inverse_fourier_transform(ft[0], N)
    plt.subplot(212)
    plot(ift, desc='Обратное преобразование Фурье для случайного набора')
    # нет зависимостей от количества пиков
    plt.show()
    # бесокнечный набор синусов и косинусов даст 1.
    plt.subplot(221)
    distribution(linear(1.3, x, 10000),
                 desc='Плотность вероятности линейной ф-ции')
    plt.subplot(222)
    distribution(expon(0.0016, x),
                 desc='Плотность вероятности экспоненциальной ф-ции')
    plt.subplot(223)
    plot(linear_autocorrelation, desc='Автокорреляция линейной ф-ции')
    plt.subplot(224)
    plot(exponential_autocorrelation,
         desc='Автокорреляция экспоненциальной ф-ции')
    plt.show()
def sixth_task(x, n):
    gs = gr.GridSpec(2, 2)
    harm = harmonic_motion(x, 100, 3, 0.002)
    plt.subplot(gs[0, :])
    plot(harm,
         desc='Гармонический процесс, 37 Гц')  # 3, 37, 137, 237, 337 [Гц]
    ft = fourier_transform(harm, n)
    plt.subplot(gs[1, 1])
    plot([xx * 0.5 for xx in range(0,
                                   len(ft[1]) // 2)],
         ft[1][:len(ft[1]) // 2],
         desc='Преобразование Фурье')
    ift = inverse_fourier_transform(ft[0], n)
    plt.subplot(gs[1, 0])
    plot(ift, desc='Обратное преобразование Фурье')
    plt.show()

    #данные из файла dat
    xarr = dat_values()
    xt = np.zeros(n)
    f1 = sin(15, 3)
    f2 = sin(100, 37)
    f3 = sin(25, 137)
    for (i, t) in zip(range(n), xarr):
        xt[i] = f1(t) + f2(t) + f3(t)
    plot(xt, desc='Полигармонический процесс')
    plt.show()
    ft = fourier_transform(xarr, n)
    harm = harmonic_motion(xarr, 100, 37, 0.002)
    plot(harm, desc='Процесс на основе данных .dat файла'
         )  # 3, 37, 137, 237, 337 [Гц]
    plt.show()
    plt.subplot(211)
    # ft = fourier_transform(xarr, n)
    plot([xx * 0.5 for xx in range(0,
                                   len(ft[1]) // 2)],
         ft[1][:len(ft[1]) // 2],
         desc='Преобразование Фурье')
    plt.subplot(212)
    ift = inverse_fourier_transform(ft[0], N)
    plot([xx * 0.5 for xx in range(0,
                                   len(ift) // 2)],
         ift[:len(ift) // 2],
         desc='Обратное преобразование Фурье')
    plt.show()
def course_work():
    gs = gr.GridSpec(1, 2)
    mod = modulation(m=1)
    plt.subplot(gs[0, 0])
    plot(normalize(signal(), 2), desc='Исходный сигнал')
    plt.subplot(gs[0, 1])
    plot(normalize(carrying_oscillation(), 2), desc='Несущая')
    plt.show()
    gs = gr.GridSpec(2, 2)
    plt.subplot(gs[0, 0])
    plot(normalize(mod, 2), desc='Модуляция при m=0.5')
    plt.subplot(gs[0, 1])
    plot(normalize(modulation(m=0.1), 2), desc='модуляция при m=0.1')
    plt.subplot(gs[1, 0])
    plot(normalize(modulation(m=0.99), 2), desc='модуляция при m=0.99')
    plt.subplot(gs[1, 1])
    plot(normalize(modulation(m=1.5), 2), desc='модуляция при m=1.5')
    plt.show()
    gs = gr.GridSpec(2, 3)
    plt.subplot(gs[0, 0])
    plot(normalize(mod, 2), desc='Модуляция при m=1')
    plt.subplot(gs[0, 1])
    noise_large_modul = mod + rnd(-200, 200)
    noise_modul = mod + rnd(-50, 50)
    plot(normalize(noise_large_modul, 2), desc='Сигнал с сильными шумами')
    plt.subplot(gs[0, 2])
    plot(normalize(noise_modul, 2), desc='Сигнал с более слабыми шумами')
    ft_mod_sig = fourier_transform(mod, len(mod))
    ft_mod_sm_noise_sig = fourier_transform(noise_modul, len(noise_modul))
    ft_mod_noise_sig = fourier_transform(noise_large_modul,
                                         len(noise_large_modul))
    plt.subplot(gs[1, 0])
    plot(normalize(ft_mod_sig[1], 2), desc='Спектр')
    plt.subplot(gs[1, 1])
    plot(normalize(ft_mod_noise_sig[1], 2), desc='Спектр с шумами')
    plt.subplot(gs[1, 2])
    plot(normalize(ft_mod_sm_noise_sig[1], 2), desc='Спектр с шумами')
    plt.show()
    # фильтрация
    lpF = low_pass_filter()
    hpF = high_pass_filter()
    bpF = band_pass_filter(10, 50)
    bsF = band_stop_filter(10, 50)
    lpF = LPF(50, 0.002)
    hpF = HPF(20, 0.002)
    lpF_conv = convolution(noise_modul, lpF)
    hpF_conv = convolution(lpF_conv, hpF)
    ft_lpF_harm = fourier_transform(noise_modul, len(noise_modul))
    ft_hpF_harm = fourier_transform(hpF_conv, len(hpF_conv))
    gs = gr.GridSpec(2, 2)
    plt.subplot(gs[0, 0])
    plot(normalize(lpF_conv[:len(lpF_conv) // 2], 2), desc='ФНЧ')
    plt.subplot(gs[0, 1])
    plot(normalize(hpF_conv[:len(hpF_conv) // 2], 2), desc='ФВЧ')
    plt.subplot(gs[1, 0])
    plot(normalize(ft_lpF_harm[1], 2), desc='Частотная хар-ка ФНЧ')
    plt.subplot(gs[1, 1])
    plot(normalize(ft_hpF_harm[1], 2), desc='Частотная хар-ка ФВЧ')
    plt.show()
    # сдвиги
    gs = gr.GridSpec(1, 2)
    plt.subplot(gs[0, 0])
    plot(normalize(mod, 2), desc='Модуляция')
    plt.subplot(gs[0, 1])
    plot(shift(mod, 500), desc='Сдвиг')
    plt.show()
    gs = gr.GridSpec(1, 2)
    plt.subplot(gs[0, 0])
    plot(mod, desc='Модуляция')
    plt.subplot(gs[0, 1])
    plot(reverse_shift(shift(mod, 500)), desc='Анти-сдвиг')
    plt.show()
    #спайки
    plot(normalize(mod, 2), desc='Модуляция')
    p = peaks(0.1, 5, np.zeros(1000))
    plot(p, desc='Спайки')
    plt.show()
    plot(mod, desc='Модуляция')
    plot(remove_peaks(p), desc='Анти-спайки')
    plt.show()
def third_task(x, rand):
    plot(shift(normalize(numpy_random(len(x)), 1), 1), desc='Shift for random')
    plot(shift(normalize(my_random(len(x)), 1), 1),
         desc='Shift for self random')
    plot(peaks(0.001, 5, np.zeros(len(x))), desc='Peaks for zero function')
    stationarity(rand, 10, 0.05)
def twelve_task(dt=0.002, m=128, fcut=15):
    gs = gr.GridSpec(2, 4)  #(2, 4)
    _sum_harm = harmonic_motion(1000, a=10, f=5, t=0.001) + harmonic_motion(1000, a=10, f=50, t=0.001) + \
                harmonic_motion(1000, a=10, f=150, t=0.001)
    lpF = low_pass_filter(fcut=fcut)
    hpF = high_pass_filter(fcut=fcut)
    bpF = band_pass_filter(10, 30)
    bsF = band_stop_filter(10, 30)
    lpF_conv = convolution(_sum_harm, lpF)
    hpF_conv = convolution(lpF_conv, hpF)
    bpF_conv = convolution(hpF_conv, bpF)
    bsF_conv = convolution(lpF_conv, bsF)
    ft_lpF_harm = fourier_transform(_sum_harm, len(_sum_harm))
    ft_hpF_harm = fourier_transform(hpF_conv, len(hpF_conv))
    ft_bpF_harm = fourier_transform(bpF_conv, len(bpF_conv))
    ft_bsF_harm = fourier_transform(bsF_conv, len(bsF_conv))
    ft_lpF = fourier_transform(lpF, len(lpF))
    ft_hpF = fourier_transform(hpF, len(hpF))
    ft_bpF = fourier_transform(bpF, len(bpF))
    ft_bsF = fourier_transform(bsF, len(bsF))
    plt.subplot(gs[0, 0])
    plot(lpF, desc='ФНЧ')
    plt.subplot(gs[0, 1])
    plot(hpF, desc='ФВЧ')
    plt.subplot(gs[0, 2])
    plot(bpF, desc='ППЧ')
    plt.subplot(gs[0, 3])
    plot(bsF, desc='РФ')
    plt.subplot(gs[1, 0])
    #исправить вывод
    plot(ft_lpF[1] * 2 * m, desc='Частотная хар-ка ФНЧ')
    plt.subplot(gs[1, 1])
    plot(ft_hpF[1] * 2 * m, desc='Частотная хар-ка ФВЧ')
    plt.subplot(gs[1, 2])
    plot(ft_bpF[1] * 2 * m, desc='Частотная хар-ка ППЧ')
    plt.subplot(gs[1, 3])
    plot(ft_bsF[1], desc='Частотная хар-ка РФ')
    plt.show()
    plt.subplot(gs[0, 0])
    plot(lpF_conv[:len(lpF_conv) // 2], desc='ФНФ')
    plt.subplot(gs[0, 1])
    plot(hpF_conv[:len(hpF_conv) // 2], desc='ФВФ')
    plt.subplot(gs[0, 2])
    plot(bpF_conv[:len(bpF_conv) // 2], desc='ППФ')
    plt.subplot(gs[0, 3])
    plot(bsF_conv[:len(bsF_conv) // 2], desc='РФ')
    plt.subplot(gs[1, 0])
    plot(ft_lpF_harm[1] * 2 * m, desc='Частотная хар-ка ФНФ')
    plt.subplot(gs[1, 1])
    plot(ft_hpF_harm[1] * 2 * m, desc='Частотная хар-ка ФВФ')
    plt.subplot(gs[1, 2])
    plot(ft_bsF_harm[1], desc='Частотная хар-ка РФ')
    plt.subplot(gs[1, 3])
    plot(ft_bpF_harm[1] * 2 * m, desc='Частотная хар-ка ППФ')
    plt.show()
def eleven_task(dt=0.002, m=128, fcut=16.32):
    gs = gr.GridSpec(2, 3)
    _sum_harm = harmonic_motion(1000, a=10, f=5, t=0.001) + harmonic_motion(1000, a=10, f=50, t=0.001) + \
                harmonic_motion(1000, a=10, f=150, t=0.001)
    lpF = low_pass_filter(fcut=fcut)
    conv = convolution(_sum_harm, lpF)
    ft_sh = fourier_transform(_sum_harm, len(_sum_harm))
    ft_con = fourier_transform(conv, len(conv))
    ft_lpF = fourier_transform(lpF, len(lpF))
    plt.subplot(gs[0, 0])
    plot(_sum_harm, desc='Сумма гармоник')
    plt.subplot(gs[0, 1])
    plot(conv, desc='Свертка от суммы и фильтра')
    plt.subplot(gs[0, 2])
    plot(lpF, desc='ФНЧ')
    plt.subplot(gs[1, 0])
    plot(ft_sh[1], desc='Фурье от суммы гармоник')
    plt.subplot(gs[1, 1])
    plot(ft_con[1], desc='Фурье от свертки')
    plt.subplot(gs[1, 2])
    plot(ft_lpF[1] * 2 * m, desc='Частотная характеристика')
    plt.show()
def ten_task(x, m):
    gs = gr.GridSpec(3, 2)
    heart = heartbeat()
    card = cardiography(m)
    conv = convolution(heart, card)
    ft_h = fourier_transform(heart, len(heart))
    ft_c = fourier_transform(card, len(card))
    ft_con = fourier_transform(conv, len(conv))
    #   тики раз в секунду: 110-130
    plt.subplot(gs[0, 0])
    plot(heart, desc='Биение сердца')
    plt.subplot(gs[0, 1])
    plot(ft_h[1][:len(ft_h[1]) // 2], desc='Fourier for heartbeat')
    plt.subplot(gs[1, 0])
    plot(card, desc='Кардиограмма')
    plt.subplot(gs[1, 1])
    plot(ft_c[1][:len(ft_c[1]) // 2], desc='Fourier for cardiograpthy')
    plt.subplot(gs[2, 0])
    plot(conv, desc='Свертка')
    plt.subplot(gs[2, 1])
    plot(ft_con[1][:len(ft_con[1]) // 2],
         desc='Fourier for convolution')  #cs vs cn ??
    plt.show()
def second_task(N):
    plot(numpy_random(N), desc='Random numbers')
    plot(my_random(N), desc='Self random numbers')
    plot(normalize(numpy_random(N), 1), desc='Normalize random numbers')
    plot(normalize(my_random(N), 1), desc='Normalize self random numbers')
def nine_task(n):
    gs = gr.GridSpec(3, 1)
    m = [1, 2, 3, 10, 50, 100]
    s = 100
    harm = harmonic_motion(n, 5, s / 20, 0.002)
    noise = normalize(numpy_random(n), 2)
    exp_noise = expon(0.0016, x) + noise
    plt.subplot(gs[0, :])
    plot(exp_noise, desc="trend")
    plt.subplot(gs[1, :])
    plot(anti_trend(exp_noise, noise), desc="Anti-trend")
    plt.subplot(gs[2, :])
    plot(noise, desc="Шум")
    plt.show()
    gs = gr.GridSpec(3, 3)
    plt.subplot(gs[0, :])
    plot(harm, desc='Гармонический сигнал')
    plt.subplot(gs[1, :])
    plot(noise, desc='Шумы')
    plt.subplot(gs[2, :])
    plot(noise + harm, desc='Гармонический сигнал с шумами')
    plt.show()

    gs = gr.GridSpec(6, 6)
    realisation = np.zeros(1000)
    j = 0
    for i in m:
        # plt.subplot(gs[j, :])
        realisation += normalize(numpy_random(n), s) + harm
        realisation /= i
        plot(realisation, desc='M = ' + str(i))
        j += 1
        print('M = ' + str(i) + ', std: ' + str(np.std(realisation)))
    plt.show()
def first_task(x, k, b, alp, bet):
    plot(linear(k, x, 0), desc='y = kx')
    plot(linear(-k, x, b), desc='y = -kx + b')
    plot(expon(alp, x), desc='y = e^ax')
    plot(expon(-bet, x), desc='y = e^-bx')