Построение огибающей по заданным значениям

У меня есть значения (накопления амплитуды сигнала) на втором (нижнем) графике, хочу построить по ним огибающую, но получается неверно. Вот код:

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import envelope

t_phi_x, phi_total_x, R_x = quad_finder(registrated_signal, t, sample_rate, win_sizes, file_title=f'Гармонический сигнал')
t_phi_y, phi_total_y, R_y = quad_finder(registrated_signal_y, t, sample_rate, win_sizes, file_title=f'Гармонический сигнал')

plt.figure(figsize=(12, 6))

n, n_out = len(R_x), len(R_x)/100
T = 50 / n
bp_in = (int(0.01 * (n * T)), None)
x = np.array(R_x)
x_env, x_res = envelope(x, bp_in, n_out=int(n_out))
t_out = np.arange(n_out) * (n / n_out) * T
# Первый график: Накопления начальной фазы по оси икс
plt.subplot(2, 1, 1)  # 2 строки, 1 столбец, 1-й график
plt.plot(t_phi_x[:len(phi_total_x)], phi_total_x)
plt.title(f'Накопления начальной фазы по оси икс ({params})')
plt.xlabel('Время (с)')
plt.ylabel('Начальная фаза')

# Второй график: Накопления амплитуды по оси икс
plt.subplot(2, 1, 2)  # 2 строки, 1 столбец, 2-й график
plt.plot(t_phi_x[:len(R_x)], R_x)
plt.plot(t_out[:len(x_res)], x_res + x_env, 'C1.-', alpha=0.5, label="Envelope")    
plt.title(f'Накопления амплитуды по оси икс ({params})')
plt.xlabel('Время (с)')
plt.ylabel('Амплитуда')

Вот результат: введите сюда описание изображения

Подскажите, пожалуйста, как верно настроить функцию envelope, чтобы построить нормальную огибающую.


Ответы (1 шт):

Автор решения: Fox Fox

Пример построения огибающей для функции y=sin(19x)+sin(17x):

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema

x = np.linspace(1, 11, 1000)
y = np.sin(19*x) + np.sin(17*x)

max_indices = argrelextrema(y, np.greater)[0]
min_indices = argrelextrema(y, np.less)[0]

plt.figure(figsize=(10, 6))
plt.plot(x, y, color="blue", alpha=0.5, label="Функция")
plt.plot(x[max_indices], y[max_indices], 'r--', linewidth=2, label="Верхняя огибающая")
plt.plot(x[min_indices], y[min_indices], 'g--', linewidth=2, label="Нижняя огибающая")
plt.legend()
plt.grid(linestyle="--", alpha=0.5)
plt.show()

введите сюда описание изображения

→ Ссылка