自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

時(shí)間序列去趨勢(shì)化和傅里葉變換

開(kāi)發(fā) 前端
在計(jì)算傅里葉變換之前對(duì)信號(hào)去趨勢(shì)是一種常見(jiàn)的做法,特別是在處理時(shí)間序列時(shí)。在這篇文章中,我將從數(shù)學(xué)和視覺(jué)上展示信號(hào)去趨勢(shì)是如何影響傅里葉變換的。

在計(jì)算傅里葉變換之前對(duì)信號(hào)去趨勢(shì)是一種常見(jiàn)的做法,特別是在處理時(shí)間序列時(shí)。在這篇文章中,我將從數(shù)學(xué)和視覺(jué)上展示信號(hào)去趨勢(shì)是如何影響傅里葉變換的。

這篇文章的目的是讓介紹理解什么是常數(shù)和線(xiàn)性去趨勢(shì),為什么我們使用它們,以及它們是如何影響信號(hào)的傅里葉變換的。

傅里葉變換快速回顧

我們將使用傅里葉變換的如下定義:對(duì)于輸入序列x[n],當(dāng)n=0到n時(shí),傅里葉變換的第k個(gè)系數(shù)為以下復(fù)數(shù):

圖片

常量去趨勢(shì)

序列x[n]可以分解如下:將其寫(xiě)成兩個(gè)信號(hào)的和:“常數(shù)部分”等于信號(hào)的平均值,“平均值周?chē)目勺冃浴辈糠纸o出實(shí)際信號(hào)與其平均值之間的差值:

圖片

對(duì)于所有樣本n,我們有:

圖片

首先,求x均值的傅里葉變換。

圖片

這是一個(gè)簡(jiǎn)單的序列,所以在k=0處x的均值為0,在其他地方的值也為0。

圖片

使用下面代碼繪制所有指數(shù)也可以看到為什么它們的和總是為0(除了k=0)。

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')

圖片

現(xiàn)在我們把x的傅里葉變換寫(xiě)成這樣,分為兩部分:

圖片

分解x的傅里葉變換,結(jié)果是2個(gè)傅里葉變換的和:“可變性”部分的傅里葉變換,以及k=0時(shí)等于平均值的系數(shù)。

也就是說(shuō)x的傅里葉變換等于其可變性在均值附近的傅里葉變換的和,再加上除k = 0處之外的序列,這個(gè)序列都為0,所以他的均值是x。

這就常數(shù)去趨勢(shì),是在進(jìn)行傅里葉變換之前去除信號(hào)的均值。對(duì)于傅里葉系數(shù),就傅里葉系數(shù)而言,它對(duì)應(yīng)于將k = 0系數(shù)設(shè)置為0。

k = 0的系數(shù)始終等于信號(hào)的平均值,可以使用下面方法證明:

圖片

線(xiàn)性去趨勢(shì)

方法與前面相同:將輸入信號(hào)寫(xiě)為2個(gè)部分的和:“線(xiàn)性”部分,以及圍繞該線(xiàn)性部分的其余變化:

圖片

這里的線(xiàn)性部分是從最小二乘擬合計(jì)算。利用指數(shù),可以將線(xiàn)性部分寫(xiě)為:

圖片

其中b是信號(hào)的平均值。讓我們來(lái)看看它的傅里葉變換:

圖片

線(xiàn)性部分的傅里葉變換為,給定傅里葉變換的線(xiàn)性性質(zhì):

圖片

線(xiàn)性去趨勢(shì)包括在進(jìn)行傅里葉變換之前去除x的線(xiàn)性部分:它從結(jié)果中去除aFT(n)+b項(xiàng),其中a是常數(shù)因子(對(duì)應(yīng)于線(xiàn)性擬合的斜率),F(xiàn)T(n)是線(xiàn)性序列[0,1,…]的傅里葉變換,b是信號(hào)的平均值(因此第一個(gè)傅里葉系數(shù)將為0,就像常數(shù)去趨勢(shì)一樣)。

python代碼

在Python中使用numpy和scipy實(shí)現(xiàn)非常簡(jiǎn)單。

Scipy在它的signal 包中提供了detrend函數(shù),帶有一個(gè)類(lèi)型參數(shù)來(lái)指定我們是想讓信號(hào)保持常量趨勢(shì)還是線(xiàn)性趨勢(shì)。

