基于python的快速傅里叶变换FFT(一)
基于python的快速傅里叶变换FFT(一)
FFT可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。
知识点
1、FFT——离散傅里叶变换(DFT)的快速算法。它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
2、假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。
3、假设采样频率为Fs,采样点数为N,做FFT之后,某一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以N);该点的相位即是对应该频率下的信号的相位。相位的计算可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒的信号,并做FFT。要提高频率分辨率,就需要增加采样点数,这在一些实际的应用中是不现实的,需要在较短的时间内完成分析。解决这个问题的方法有频率细分法,比较简单的方法是采样比较短时间的信号,然后在后面补充一定数量的0,使其长度达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。
4、由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。
代码实现
准备工作:安装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()
实现结果
结果验证
假设我们有一个信号,它含有一个频率为180Hz,幅度为7V的交流信号;一个频率为390Hz,幅度为1.5V的交流信号;一个频率为600Hz,幅度为5.1V的交流信号。用数学表达式就是如下:
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)
从图中我们可以看到,在第181点、第391点、和第601点附近有比较大的值。分别计算这三个点的模值,结果如下:
181点: 4900
391点:1030
601点:2600
按照公式,可以计算出180Hz信号的幅度为:4900/(N/2)=384/(1400/2)=7;390Hz信号的幅度为:1030/(N/2)=1030/(1400/2)=1.5。可见,从频谱分析出来的幅度是正确的。
注:600Hz信号的幅度异常,具体原因为检查出来,后期更新。
基于python的快速傅里叶变换FFT(一)相关推荐
- 基于python的快速傅里叶变换FFT(二)
基于python的快速傅里叶变换FFT(二) 本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换. 知识点 FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算 ...
- 快速傅里叶变换python_基于python的快速傅里叶变换FFT(二)
基于python的快速傅里叶变换FFT(二) 本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换. 知识点 FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算法. ...
- 数字信号处理——Python实现快速傅里叶变换FFT
文章首发于我的个人博客 1.FFT背景 快速傅里叶变换(FFT)是离散傅里叶变换(DFT)的快速算法,它是根据离散傅里叶的奇.偶.虚.实等特性,在DFT的基础上进行改进获得的.它对傅里叶变换的理论没有 ...
- 在python实现快速傅里叶变换FFT与频域滤波
参考:https://baike.baidu.com/item/快速傅里叶变换/214957?fr=aladdin https://blog.csdn.net/u012531536/article/d ...
- 基于MCU的快速傅里叶变换FFT调试记录
FFT主要用于将信号从时域变换到频域,时域变换到频域的主要目的是为了更方便分析信号,比如轴承振动异常的频率想通过时域信号去分析出来是哪个频率就很难分析,而通过把时域信号变化到频域的话就可以很清楚直接的 ...
- MATLAB之傅里叶变换,快速傅里叶变换FFT
文章目录 傅里叶变换及傅里叶逆变换定义 窗函数/矩形脉冲信号的傅里叶变换 基于MATLAB的快速傅里叶变换FFT 傅里叶变换及傅里叶逆变换定义 能从时域的非周期连续信号转化到频域非周期连续信号. 窗函 ...
- Python信号处理小试牛刀——快速傅里叶变换(FFT)
输入:仿真一个理想的多频信号y,频率为3Hz.10Hz,然后在这个理想信号上添加一个白噪声,得到一个带有白噪声的多频信号y_noise: 处理过程:分别对两个信号进行快速傅里叶变换得到对应的频谱图: ...
- OpenCV快速傅里叶变换(FFT)用于图像和视讯流的模糊检测
OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测 翻译自[OpenCV Fast Fourier Transform (FFT) for blur detection in images ...
- 离散傅里叶变换 (DFT)、快速傅里叶变换 (FFT)
目录 离散傅里叶变换 (DFT) 离散傅里叶变换的基 离散傅里叶变换 快速傅里叶变换 (FFT) 卷积 线性时不变系统 傅里叶级数 参考文献 离散傅里叶变换 (DFT) 离散傅里叶变换的基 对于周期为 ...
最新文章
- Cisco实战——不让坏人登陆设备
- ubuntu 进入 recovery mode
- 自学python从零开始学_新手学习python-从零开始学习
- Oracle12c:安装后新建用户及其默认表空间,并创建表测试
- Structual设计--Flyweight模式
- linux中设备文件的主要内容包括什么,LINUX期末考试复习题.doc
- Windows2008+MyEclipse10+Android开发环境搭配
- js复杂对象和简单对象的简单转化
- 用Python实现BP神经网络(附代码)
- 计算机网络与应用在线作业,北航《计算机网络与应用》在线作业一15秋满分答案...
- Symbian 之浏览器
- css基础 CSS 布局 – Overflow、Float 浮动、CSS 布局 – 水平 垂直居中对齐
- LOAP引擎:clickhouse03:文件的导入导出方式
- 阿里云MaxComputer SQL学习之DDL
- 现在的BAT,就是曾经的外企
- FrameMaker 格式的本地化流程
- Linux4步快速搭建DNS服务器
- 第二次·2020-09-21
- Unity制作自己的Project Template
- linux查找多少天前的文件,linuxfind查找大于多少天的文件,并删除之
热门文章
- 【FPGA】SRIO IP核系统总览以及端口介绍(二)(I/O Port 含义介绍)
- write_cfgmem 产生存储器配置文件?
- 初识Tcl(九):Tcl 字典
- python3写unicode编码到文件
- “国际软件自由日”介绍
- 查看Android API文档的正确方式
- Oracle 11g Data Guard 使用duplicate from active database 创建 standby database
- 优秀教程:创建基于 Ajax 的文件拖放上传功能
- java map to map 拷贝_java复制Map 对象(深拷贝和浅拷贝)
- Round Robin 算法