Как эффективно локализовать непериодические волновые сигналы?

#python #time-series #filtering #signal-processing #wavelet

Вопрос:

Я предварительно обрабатываю непериодический сигнал для дальнейшей реализации авторегрессионного моделирования сигнала. Сигнал показан на следующем рисунке. Однако, когда я применил дополненный тест Дики-Фуллера (ADF) к сигналу с пороговым значением p = 0,01, сигнал проверяется как нестационарный. После реализации дифференцирования первого порядка или дифференцирования с фиксированным интервалом на нестационарных сигналах дифференцированный сигнал все еще тестируется как нестационарный. В этом случае, как мне эффективно предварительно обработать необработанный сигнал, чтобы обработанные временные ряды прошли тест ADF(пороговое значение p = 0,01)? Любая помощь или предложения будут высоко оценены! введите описание изображения здесь

Комментарии:

1. Какова природа вашего сигнала? Если вы не ожидаете, что в течение определенного периода времени будет стационарный компонент, то преобразование вашего сигнала до тех пор, пока вы его не найдете, просто приведет к неправильному ответу. Каков ваш источник сигнала? Я больше знаком с традиционной обработкой сигналов, чем с вейвлет-обработкой сигналов, но, возможно, я смогу чем-то помочь, если мне предоставят больше информации.

Ответ №1:

Как сказано в комментариях, ваш фактический сигнал может быть нестационарным (в любом смысле-среднее значение, дисперсия, частота и т. Д.).

Однако мы можем попытаться разложить ваш сигнал на стационарную составляющую (если она существует) и нестационарную составляющую. Я привожу пример ниже (есть много способов сделать это из статистики и литературы по обработке сигналов-я показываю один способ).

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

Для анализа я использую statsmodels.tsa.seasonal.STL фильтр (использует ЛЕСС), чтобы разложить сигнал на тренд, сезонность и остаток (это аддитивная модель-Сигнал = Тренд Сезонность Остаток).:

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

Тест ADF дает значение p ~0,02 для необработанного сигнала (верхняя диаграмма) и 0,0 при применении к остаточному сигналу, так что, похоже, мы успешно разделили компоненты.

Таким образом, вы можете работать с остатками в любом последующем анализе и повторно учитывать тренд и сезонность.

Надеюсь, это поможет вам получить некоторые идеи. Есть много способов сделать это.

Другие подходы, не представленные здесь, включают модели процессов ARCH и GARCH, которые предназначены для обработки нестационарной волатильности и кластеризации волатильности: https://en.wikipedia.org/wiki/Autoregressive_conditional_heteroskedasticity


код на python

 from random import uniform

import pandas as pd
from matplotlib import pyplot
from statsmodels.tsa.seasonal import DecomposeResult, STL
from statsmodels.tsa.stattools import adfuller


with open("signal.txt", 'r') as f:
    series = pd.Series(uniform(.5, 2)*float(i) for i in f.readlines())

adf = adfuller(series, store=True)
stat, pval = adf[:2]
print(f"Signal ADF Test: ADF={stat}, p-val={round(pval,2)}")

periods = []
p = 0
for i in range(len(series)-1):
    if series[i]*series[i 1] >= 0:
        p  = 1
        continue
    periods.append(p)
    p = 0
T = round(sum(periods)/len(periods))
print(T)
result: DecomposeResult = STL(series, period=2*T).fit()
result.plot()
pyplot.show()

resid = result.resid

adf = adfuller(resid, store=True)
stat, pval = adf[:2]
print(f"Residual ADF Test: ADF={stat}, p-val={round(pval,2)}")