在下面的例子中,創(chuàng)建了一個(gè)長(zhǎng)度為20個(gè)樣本的信號(hào),其中包含一個(gè)前導(dǎo)系數(shù)為2的線(xiàn)性部分,一個(gè)噪聲,一個(gè)偏移量為4的正弦部分。

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')

圖片

在左邊我們有原始輸入信號(hào),以及它的常數(shù)去趨勢(shì)和線(xiàn)性去趨勢(shì)版本。

常數(shù)去趨勢(shì)有效地去除信號(hào)的平均值,使其在0附近居中。線(xiàn)性去趨勢(shì)不僅去掉了信號(hào)的平均值,而且還去掉了它的線(xiàn)性趨勢(shì)(又名“直線(xiàn)斜率”)。從視覺(jué)上看,在線(xiàn)性去趨勢(shì)信號(hào)上比在原始信號(hào)上更容易發(fā)現(xiàn)正弦部分。

右邊是每個(gè)信號(hào)的傅里葉變換模塊:如果不去除趨勢(shì),我們得到藍(lán)色模塊。使用常數(shù)去趨勢(shì)法去除平均值可以有效地將0系數(shù)設(shè)置為0,這在大多數(shù)情況下使得圖表更容易分析。自線(xiàn)性去趨勢(shì)的結(jié)果是最好的:輸出傅里葉系數(shù)很好地顯示了輸出頻譜中的頻率,線(xiàn)性去趨勢(shì)的主要優(yōu)點(diǎn)是它大大減少了頻譜泄漏。

線(xiàn)性信號(hào)的傅里葉變換

對(duì)于不同的K值,我們可以很容易地畫(huà)出線(xiàn)性信號(hào)Kn (K為斜率)的傅里葉變換:

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()

圖片

對(duì)于給定的k值,用紅色箭頭表示的傅里葉系數(shù)總是對(duì)齊的,并且等于一個(gè)比例。所以輸出頻譜中被去掉的部分總是序列[0,1,…N]的傅里葉變換的部分,其比例因子由線(xiàn)性擬合的斜率給出。

總結(jié)

在這篇文章中,我們介紹了常量和線(xiàn)性去趨勢(shì):它們分別由去除輸入信號(hào)的平均值或線(xiàn)性擬合組成。在計(jì)算傅里葉變換之前的預(yù)處理步驟有助于使輸出譜更容易解釋。

去除信號(hào)的平均值使第0個(gè)系數(shù)為0。結(jié)果圖更容易檢查,因?yàn)榇蠖鄶?shù)情況下,平均值與頻譜的其余部分相比可能相當(dāng)大。如果我們?nèi)サ暨@個(gè)系數(shù),y軸的尺度就更容易設(shè)定。

線(xiàn)性去趨勢(shì)除了去掉平均值也去掉了信號(hào)中的總體趨勢(shì),這通常是原始信號(hào)的主導(dǎo)部分,這樣可以去掉其他成分例如季節(jié)行為等,所以如果需要對(duì)季節(jié)性進(jìn)行分析還需要另外的處理。

責(zé)任編輯:華軒 來(lái)源: DeepHub IMBA
相關(guān)推薦

2025-02-12 10:28:57

SARIMA可視化分析Python

2024-03-12 12:49:17

Python算法

2023-03-30 15:12:47

2022-03-10 08:59:59

傅里葉變換算法系統(tǒng)

2011-05-18 15:20:13

XML

2011-06-01 15:05:02

序列化反序列化

2009-08-24 17:14:08

C#序列化

2009-08-06 11:16:25

C#序列化和反序列化

2022-07-14 07:46:56

Web 3.0NFT區(qū)塊鏈

2009-06-14 22:01:27

Java對(duì)象序列化反序列化

2019-11-20 10:07:23

web安全PHP序列化反序列化

2009-08-25 14:24:36

C#序列化和反序列化

2011-03-04 09:25:51

Java序列化

2021-11-18 07:39:41

Json 序列化Vue

2009-09-09 16:10:11

.NET序列化和反序列

2009-08-25 14:43:26

C#序列化和反序列化

2011-06-01 14:26:11

序列化

2009-09-09 14:45:41

XML序列化和反序列化

2009-09-09 15:47:27

XML序列化和反序列化

2010-03-19 15:54:21

Java Socket
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)