Как найти среднюю амплитуду графика с блуждающей базовой линией?Python

Программы на Python
Anonymous
Как найти среднюю амплитуду графика с блуждающей базовой линией?

Сообщение Anonymous »

Я работаю над школьным проектом, в котором мне нужно наблюдать за движением определенного объекта. Я получил этот график, описывающий его движение после первых шагов анализа. Однако я не уверен, как я могу взять среднее значение всех пиков и впадин, которые я вижу здесь, и получить значение амплитуды, которое описывает этот конкретный набор условий. Я не могу просто принять среднее значение значений за положение равновесия, так как происходит «дрейф» базовой линии, а это значит, что вместо этого мне нужно попытаться найти «дельта-амплитуду» для каждой точки и усреднить все это для амплитуду этого набора условий.
Изображение рассматриваемого графика
Я начал пытаться решить эту проблему на Python и запустил в одну последовательную проблему. Даже после сглаживания графика написанная мной программа для расчета средней амплитуды вычисляет среднее значение неточностей графика (значения в несколько пикселей в микромасштабе), а не фактическое движение объекта в макромасштабе. .
Я запустил свою программу на идеальной синусоидальной кривой, и там она работает так, как и ожидалось, предоставляя мне среднюю амплитуду как величину смещения от положения равновесия, поскольку незначительных движений нет. которые вызывают пики и впадины, которые мой код распознает как локальные минимумы/максимумы.
Следующий код представляет собой функцию, которую я сейчас использую для получения амплитуды. Выбранная амплитуда представляет собой лишь подмножество данных и является произвольной для данного вопроса.

Код: Выделить всё

# Amplitude calculation function for smoothed data
def calculate_smoothed_amplitude(start, end):
selected_time = time[start:end+1]
selected_amplitude = smoothed_amplitude[start:end+1]

if len(selected_amplitude) < 3:
print("Selected range is too small to calculate amplitude.")
return 0

peaks = []
troughs = []

for i in range(1, len(selected_amplitude) - 1):
if selected_amplitude[i] > selected_amplitude[i-1] and selected_amplitude[i] > selected_amplitude[i+1]:
peaks.append((selected_time[i], selected_amplitude[i]))
if selected_amplitude[i] < selected_amplitude[i-1] and selected_amplitude[i] < selected_amplitude[i+1]:
troughs.append((selected_time[i], selected_amplitude[i]))

amplitudes = []
for i in range(1, len(troughs) - 1):
prev_peak = max([p[1] for p in peaks if p[0] < troughs[i][0]], default=None)
next_peak = min([p[1] for p in peaks if p[0] > troughs[i][0]], default=None)

if prev_peak is not None and next_peak is not None:
delta_amp = (prev_peak - troughs[i][1] + next_peak - troughs[i][1]) / 2
amplitudes.append(delta_amp)

if amplitudes:
average_amplitude = np.mean(amplitudes)
else:
average_amplitude = 0

return average_amplitude
Спасибо вам, ребята, за помощь!!!

Подробнее здесь: https://stackoverflow.com/questions/788 ... g-baseline

Вернуться в «Python»