Python fft信号滤波_python颜色代码

傅里叶画像

今天(3月21日)是法国著名数学家、物理学家让·巴普蒂斯·约瑟夫·傅里叶的251岁生日。傅里叶(或译付力叶、傅立叶等)是埃菲尔铁塔上镌刻的72位科学家/工程师之一,与拉格朗日、拉瓦锡、安培、库伦等齐名,即便是在群星熠熠的19世纪数学界,也是一位响当当的人物。

大部分人知道他的名字都是因为傅里叶级数(Fourier Series)和傅里叶变换(Fourier Transformation)(诸多理工科学渣的噩梦),不过很多人可能不知道的是,当今21世纪的联合国天天操碎了心的“温室效应”这个概念,也是傅里叶早在1827年提出的。

Python fft信号滤波_python np fft_02

温室效应与全球变暖

这位大佬不仅成就超群,死法也非常不同凡响。据说,因为拿破仑曾派他去埃及当差,适应了埃及炎热气候的傅里叶回到法国冻得瑟瑟发抖,天天裹着棉袄烤火炉……有一天,他因为穿得太厚重心不稳,从家里的楼梯上摔了下来,撞到头部,当场中风发作而死。

Python fft信号滤波_python subplot_03

埃瓦里斯特·伽罗瓦

傅里叶的意外逝世,也间接导致了群论的创立者之一、超级天才少年、21岁就因为和情敌持枪决斗英年早逝的伽罗瓦的研究成果没能及时获得发现和认可,因为他收到伽罗瓦的资料还没来得及细看就死了。(你们法国数学家都怎么回事……)

Python fft信号滤波_python颜色代码_04

好了,以上是历史八卦的部分,请纯文科的同学们点击右上角分享到朋友圈假装自己看完了,真的对傅里叶变换有兴趣/有需求的同学继续往下看。

Python fft信号滤波_python 傅里叶变换_05

Python fft信号滤波_python 傅里叶变换_06

傅里叶变换和逆傅里叶变换

Python的NumPy库里提供傅里叶变换所需的全套函数,用好了可能比MATLAB更快更方便。具体的实现方式网上已有许多教程,这边贴个带注解的例子,更多请看最下面延伸阅读的链接,从定义到应用,从快速到离散,请自己复制到浏览器阅读,总有一款适合你。

准备工作:安装matplotlib包,打开命令窗口,进入安装python下的scripts路径,输入pip install matplotlib。

然后是代码:

import numpy as np

from scipy.fftpack import fft,ifft

import matplotlib.pyplot as plt

import seaborn

#采样点选择1400个,因为设置的信号频率分量最高为600Hz,根据采样定理知采样频率要大于信号频率2倍,所以这里设置采样频率为1400Hz(即一秒内有1400个采样点)

x=np.linspace(0,1,1400) 

#设置需要采样的信号,频率分量有180,390和600

y=7*np.sin(2*np.pi*180*x) + 1.5*np.sin(2*np.pi*390*x)+5.1*np.sin(2*np.pi*600*x)

yy=fft(y)                     #快速傅里叶变换

yreal = yy.real               # 获取实数部分

yimag = yy.imag               # 获取虚数部分

yf=abs(fft(y))                # 取模

yf1=abs(fft(y))/((len(x)/2))           #归一化处理

yf2 = yf1[range(int(len(x)/2))]  #由于对称性,只取一半区间

xf = np.arange(len(y))        # 频率

xf1 = xf

xf2 = xf[range(int(len(x)/2))]  #取一半区间

#原始波形

plt.subplot(221)

plt.plot(x[0:50],y[0:50])

plt.title('Original wave')

#混合波的FFT(双边频率范围)

plt.subplot(222)

plt.plot(xf,yf,'r') #显示原始信号的FFT模值

plt.title('FFT of Mixed wave(two sides frequency range)',fontsize=7,color='#7A378B')  #注意这里的颜色可以查询颜色代码表

#混合波的FFT(归一化)

plt.subplot(223)

plt.plot(xf1,yf1,'g')

plt.title('FFT of Mixed wave(normalization)',fontsize=9,color='r')

plt.subplot(224)

plt.plot(xf2,yf2,'b')

plt.title('FFT of Mixed wave)',fontsize=10,color='#F08080')

plt.show()

输出结果:

Python fft信号滤波_python 傅里叶变换_07