Как сделать нулевую обводку постепенно более гладкой для непрерывных данных?

Вопрос или проблема

У меня есть эти непрерывные данные (амплитуда):

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

Я хочу постепенно сгладить их для нулевого заполнения, на самом деле мне это удалось с помощью свертки. Но это требует серьезной настройки, и я не уверен, что это подходит для всех образцов:

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

Вот параметры свертки, которые я использую:

start_onset = padded_beat_rolled[:int(360 * 0.1)]
start_onset_convolved = np.convolve(start_onset, np.ones(25)*0.06, 'same')

plt.plot(start_onset)
plt.plot(start_onset_convolved)
plt.show()

Как видите, у меня нет причин, почему количество ядер установлено таким образом, потому что я настраивал это вручную, я надеюсь, что смогу обобщить это для всех образцов.

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

Ответ или решение

Для того чтобы сделать нулевое дополнение (zero padding) более гладким для непрерывных данных, необходимо использовать методы, которые обеспечивают более естественный переход между значениями. Ниже я представлен возможный подход, который можно использовать в вашем случае.

1. Понимание проблемы

При использовании нулевого дополнения на временных рядах возникает проблема резкого перехода или дисконтинуитета между существующими данными и дополненными нулями. Это может привести к нежелательным артефактам при выполнении дальнейших операций, таких как свертка. Необходимым шагом является создание более гладкого перехода.

2. Использование сглаживающего фильтра

Сглаживание можно добиться с помощью разных подходов. Один из популярных способов — использовать сглаживающие фильтры, такие как гауссовское размытие, или более гибкие методы, такие как полиномы низкой степени (например, полиномы третьего порядка).

import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter1d

# Допустим, padded_beat_rolled - ваш массив данных
start_onset = padded_beat_rolled[:int(360 * 0.1)]

# Применение гауссовского фильтра для сглаживания
sigma = 5  # Параметр, который можно настроить для получения необходимого уровня сглаживания
smoothed_onset = gaussian_filter1d(start_onset, sigma=sigma)

plt.plot(start_onset, label='Исходные данные')
plt.plot(smoothed_onset, label='Сглаженные данные', linestyle='--')
plt.legend()
plt.show()

3. Использование интерполяции

Другим подходом может быть интерполяция значений на краях вашего исходного сигнала. Например, линейная интерполяция или более сложные методы, такие как интерполяция кубическими сплайнами, могут значительно сгладить переход.

from scipy.interpolate import interp1d

# Создание массива значений индексов для интерполяции
x = np.arange(len(start_onset))
interp_func = interp1d(x, start_onset, kind='cubic', fill_value='extrapolate')
x_new = np.linspace(0, len(start_onset) - 1, 100)
smoothed_onset_interp = interp_func(x_new)

plt.plot(start_onset, label='Исходные данные')
plt.plot(x_new, smoothed_onset_interp, label='Интерполированные данные', linestyle='--')
plt.legend()
plt.show()

4. Автоматическая настройка параметров

Чтобы избежать необходимости вручную подбирать параметры, можно использовать адаптивные методы, такие как скользящее окно и алгоритмы оптимизации для выбора оптимальных параметров фильтрации. Например, можно использовать кросс-валидацию для оценки производительности различных параметров на наборе данных.

5. Заключение

Выбор метода сглаживания и параметры могут зависеть от характера ваших данных. Начните с простых методов и постепенно усложняйте подход, оценивая качество сглаживания. Использование гауссовского фильтра и интерполяции может помочь вам добиться более естественного перехода при нулевом дополнении. Не стесняйтесь проводить экспериментальные проверки, чтобы найти оптимальные настройки для вашего конкретного набора данных.

Если у вас возникли дополнительные вопросы или требуется более детальная помощь, пожалуйста, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...