【机器学习笔记31】傅里叶变换

【参考资料】
【1】《复变函数与积分变换》
【2】《数字信号处理》

1. 傅里叶级数

定义: 设 f T ( t ) f_T(t) fT(t)是以T为周期的实值函数,且在 [ − T 2 , T 2 ] [-\dfrac{T}{2}, \dfrac{T}{2}] [2T,2T]上满足狄利克雷条件,即:
1)连续或只有有限个第一类间断点;
备注:第一类间断点包括:
可去间断点:左右极限存在且相等,但不等于该点的值,或该点无定义;
跳跃间断点:左右极限存在但不相等

2)只有有限个极值点

那么 f T ( t ) f_T(t) fT(t)在连续点处有

傅里叶级数的三角形式

f T ( t ) = a 0 2 + ∑ n = 1 + ∞ ( a n cos ⁡ n ω 0 t + b n sin ⁡ n ω 0 t ) f_T(t)=\dfrac{a_0}{2} + \sum\limits_{n=1}^{+\infty}(a_n \cos n \omega_0 t + b_n \sin n \omega_0 t) fT(t)=2a0+n=1+(ancosnω0t+bnsinnω0t)
w 0 = 2 π T w_0 = \dfrac{2 \pi}{T} w0=T2π

a n = 2 T ∫ − T / 2 T / 2 f T ( t ) cos ⁡ n ω 0 t d t a_n = \dfrac{2}{T}\int_{-T/2}^{T/2} f_T(t) \cos n \omega_0 tdt an=T2T/2T/2fT(t)cosnω0tdt其中 n = 0 , 1 , 2 , … n = 0, 1, 2, \dots n=0,1,2,

b n = 2 T ∫ − T / 2 T / 2 f T ( t ) sin ⁡ n ω 0 t d t b_n = \dfrac{2}{T}\int_{-T/2}^{T/2} f_T(t) \sin n \omega_0 tdt bn=T2T/2T/2fT(t)sinnω0tdt其中 n = 0 , 1 , 2 , … n = 0, 1, 2, \dots n=0,1,2,

傅里叶级数的复指数形式

f T ( t ) = ∑ − ∞ + ∞ c n e j n ω 0 t f_T(t) = \sum\limits_{-\infty}^{+\infty} c_n e^{jn \omega_0 t} fT(t)=+cnejnω0t
c n = 1 T ∫ − T / 2 T / 2 f T ( t ) e − j n ω 0 t d t c_n = \dfrac{1}{T} \int_{-T/2}^{T/2} f_T(t) e^{-jn \omega_0 t}dt cn=T1T/2T/2fT(t)ejnω0tdt

【机器学习笔记31】傅里叶变换_第1张图片


2. 傅里叶变换

周期函数可以展开为傅里叶级数。从物理上将周期为T的函数可以由一系列 ω 0 = 2 π T \omega_0 = \dfrac{2\pi}{T} ω0=T2π为间隔的离散频率所形成的简谐波合成。当T越来越大时,取得频率间隔越来越小,当T变成无穷大时,周期函数就变成了非周期函数,此时傅里叶级数就转变称了傅里叶变换。

推导如下:

f ( t ) = lim ⁡ T → + ∞ f T ( t ) f(t)=\lim\limits_{T \to +\infty}f_T(t) f(t)=T+limfT(t)
= lim ⁡ T → + ∞ ∑ n = − ∞ n = + ∞ [ 1 T ∫ − T / 2 T / 2 f T ( τ ) e − j n ω 0 τ d τ ] e j n ω 0 t =\lim\limits_{T \to +\infty} \sum\limits_{n=-\infty}^{n=+\infty} [ \dfrac{1}{T} \int_{-T/2}^{T/2} f_T(\tau) e^{-jn \omega_0 \tau} d \tau ] e^{jn \omega_0 t} =T+limn=n=+[T1T/2T/2fT(τ)ejnω0τdτ]ejnω0t

在周期函数下时域信号被分解为频率 ω 0 = 2 π T \omega_0 = \dfrac{2 \pi}{T} ω0=T2π的简谐波,此时T区域无穷。

因此有越来越小的 ω 0 \omega_0 ω0记作 Δ ω \Delta \omega Δω,而 n ω 0 n \omega_0 nω0记作 ω n \omega_n ωn, 并且 T = 2 π Δ ω T=\dfrac{2 \pi}{\Delta \omega} T=Δω2π
于是有:

f ( t ) = 1 2 π lim ⁡ Δ ω → 0 ∑ n = − ∞ n = + ∞ [ ∫ − π / Δ ω π / Δ ω f T ( τ ) e − j ω n τ d τ . e j ω n t ] Δ ω f(t)=\dfrac{1}{2\pi} \lim\limits_{\Delta \omega \to 0} \sum\limits_{n=-\infty}^{n=+\infty} [ \int_{-\pi/\Delta \omega}^{\pi/\Delta \omega}f_T(\tau)e^{-j\omega_n \tau}d\tau . e^{j \omega_n t}] \Delta \omega f(t)=2π1Δω0limn=n=+[π/Δωπ/ΔωfT(τ)ejωnτdτ.ejωnt]Δω

f ( t ) = 1 2 π ∫ − ∞ + ∞ [ ∫ − ∞ + ∞ f ( τ ) e − j ω τ d τ ] e j ω t d ω f(t)=\dfrac{1}{2\pi} \int\limits_{-\infty}^{+\infty}[\int\limits_{-\infty}^{+\infty} f(\tau) e^{-j\omega \tau}d\tau] e^{j\omega t}d\omega f(t)=2π1+[+f(τ)ejωτdτ]ejωtdω

因此得到定理如下(傅里叶变换):
F ( ω ) = ∫ − ∞ + ∞ f ( t ) e − j ω t d t F(\omega)=\int\limits_{-\infty}^{+\infty} f(t) e^{-j\omega t} dt F(ω)=+f(t)ejωtdt
f ( t ) = 1 2 π ∫ − ∞ + ∞ F ( ω ) e j ω t d ω f(t)=\dfrac{1}{2\pi}\int\limits_{-\infty}^{+\infty} F(\omega)e^{j\omega t}d \omega f(t)=2π1+F(ω)ejωtdω

3. 单位冲击函数

单位冲击函数定义:
1)当 t ≠ 0 t \ne 0 t̸=0时, ξ ( t ) = 0 \xi(t)=0 ξ(t)=0
2) ∫ − ∞ + ∞ ξ ( t ) d t = 1 \int_{-\infty}^{+\infty} \xi(t) dt = 1 +ξ(t)dt=1

