Добавил:
ИВТ (советую зайти в "Несортированное")rnПИН МАГА Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1 лр / lab1_2

.py
Скачиваний:
5
Добавлен:
01.04.2024
Размер:
4 Кб
Скачать
import numpy as np
import matplotlib.pyplot as plt

def invert(data):
    return np.logical_not(data).astype(int)

def Wfun(data, r):
    data_bin = np.binary_repr(data)

    if r > len(data_bin):
        data_ = np.concatenate((np.zeros(r - len(data_bin)), np.array(list(map(int, data_bin)))))
    else:
        data_ = np.array(list(map(int, data_bin)))

    W = [data_[0]]
    for i in range(2, len(data_)): #правка с 1 -- 2
        if data_[i] == 1:
            W = np.concatenate((W, np.logical_not(W)))
        else:
            W = np.concatenate((W, W))

    W = np.where(W == 0, 1, -1)

    return W

def Bpfun(W, r):
    while r < len(W):
        for i in range(1, len(W), r * 2): #правка с 0 --1
            for j in range(i, i + r):
                if j + r < len(W):  # Добавлено условие для предотвращения выхода за пределы массива
                    x = W[j]
                    y = W[j + r]
                    W[j] = x + y
                    W[j + r] = x - y
        r = r * 2

    Wprev = np.copy(W)
    Wnext = np.zeros_like(W)

    for i in range(0, r - 1):
        step_wing = len(W) // (2 ** i)
        for j in range(len(W)):
            butterfly_size = step_wing // 2
            if step_wing == 0:  # Добавлена проверка на ноль
                cost = 0
            else:
                cost = j % step_wing
                if cost == 0:
                    cost = butterfly_size + 1
            if j + butterfly_size < len(W):  # Добавлено условие для предотвращения выхода за пределы массива
                if cost <= butterfly_size:
                    Wnext[j] = Wprev[j] + Wprev[j + butterfly_size]
                else:
                    Wnext[j] = Wprev[j - butterfly_size] - Wprev[j]

        Wprev = np.copy(Wnext)

    return Wprev



def Ishod_data(Bpfun_result):
    ish_data = []
    absBpfunres = np.abs(Bpfun_result)

    t = []

    for i in range(len(absBpfunres)):
        max_value = np.max(absBpfunres)
        if max_value != 0 and absBpfunres[i] / max_value > 0.7:
            t.append(i)

    print('Найденные числа:')
    for j in range(len(t)):
        if Bpfun_result[t[j] + 1] < 0:
            f = np.flip(np.binary_repr(abs(t[j])))
            f = [1] + list(map(int, f))
        else:
            f = np.flip(np.binary_repr(abs(t[j])))
            f = list(map(int, f))
        ish_data += [int(np.packbits(f))]

    return ish_data

data1 = 3
data2 = 121
r = 10


W1 = Wfun(data1, r)
W2 = Wfun(data2, r)

Wsum = W1 + W2

plt.figure(1)
plt.subplot(2, 1, 1)
plt.plot(W1)
plt.title('W1')

plt.subplot(2, 1, 2)
plt.plot(W2)
plt.title('W2')

plt.figure(2)
plt.plot(Wsum)
plt.title('Wsum')

BPU1 = Bpfun(W1, r)
plt.figure(3)
plt.subplot(2, 1, 1)
plt.plot(BPU1)
plt.title('BPU1')
IdataW1 = Ishod_data(Bpfun(W1, r))

BPU2 = Bpfun(W2, r)
plt.subplot(2, 1, 2)
plt.plot(BPU2)
plt.title('BPU2')
IdataW2 = Ishod_data(Bpfun(W2, r))

plt.figure(4)
plt.subplot(2, 1, 1)
BPU = Bpfun(Wsum, r)
plt.plot(BPU)
plt.title('BPU')
IdataWsum = Ishod_data(Bpfun(Wsum, r))

plt.subplot(2, 1, 2)
Shum = 11 - 2 * 11 * np.random.rand(len(Wsum))
Wshum = Wsum + Shum
IdataWshum = Ishod_data(Bpfun(Wshum, r))

fwhdWshum = Bpfun(Wshum, r)
plt.plot(fwhdWshum)
plt.title('fwhdWshum')

plt.show()
Соседние файлы в папке 1 лр