如何有效地稳定非周期波信号?
Posted
技术标签:
【中文标题】如何有效地稳定非周期波信号?【英文标题】:How to effectively stationarise non-periodic wave signals? 【发布时间】:2021-10-31 07:38:18 【问题描述】:我正在预处理一个非周期性信号,以便进一步实现对信号的自回归建模。信号如下图所示。然而,当我对阈值 p 值 = 0.01 的信号应用 Augmented Dickey-Fuller (ADF) 测试时,信号被测试为非平稳的。在对非平稳信号进行一阶差分或固定间隔差分后,差分信号仍被测试为非平稳。在这种情况下,如何有效地对原始信号进行预处理,使处理后的时间序列通过 ADF 测试(阈值 p 值 = 0.01)?任何帮助或建议将不胜感激!
【问题讨论】:
你的信号的本质是什么?如果您不希望在某个时间范围内有一个固定的组件,那么转换您的信号直到找到一个只是得到错误的答案。你的信号源是什么?与小波信号处理相比,我更熟悉传统信号处理,但如果提供更多信息,我可能会有所帮助。 【参考方案1】:正如 cmets 中所说,您的实际信号可能不是固定的(在任何意义上——均值、方差、频率等)。
但是,我们可以尝试将您的信号分解为固定分量(如果存在)和非固定分量。我在下面举了一个例子(从统计数据和信号处理文献中有很多方法可以做到这一点——我正在展示一种方法)。
我创建了一个小的 Python 脚本来生成一个有点像你的信号,因为它具有很强的周期性,中间有一个“突发”幅度(我还在此之上添加了一些实际噪声)。
对于分析,我使用statsmodels.tsa.seasonal.STL
过滤器(使用 LOESS)将信号分解为趋势、季节性和残差(它是一个加法模型 -- 信号 = 趋势 + 季节性 + 残差):
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)")
【讨论】:
以上是关于如何有效地稳定非周期波信号?的主要内容,如果未能解决你的问题,请参考以下文章
数字信号处理相关函数 ( 周期信号 | 周期信号的自相关函数 )
数字信号处理相关函数 ( 周期信号 | 周期信号的自相关函数 )