主要性质:
1 当实数域有界函数f(t),在t=0点连续,则 ∫ − ∞ + ∞ ξ ( t ) f ( t ) d t = f ( 0 ) \int_{-\infty}^{+\infty} \xi(t) f(t) dt = f(0) +ξ(t)f(t)dt=f(0)
2 当实数域有界函数f(t),在 t = t 0 t = t_0 t=t0点连续,则 ∫ − ∞ + ∞ ξ ( t − t 0 ) f ( t ) d t = f ( t 0 ) \int_{-\infty}^{+\infty} \xi(t - t_0) f(t) dt = f(t_0) +ξ(tt0)f(t)dt=f(t0)
3 ξ ( t ) \xi(t) ξ(t)是偶函数,有 ξ ( t ) = ξ ( − t ) \xi(t) = \xi(-t) ξ(t)=ξ(t)
4 ξ ( t ) \xi(t) ξ(t)是单位阶跃函数 μ ( t ) \mu (t) μ(t)的导数
μ ( t ) = { 1 , t > 0 0 , t < 0 \mu(t) = \begin{cases} 1, & t > 0 \\ 0, & t < 0 \end{cases} μ(t)={1,0,t>0t<0

5 ξ ( t ) \xi(t) ξ(t)函数的傅里叶变换

公式1: F ( ω ) = F [ x i ( t ) ] = ∫ − ∞ + ∞ ξ ( t ) e − j ω t d t = e − j w t ∣ t = 0 = 1 F(\omega)=F[xi(t)] =\int_{-\infty}^{+\infty}\xi(t)e^{-j\omega t}dt = e^{-jwt}|_{t=0} = 1 F(ω)=F[xi(t)]=+ξ(t)ejωtdt=ejwtt=0=1
公式2: F − 1 [ 1 ] = 1 2 π ∫ − ∞ + ∞ e − j ω t d ω = ξ ( t ) F^{-1}[1] = \dfrac{1}{2\pi} \int_{-\infty}^{+\infty} e^{-j \omega t} d \omega = \xi(t) F1[1]=2π1+ejωtdω=ξ(t) //根据逆变换可知
根据上面两个公式,我们可以作出如下推导:
f ( t ) = 1 f(t)=1 f(t)=1,其傅里叶变换(由公式2) F ( ω ) = ∫ − ∞ + ∞ e − j ω t d t = 2 π ξ ( t ) F(\omega)=\int_{-\infty}^{+\infty} e^{-j \omega t} dt = 2\pi \xi(t) F(ω)=+ejωtdt=2πξ(t)
f ( t ) = e j ω 0 t f(t)=e^{j \omega_0 t} f(t)=ejω0t
F ( ω ) = ∫ − ∞ + ∞ e j ω 0 t e − j ω t d t = 2 π ξ ( ω 0 − ω ) F(\omega) = \int_{-\infty}^{+\infty} e^{j \omega_0 t} e^{-j \omega t} dt = 2 \pi \xi(\omega_0 - \omega) F(ω)=+ejω0tejωtdt=2πξ(ω0ω)
f ( t ) = c o s ω 0 t = 1 / 2 ∫ − ∞ + ∞ ( e j ω 0 t + e − j ω 0 t ) e − j ω t d t = π [ ξ ( ω − ω 0 ) + ξ ( ω + ω 0 ) ] f(t)=cos \omega_0 t = 1/2 \int_{-\infty}^{+\infty}(e^{j \omega_0 t} + e^{-j \omega_0 t}) e^{-j \omega t} dt = \pi[\xi(\omega - \omega_0) + \xi(\omega + \omega_0)] f(t)=cosω0t=1/2+(ejω0t+ejω0t)ejωtdt=π[ξ(ωω0)+ξ(ω+ω0)]

因此在广义的傅里叶变换下周期函数仍然可以以傅里叶变换展开

4. 离散傅里叶变换

设x(n)是一个长度为M的有限长序列,则定义x(n)的N点离散傅里叶变换为:
X ( k ) = D F T [ x ( n ) ] = ∑ n = 0 N − 1 W N k n k = 0 , 1 , 2 , … , N − 1 X(k) = DFT[x(n)]=\sum\limits_{n=0}^{N-1}W_{N}^{kn} \quad k = 0,1,2,\dots, N-1 X(k)=DFT[x(n)]=n=0N1WNknk=0,1,2,,N1

X(k)的傅里叶逆变换为:
x ( n ) = I D F T [ X ( k ) ] = 1 N ∑ n = 0 N − 1 X ( k ) W N − k n n = 0 , 1 , 2 , … , N − 1 x(n) = IDFT[X(k)] = \dfrac{1}{N}\sum\limits_{n=0}^{N-1}X(k)W_{N}^{-kn} \quad n = 0,1,2,\dots, N-1 x(n)=IDFT[X(k)]=N1n=0N1X(k)WNknn=0,1,2,,N1
其中 W N = e − j 2 π N W_N=e^{-j \dfrac{2\pi}{N}} WN=ejN2π,N是DFT变换区间长度, N ≥ M N \ge M NM

5. 代码实现(numpy和纯python)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import matplotlib.ticker as tik
import pandas as pd
import numpy as np
import math


def _fft_code():

    plt.figure(figsize=(8, 4))

    df = pd.read_csv('./data/test.csv', sep=',')

    data = df['std_value'].astype(float)

    ax1 = plt.subplot(1,2,1)
    ax1.set_title('time series')
    plt.gca().yaxis.set_major_formatter(tik.FormatStrFormatter('%1.2f'))

    plt.plot(data,'r')

    list_len = len(data)

    y = data

    m = np.floor(list_len) #DFT中的N,要求N >= M,这里字节用序列长度

    a = np.zeros(int(m))
    b = np.zeros(int(m))
    c = np.zeros(int(m))

    N = int(list_len - 1)

    for i in range(0, int(m)- 1):
       for t in range(0, N - 1):

           a[i + 1] = a[i + 1] + y[t + 1] * np.cos(2 * np.pi * i * t/N)
           b[i + 1] = b[i + 1] + y[t + 1] * np.sin(2 * np.pi * i * t/N)

       c[i + 1] = a[i + 1] + b[i + 1]

    ax2 = plt.subplot(1,2,2)
    ax2.set_title('Fourier Result')
    plt.plot(c,'b')
    plt.show()


def _fft_np():

    df = pd.read_csv('./data/test.csv', sep=',')

    data = df['std_value']

    fig = plt.figure(figsize=(8, 4))

    

    ax1 = plt.subplot(1,2,1)
    ax1.set_title('time series')
    plt.gca().yaxis.set_major_formatter(tik.FormatStrFormatter('%1.2f'))


    plt.plot(data,'r')

    transformed = np.fft.fft(data)

    d = abs(transformed) 
    x = np.arange(len(d))

    ax2 = plt.subplot(1,2,2)
    ax2.set_title('Fourier Result')
    plt.plot(d,'b')

    plt.show()

"""
说明:

傅里叶变换代码实现,对应的笔记《傅里叶变换》

作者:fredric

日期:2018-11-18

_fft_np: 采用numpy自带傅里叶变换函数

_fft_code: 纯python代码,依据基本的DFT推导,未采用FFT


"""

if __name__ == '__main__':

    _fft_code()

    _fft_np()



【机器学习笔记31】傅里叶变换_第2张图片

你可能感兴趣的:(机器学习,机器学习笔记)