M3_9

1) Создайте модуль М1, содержащий две функции:

- функция 1: аргументы - список Х с последовательностью отсчетов некоторого сигнала и два числовых параметра:М1 и М2; в функции должен создаваться кортеж К с индексами "аномальных" отсчетов сигнала, для которых выполняются неравенства: X[i]-X[i-1]<M1 или X[i]-X[i-1]>M2.

- функция 2: аргументы - список Х с отсчетами сигнала и кортеж К с индексами "аномальных" отсчетов; в функции должен создаваться новый список Х1, в котором элементы совпадают с элементами из Х, если те не являются "аномальными", а элементы из списка К заменяются на X[i]=0.5*(X[i-1]+X[i+1]), а если "аномальным" окажется последний элемент, то его значение заменяется на значение предпоследнего элемента.

2) Создайте еще один модуль М2, в котором должны выполняться операции:

- запрашивается и вводится имя текстового файла со значениями сигнала; проверяется наличие файла и при отсутствии - повторение запроса;

- из указанного файла считывается список Х с сигналом, причем в строках файла может быть разное число отсчетов сигнала;

- запрашиваются и вводятся граничные значения М1 и М2 (с проверкой: М1<M2);

- с применением функции 1 создается кортеж с индексами "аномальных" отсчетов; результат отображается на экране;

- если кортеж "аномальных" отсчетов не пустой, то с применением функции 2 создается список Х1 с "исправленным" сигналом, отображается на экране и записывается в бинарный файл Res44.bin; в ином случае выдается сообщение об отсутствии "аномальных" отсчетов.

3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика сигналы Х и Х1.

4) Подготовьте текстовый файл, в который запишите  50 случайных, нормально распределенных чисел с математическим ожиданием 10 и стандартным отклонением 5.  Проведите 2 расчета по программе с использованием этого файла.
```py
import matplotlib.pyplot as plt
from MMM2 import main_pr

def plot_signals(X, X1):
    plt.figure()
    plt.plot(X, label='X',marker='o', linestyle='-')
    plt.plot(X1, label='X1',marker='s', linestyle='--')
    plt.title('Сравнение исходного и исправленного сигналов')
    plt.legend()
    plt.grid(True)
    plt.show()


if __name__ == "__main__":
    result = main_pr()
    if result:
        X, X1 = result if result[1] is not None else (result[0], None)
        plot_signals(X, X1)
```
```py
import os
import pickle
from MMM1 import find_anomal, cor_anom

def read_sig(filename):
    numbers = []
    try:
        with open(filename, 'r', encoding='utf-8') as f:
            for line in f:
                parts = line.strip().split()
                for part in parts:
                    try:
                        numbers.append(float(part))
                    except ValueError:
                        continue
    except Exception as e:
        print(f"Ошибка чтения файла: {e}")
        return None
    return numbers

def main_pr():
    while True:
        filename = input("Введите имя текстового файла с сигналом: ")
        if os.path.isfile(filename):
            break
        print("Файл не найден. Попробуйте снова.")
    
    X = read_sig(filename)
    if X is None:
        print("Не удалось прочитать сигнал.")
        return
    
    M1 = float(input("Введите M1 (нижняя граница): "))
    M2 = float(input("Введите M2 (верхняя граница): "))
    
    anomalies = find_anomal(X, M1, M2)
    if anomalies:
        print(f"Индексы аномальных отсчетов: {anomalies}")
    else:
        print("Индексов аномальных отcчетов нет")
    
    if anomalies:
        X1 = cor_anom(X, anomalies)
        
        with open('Res44.bin', 'wb') as f:
            pickle.dump(X1, f)
        print("Результат сохранён в файл Res44.bin")
    else:
        print("Аномальных отсчетов не обнаружено.")
    
    return X, X1 if anomalies else None

```
```py
def find_anomal(X, M1, M2):

    K = []
    for i in range(1, len(X)):
        diff = X[i] - X[i - 1]
        if diff < M1 or diff > M2:
            K.append(i)
    return tuple(K)

def cor_anom(X, K):
   
    X1 = X.copy()
    n = len(X)
    
    for idx in K:
        if idx == n - 1:
            X1[idx] = X[idx - 1]
        elif idx == 0:
            X1[idx] = X[idx + 1]
        else:
            X1[idx] = 0.5 * (X[idx - 1] + X[idx + 1])
    
    return X1

```