Python利用FFT进行简单滤波的实现


Posted in Python onFebruary 26, 2020

1、流程

大体流程如下,无论图像、声音、ADC数据都是如下流程:

(1)将原信号进行FFT;

(2)将进行FFT得到的数据去掉需要滤波的频率;

(3)进行FFT逆变换得到信号数据;

2、算法仿真

2.1 生成数据:

#采样点选择1400个,因为设置的信号频率分量最高为600Hz,根据采样定理知采样频率要大于信号频率2倍,所以这里设置采样频率为1400Hz(即一秒内有1400个采样点)
x=np.linspace(0,1,1400)
#设置需要采样的信号,频率分量有180,390和600
y=2*np.sin(2*np.pi*180*x) + 3*np.sin(2*np.pi*390*x)+4*np.sin(2*np.pi*600*x)

2.2 对生成的数据进行FFT变换

yy=fft(y)           #快速傅里叶变换
yf=abs(fft(y))        # 取模
yf1=abs(fft(y))/((len(x)/2))      #归一化处理
yf2 = yf1[range(int(len(x)/2))] #由于对称性,只取一半区间

2.3显示转换结果:

显示原始FFT模值:

#混合波的FFT(双边频率范围)
plt.figure(2)
plt.plot(xf,yf,'r') #显示原始信号的FFT模值
plt.title('FFT of Mixed wave(two sides frequency range)',fontsize=7,color='#7A378B') #注意这里的颜色可以查询颜色代码表

Python利用FFT进行简单滤波的实现

显示原始FFT归一化后的模值:

#混合波的FFT(归一化)
plt.figure(3)
plt.plot(xf1,yf1,'g')
plt.title('FFT of Mixed wave(normalization)',fontsize=9,color='r')

Python利用FFT进行简单滤波的实现

由于对称,只取一半区间进行显示

plt.figure(4)
plt.plot(xf2,yf2,'b')
plt.title('FFT of Mixed wave)',fontsize=10,color='#F08080')

Python利用FFT进行简单滤波的实现

3、利用FFT进行滤波

例如将频率为600HZ的噪声滤掉,这里直接将该频段的数据置零:

yy=fft(y)           #快速傅里叶变换
yreal = yy.real        # 获取实数部分
yimag = yy.imag        # 获取虚数部分
test_y =yy
for i in range(len(yy)):
  if i <=900 and i>=500:
    test_y[i]=0

对置零后的数据进行逆变换:

test = np.fft.ifft(test_y) #对变换后的结果应用ifft函数,应该可以近似地还原初始信号。

对还原的数据进行FFT变换的结果:

Python利用FFT进行简单滤波的实现

滤波后的数据和原数据相对比:

蓝色的为原数据,橙色的为滤波后的数据

Python利用FFT进行简单滤波的实现

假设将400Hz和600Hz的信号都滤掉得到的信号图像如下:

Python利用FFT进行简单滤波的实现

4、对随机噪声进行滤波

源码:

noise_size = 1400
noise_array = np.random.normal(0, 2, noise_size)
  
    
adc_value=[]
  
for i in range(noise_size):
    
  adc_value.append(0)
 
y= np.array(adc_value) + noise_array

yy=fft(y)           #快速傅里叶变换
yf=abs(fft(y))        # 取模
yf1=abs(fft(y))/((len(y)/2))      #归一化处理
yf2 = yf1[range(int(len(y)/2))] #由于对称性,只取一半区间
#混合波的FFT(双边频率范围)
xf = np.arange(len(y)) 
plt.figure(1)
plt.plot(xf,yf,'r') #显示原始信号的FFT模值
plt.title('FFT of Mixed wave(two sides frequency range)',fontsize=7,color='#7A378B') #注意这里的颜色可以查询颜色代码表

yy=fft(y)           #快速傅里叶变换
yreal = yy.real        # 获取实数部分
yimag = yy.imag        # 获取虚数部分
test_y =yy
for i in range(len(yy)):
  if i <=1200 and i>=200:
    test_y[i]=0
test = np.fft.ifft(test_y) #对变换后的结果应用ifft函数,应该可以近似地还原初始信号。
y=test
yy=fft(y)           #快速傅里叶变换
yf=abs(fft(y))        # 取模
yf1=abs(fft(y))/((len(y)/2))      #归一化处理
yf2 = yf1[range(int(len(y)/2))] #由于对称性,只取一半区间
#混合波的FFT(双边频率范围)
xf = np.arange(len(y)) 
plt.figure(2)
plt.plot(xf,yf,'r') #显示原始信号的FFT模值
plt.title('FFT of Mixed wave(two sides frequency range)',fontsize=7,color='#7A378B') #注意这里的颜色可以查询颜色代码表

运行结果:

原数据频谱图:

Python利用FFT进行简单滤波的实现

滤波后的频谱图:

Python利用FFT进行简单滤波的实现

滤波后(蓝色线)与原数据(红色线)对比:

Python利用FFT进行简单滤波的实现

以上这篇Python利用FFT进行简单滤波的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python计算最大优先级队列实例
Dec 18 Python
Python入门篇之面向对象
Oct 20 Python
python中安装Scrapy模块依赖包汇总
Jul 02 Python
Python在不同目录下导入模块的实现方法
Oct 27 Python
简单了解Django模板的使用
Dec 20 Python
python实现杨氏矩阵查找
Mar 02 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
Python 多线程,threading模块,创建子线程的两种方式示例
Sep 29 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 #Python
Python图像处理库PIL的ImageDraw模块介绍详解
Feb 26 #Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 #Python
Pandas —— resample()重采样和asfreq()频度转换方式
Feb 26 #Python
python实现银行实战系统
Feb 26 #Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 #Python
python序列类型种类详解
Feb 26 #Python
You might like
扩展你的 PHP 之入门篇
2006/12/04 PHP
mysql中存储过程、函数的一些问题
2007/02/14 PHP
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
nestjs返回给前端数据格式的封装实现
2021/02/22 Javascript
python解析xml文件实例分析
2015/05/27 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
巴西最大的家具及装饰用品店:Mobly
2017/10/11 全球购物
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
毕业生自我鉴定
2013/11/05 职场文书
迟到检讨书900字
2014/01/14 职场文书
函授毕业个人自我评价
2014/02/20 职场文书
廉洁教育学习材料
2014/05/19 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
文艺部部长竞选稿
2015/11/21 职场文书