当前位置:首页 > 科技  > 软件

时间序列去趋势化和傅里叶变换

来源: 责编: 时间:2023-08-14 22:00:43 505观看
导读在计算傅里叶变换之前对信号去趋势是一种常见的做法,特别是在处理时间序列时。在这篇文章中,我将从数学和视觉上展示信号去趋势是如何影响傅里叶变换的。这篇文章的目的是让介绍理解什么是常数和线性去趋势,为什么我们使

在计算傅里叶变换之前对信号去趋势是一种常见的做法,特别是在处理时间序列时。在这篇文章中,我将从数学和视觉上展示信号去趋势是如何影响傅里叶变换的。LqS28资讯网——每日最新资讯28at.com

这篇文章的目的是让介绍理解什么是常数和线性去趋势,为什么我们使用它们,以及它们是如何影响信号的傅里叶变换的。LqS28资讯网——每日最新资讯28at.com

傅里叶变换快速回顾

我们将使用傅里叶变换的如下定义:对于输入序列x[n],当n=0到n时,傅里叶变换的第k个系数为以下复数:LqS28资讯网——每日最新资讯28at.com

图片LqS28资讯网——每日最新资讯28at.com

常量去趋势

序列x[n]可以分解如下:将其写成两个信号的和:“常数部分”等于信号的平均值,“平均值周围的可变性”部分给出实际信号与其平均值之间的差值:LqS28资讯网——每日最新资讯28at.com

图片LqS28资讯网——每日最新资讯28at.com

对于所有样本n,我们有:LqS28资讯网——每日最新资讯28at.com

图片LqS28资讯网——每日最新资讯28at.com

首先,求x均值的傅里叶变换。LqS28资讯网——每日最新资讯28at.com

图片LqS28资讯网——每日最新资讯28at.com

这是一个简单的序列,所以在k=0处x的均值为0,在其他地方的值也为0。LqS28资讯网——每日最新资讯28at.com

图片LqS28资讯网——每日最新资讯28at.com

使用下面代码绘制所有指数也可以看到为什么它们的和总是为0(除了k=0)。LqS28资讯网——每日最新资讯28at.com

