本文仅为自己把知识的掌握情况做一个整理记录,主要内容参照了一些阅读量比较高的文章,已经根据记忆补充了一些参考资料,若有遗漏请联系我补充。
傅里叶分析可分为傅里叶级数(Fourier Serie)和傅里叶变换(Fourier Transformation)
傅里叶级数
傅里叶告诉我们,任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。
最前面黑色的线就是所有正弦波叠加而成的总和,也就是越来越接近矩形波的那个图形。而后面依不同颜色排列而成的正弦波就是组合为矩形波的各个分量。这些正弦波按照频率从低到高从前向后排列开来,而每一个波的振幅都是不同的。
每两个正弦波之间都还有一条直线,那并不是分割线,而是振幅为0的正弦波!也就是说,为了组成特殊的曲线,有些正弦波成分是不需要的。
傅里叶级数的频谱
不同频率的正弦波我们成为频率分量。如果我们把第一个频率最低的频率分量看作“1”,我们就有了构建频域的最基本单元。在频域,0频率也被称为直流分量,在傅里叶级数的叠加中,它仅仅影响全部波形相对于数轴整体向上或是向下而不改变波的形状。
正弦波的定义:正弦波就是一个圆周运动在一条直线上的投影。
频域的基本单元也可以理解为一个始终在旋转的圆
频域图像,也就是俗称的频谱。可以发现,在频谱中,偶数项的振幅都是0,也就对应了图中的彩色直线。振幅为0的正弦波。很多在时域看似不可能做到的数学操作,在频域相反很容易。尤其是从某条曲线中去除一些特定的频率成分,这在工程上称为滤波,是信号处理最重要的概念之一,只有在频域才能轻松的做到。
傅里叶级数的相位谱
通过时域到频域的变换,我们得到了一个从侧面看的频谱,但是这个频谱并没有包含时域中全部的信息。因为频谱只代表每一个对应的正弦波的振幅是多少,而没有提到相位。基础的正弦波A.sin(wt+θ)中,振幅,频率,相位缺一不可,不同相位决定了波的位置,所以对于频域分析,仅仅有频谱(振幅谱)是不够的,我们还需要一个相位谱。
鉴于正弦波是周期的,我们需要设定一个用来标记正弦波位置的东西。在图中就是那些小红点。小红点是距离频率轴最近的波峰,而这个波峰所处的位置离频率轴有多远呢?为了看的更清楚,我们将红色的点投影到下平面,投影点我们用粉色点来表示。当然,这些粉色的点只标注了波峰距离频率轴的距离,并不是相位
这里需要纠正一个概念:时间差并不是相位差。如果将全部周期看作2Pi或者360度的话,相位差则是时间差在一个周期中所占的比例。我们将时间差除周期再乘2Pi,就得到了相位差。在完整的立体图中,我们将投影得到的时间差依次除以所在频率的周期,就得到了最下面的相位谱。所以,频谱是从侧面看,相位谱是从下面看。
傅里叶级数的数学公式
对于周期函数f(t),其周期为T1,角频率为w1
= 2π/T1,f1 = 1/T1,其傅里叶级数展开为:
上式的右端就是所谓的傅里叶级数。周期信号按照傅里叶级数展开,可以分解成为直流分量a0,和许多正余弦分量an,bn而这些正余弦的分量必定是基频f1(1/T,T为周期函数的周期)的整数倍)。
傅里叶变换
傅里叶级数,在时域是一个周期且连续的函数,而在频域是一个非周期离散的函数。
傅里叶变换,则是将一个时域非周期的连续信号,转换为一个在频域非周期的连续信号。
对于周期为1的函数频域上每条线的间隔为1,而对于周期为T的函数,频域上的间隔为1/T 时域周期与频域有反比的关系。特别的当T趋近于无穷,频谱间隔越来越近,最终频谱变为连续的。原来离散谱的叠加,变成了连续谱的累积。所以在计算上也从求和符号变成了积分符号。
欧拉公式
欧拉公式所描绘的,是一个随着时间变化,在复平面上做圆周运动的点,随着时间的改变,在时间轴上就成了一条螺旋线。如果只看它的实数部分,也就是螺旋线在左侧的投影,就是一个最基础的余弦函数。而右侧的投影则是一个正弦函数。
python实现简单的傅里叶变换
实例1.
实例2.
实例3.
具体代码
以第一个函数为例
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from pylab import *
import matplotlib.pyplot as plt
from sympy import * #用于求导积分等科学计算
from scipy.integrate import tplquad,dblquad,quad
#原函数f(x)={ exp(x), -pi≤x<0
# 1, 0≤x<pi}
ax1 = plt.subplot(2, 2, 1)
ax2 = plt.subplot(2, 2, 2)
ax3=plt.subplot(2, 2, 3)
ax4=plt.subplot(2, 2, 4)
#原函数
x_value=[]
y_value=[]
for i in np.arange(-pi, pi, 0.01):
if(i<0):
x_value.append(i)
y_value.append(i+pi)
else:
x_value.append(i)
y_value.append(pi-i)
plt.sca(ax1)
plt.plot(x_value,y_value,'orange',linewidth=0.6)
plt.title('original function')
a_value = []
b_value = []
from pylab import *
x = mgrid[-10:10:0.02]
def fourier_transform():
plt.sca(ax2)
m1, err1 = quad(lambda m: np.exp(m), -np.pi, 0)
m2,err2=quad(lambda m: 1, 0, np.pi)
a0 = 1 / pi * m1 + 1 / pi * m2
s=a0/2
for i in range(1,100,1):
mm1,errm1=quad(lambda m: np.exp(m)* np.cos(i * m), -np.pi, 0)
mm2,errm2=quad(lambda m: np.cos(i * m), 0, np.pi)
a=1 / pi * mm1 + 1 / pi * mm2
a_value.append(a)
nn1, errn1 = quad(lambda m: np.exp(m) * np.sin(i * m), -np.pi, 0)
nn2, errn2 = quad(lambda m: np.sin(i * m), 0, np.pi)
b = 1 / pi * nn1 + 1 / pi * nn2
b_value.append(b)
s0 = ( 1 / pi *a*cos(i*x) + 1 / pi *b* sin(i*x) )
s=s+s0
plot(x,s,'orange',linewidth=0.6)
title('fourier_transform')
fourier_transform()
plt.sca(ax3)
plot(np.arange(len(x_value)),x_value,'orange',linewidth=0.6)
title('X')
plt.sca(ax4)
plot(np.arange(len(y_value)),y_value,'orange',linewidth=0.6)
title('Y')
plt.show()
https://zhuanlan.zhihu.com/p/19763358?columnSlug=wille
https://blog.csdn.net/ouening/article/details/70339341