python np fft_【Python实例】历史八卦与傅里叶变换

28607f884953fc48574c55e8d9c6d3cd.png

傅里叶画像

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

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

7a88cb8b8022f0e508f20cdb515648b3.png

温室效应与全球变暖

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

f8157223391031816180e87f0f7b8c55.png

埃瓦里斯特·伽罗瓦

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

436b3dc6ce18f358cf89b2eb8f5b5952.png

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

6d2108644ce0618036a980e917dde5c5.png

689e6f1d985cf60595dc646ff8266b67.png

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

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

输出结果:

34077f108a992d43aa5f8801715ea79c.png

延伸阅读:

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_transforms/py_fourier_transform/py_fourier_transform.html

http://ericstrong.org/fast-fourier-transforms-in-python/

https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.fft.html

https://www.tcd.ie/Physics/people/Charles.Patterson/teaching/PY2050_CP/New_Scripts/Fourier_Series.pdf

a378320245ffe5e5d8a8540f39d3633a.png

Python1231分钟前

嗯……能拖到最下面的都是好样的,要不要……再拖回最上面,点一下关注?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值