【参考资料】
【1】《复变函数与积分变换》
【2】《数字信号处理》
1. 傅里叶级数
定义: 设fT(t)是以T为周期的实值函数,且在[−2T,2T]上满足狄利克雷条件,即:
1)连续或只有有限个第一类间断点;
备注:第一类间断点包括:
可去间断点:左右极限存在且相等,但不等于该点的值,或该点无定义;
跳跃间断点:左右极限存在但不相等
2)只有有限个极值点
那么fT(t)在连续点处有
傅里叶级数的三角形式
fT(t)=2a0+n=1∑+∞(ancosnω0t+bnsinnω0t)
w0=T2π
an=T2∫−T/2T/2fT(t)cosnω0tdt其中n=0,1,2,…
bn=T2∫−T/2T/2fT(t)sinnω0tdt其中n=0,1,2,…
傅里叶级数的复指数形式
fT(t)=−∞∑+∞cnejnω0t
cn=T1∫−T/2T/2fT(t)e−jnω0tdt
![【机器学习笔记31】傅里叶变换 【机器学习笔记31】傅里叶变换](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE3Ny9jMTRmNzM5Y2QzM2FlMTlhNTExZWI3MzJkNTM4NTc1MS5wbmc=)
2. 傅里叶变换
周期函数可以展开为傅里叶级数。从物理上将周期为T的函数可以由一系列ω0=T2π为间隔的离散频率所形成的简谐波合成。当T越来越大时,取得频率间隔越来越小,当T变成无穷大时,周期函数就变成了非周期函数,此时傅里叶级数就转变称了傅里叶变换。
推导如下:
f(t)=T→+∞limfT(t)
=T→+∞limn=−∞∑n=+∞[T1∫−T/2T/2fT(τ)e−jnω0τdτ]ejnω0t
在周期函数下时域信号被分解为频率ω0=T2π的简谐波,此时T区域无穷。
因此有越来越小的ω0记作Δω,而nω0记作ωn, 并且T=Δω2π
于是有:
f(t)=2π1Δω→0limn=−∞∑n=+∞[∫−π/Δωπ/ΔωfT(τ)e−jωnτdτ.ejωnt]Δω
f(t)=2π1−∞∫+∞[−∞∫+∞f(τ)e−jωτdτ]ejωtdω
因此得到定理如下(傅里叶变换):
F(ω)=−∞∫+∞f(t)e−jωtdt
f(t)=2π1−∞∫+∞F(ω)ejωtdω
3. 单位冲击函数
单位冲击函数定义:
1)当t̸=0时,ξ(t)=0
2)∫−∞+∞ξ(t)dt=1
主要性质:
1 当实数域有界函数f(t),在t=0点连续,则∫−∞+∞ξ(t)f(t)dt=f(0)
2 当实数域有界函数f(t),在t=t0点连续,则∫−∞+∞ξ(t−t0)f(t)dt=f(t0)
3 ξ(t)是偶函数,有ξ(t)=ξ(−t)
4 ξ(t)是单位阶跃函数μ(t)的导数
μ(t)={1,0,t>0t<0
5 ξ(t)函数的傅里叶变换
公式1:F(ω)=F[xi(t)]=∫−∞+∞ξ(t)e−jωtdt=e−jwt∣t=0=1
公式2:F−1[1]=2π1∫−∞+∞e−jωtdω=ξ(t) //根据逆变换可知
根据上面两个公式,我们可以作出如下推导:
对f(t)=1,其傅里叶变换(由公式2) F(ω)=∫−∞+∞e−jωtdt=2πξ(t)
对f(t)=ejω0t
F(ω)=∫−∞+∞ejω0te−jωtdt=2πξ(ω0−ω)
对f(t)=cosω0t=1/2∫−∞+∞(ejω0t+e−jω0t)e−jωtdt=π[ξ(ω−ω0)+ξ(ω+ω0)]
因此在广义的傅里叶变换下周期函数仍然可以以傅里叶变换展开
4. 离散傅里叶变换
设x(n)是一个长度为M的有限长序列,则定义x(n)的N点离散傅里叶变换为:
X(k)=DFT[x(n)]=n=0∑N−1WNknk=0,1,2,…,N−1
X(k)的傅里叶逆变换为:
x(n)=IDFT[X(k)]=N1n=0∑N−1X(k)WN−knn=0,1,2,…,N−1
其中WN=e−jN2π,N是DFT变换区间长度,N≥M
5. 代码实现(numpy和纯python)
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)
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】傅里叶变换 【机器学习笔记31】傅里叶变换](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQzMi81N2IyZjExZDFhMGQ0ZDNhYmUxYTJlYjg4MmJhODdiMC5wbmc=)