import numpy as np import matplotlib.pyplot as plt  N = 10 ns = np.arange(N)  fig, axes = plt.subplots(1, N//2+1, figsize=(18,8), sharex=True, sharey=True)  for k in range(0, N//2+1):    eiks = np.exp(-2*1J*np.pi*ns/N*k)    pretty_ax(axes[k])    plot_sum_vector(eiks, axes[k])    axes[k].set_title(f'k={k}')    axes[k].set_aspect('equal') fig.suptitle(f'Complex plot of the $e^{{-2i/pi kn/N}}$ families')

图片LqS28资讯网——每日最新资讯28at.com

现在我们把x的傅里叶变换写成这样,分为两部分:LqS28资讯网——每日最新资讯28at.com

图片LqS28资讯网——每日最新资讯28at.com

分解x的傅里叶变换,结果是2个傅里叶变换的和:“可变性”部分的傅里叶变换,以及k=0时等于平均值的系数。LqS28资讯网——每日最新资讯28at.com

也就是说x的傅里叶变换等于其可变性在均值附近的傅里叶变换的和,再加上除k = 0处之外的序列,这个序列都为0,所以他的均值是x。LqS28资讯网——每日最新资讯28at.com

这就常数去趋势,是在进行傅里叶变换之前去除信号的均值。对于傅里叶系数,就傅里叶系数而言,它对应于将k = 0系数设置为0。LqS28资讯网——每日最新资讯28at.com

k = 0的系数始终等于信号的平均值,可以使用下面方法证明:LqS28资讯网——每日最新资讯28at.com

图片LqS28资讯网——每日最新资讯28at.com

线性去趋势

方法与前面相同:将输入信号写为2个部分的和:“线性”部分,以及围绕该线性部分的其余变化:LqS28资讯网——每日最新资讯28at.com

图片LqS28资讯网——每日最新资讯28at.com

这里的线性部分是从最小二乘拟合计算。利用指数,可以将线性部分写为:LqS28资讯网——每日最新资讯28at.com

图片LqS28资讯网——每日最新资讯28at.com

其中b是信号的平均值。让我们来看看它的傅里叶变换:LqS28资讯网——每日最新资讯28at.com

图片LqS28资讯网——每日最新资讯28at.com

线性部分的傅里叶变换为,给定傅里叶变换的线性性质:LqS28资讯网——每日最新资讯28at.com

图片LqS28资讯网——每日最新资讯28at.com

线性去趋势包括在进行傅里叶变换之前去除x的线性部分:它从结果中去除aFT(n)+b项,其中a是常数因子(对应于线性拟合的斜率),FT(n)是线性序列[0,1,…]的傅里叶变换,b是信号的平均值(因此第一个傅里叶系数将为0,就像常数去趋势一样)。LqS28资讯网——每日最新资讯28at.com

python代码

在Python中使用numpy和scipy实现非常简单。LqS28资讯网——每日最新资讯28at.com

Scipy在它的signal 包中提供了detrend函数,带有一个类型参数来指定我们是想让信号保持常量趋势还是线性趋势。LqS28资讯网——每日最新资讯28at.com

在下面的例子中,创建了一个长度为20个样本的信号,其中包含一个前导系数为2的线性部分,一个噪声,一个偏移量为4的正弦部分。LqS28资讯网——每日最新资讯28at.com

import numpy as np from scipy.signal import detrend import matplotlib.pyplot as plt  N = 20 # create a sample signal, with linear, offset, noise and sinus parts ys = np.arange(N) * 2 + 4 + np.random.randn(N) + 4*np.sin(2*np.pi*np.arange(N)/5) # constant and linear detrend ys_c = detrend(ys, type='constant') ys_l = detrend(ys, type='linear')  fig, axes = plt.subplots(1, 2)  ax = axes[0] ax.plot(ys, label='raw') ax.plot(ys_c, label='constant-detrended') ax.plot(ys_l, label='linear-detrended') ax.legend() ax.set_title('Input signal')  ax = axes[1] # we use rfft since our input signals are real ax.plot(np.abs(np.fft.rfft(ys))) ax.plot(np.abs(np.fft.rfft(ys_c))) ax.plot(np.abs(np.fft.rfft(ys_l))) ax.set_title('Module of Fourier-transform')

图片LqS28资讯网——每日最新资讯28at.com

在左边我们有原始输入信号,以及它的常数去趋势和线性去趋势版本。LqS28资讯网——每日最新资讯28at.com

常数去趋势有效地去除信号的平均值,使其在0附近居中。线性去趋势不仅去掉了信号的平均值,而且还去掉了它的线性趋势(又名“直线斜率”)。从视觉上看,在线性去趋势信号上比在原始信号上更容易发现正弦部分。LqS28资讯网——每日最新资讯28at.com

右边是每个信号的傅里叶变换模块:如果不去除趋势,我们得到蓝色模块。使用常数去趋势法去除平均值可以有效地将0系数设置为0,这在大多数情况下使得图表更容易分析。自线性去趋势的结果是最好的:输出傅里叶系数很好地显示了输出频谱中的频率,线性去趋势的主要优点是它大大减少了频谱泄漏。LqS28资讯网——每日最新资讯28at.com

线性信号的傅里叶变换

对于不同的K值,我们可以很容易地画出线性信号Kn (K为斜率)的傅里叶变换:LqS28资讯网——每日最新资讯28at.com

import numpy as np import matplotlib.pyplot as plt  N = 10 ns = np.arange(N) Ks = [-5, 2, 5]  fig, axes = plt.subplots(len(Ks), N//2+1, figsize=(18,8), sharex=True, sharey=True, gridspec_kw={'hspace':0, 'wspace':0})  for i, K in enumerate(Ks):    xs = K*np.arange(N)    for k in range(0, N//2+1):        Zs = xs * np.exp(-2*1J*np.pi*ns/N*k) / N        ax = axes[i, k]        pretty_ax(ax)        plot_sum_vector(Zs, ax)        ax.set_aspect('equal')        ax.set_xlabel(f'k={k}')    axes[i, 0].set_ylabel(f'K={K}') fig.tight_layout()

图片LqS28资讯网——每日最新资讯28at.com

对于给定的k值,用红色箭头表示的傅里叶系数总是对齐的,并且等于一个比例。所以输出频谱中被去掉的部分总是序列[0,1,…N]的傅里叶变换的部分,其比例因子由线性拟合的斜率给出。LqS28资讯网——每日最新资讯28at.com

总结

在这篇文章中,我们介绍了常量和线性去趋势:它们分别由去除输入信号的平均值或线性拟合组成。在计算傅里叶变换之前的预处理步骤有助于使输出谱更容易解释。LqS28资讯网——每日最新资讯28at.com

去除信号的平均值使第0个系数为0。结果图更容易检查,因为大多数情况下,平均值与频谱的其余部分相比可能相当大。如果我们去掉这个系数,y轴的尺度就更容易设定。LqS28资讯网——每日最新资讯28at.com

线性去趋势除了去掉平均值也去掉了信号中的总体趋势,这通常是原始信号的主导部分,这样可以去掉其他成分例如季节行为等,所以如果需要对季节性进行分析还需要另外的处理。LqS28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-5701-0.html时间序列去趋势化和傅里叶变换

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: SpringBoot获取Request的三种方法!

下一篇: 前端如何安全的渲染HTML字符串?

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 帅气纯真少年!日本最帅初中生选美冠军出炉

    日本第一帅哥初一生选美大赛冠军现已正式出炉,冠军是来自千叶县的宗田悠良。日本一直热衷于各种选美大赛,从“最美JK”起到“最美女星&r
  • 六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    8月5日消息,一年一度的华为开发者大会2023(Together)日前在松山湖拉开帷幕,与此同时,华为8月服务日也式开启,到店可享六大专属权益。华为用户可在华为商城Ap
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    Tenstorrent是一家由芯片行业资深人士Jim Keller领导的加拿大初创公司,专注于开发人工智能芯片,该公司周三表示,已经从现代汽车集团和三星投资基金等
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主“七王”在群里介绍一些刷单赚
Top