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绘制人人网好友关系图示例
Apr 01 Python
Python判断变量是否已经定义的方法
Aug 18 Python
python实现封装得到virustotal扫描结果
Oct 05 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
Python Socket实现简单TCP Server/client功能示例
Aug 05 Python
python 处理数字,把大于上限的数字置零实现方法
Jan 28 Python
python批量爬取下载抖音视频
Jun 17 Python
python切片(获取一个子列表(数组))详解
Aug 09 Python
Python爬虫 批量爬取下载抖音视频代码实例
Aug 16 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
Python numpy.zero() 初始化矩阵实例
Nov 27 Python
浅谈Pytorch torch.optim优化器个性化的使用
Feb 20 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
模仿OSO的论坛(五)
2006/10/09 PHP
php 图像函数大举例(非原创)
2009/06/20 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
javascript 常用方法总结
2009/06/03 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
jQuery获取当前点击的对象元素(实现代码)
2016/05/19 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
DOM 事件的深入浅出(一)
2016/12/05 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
Python获取脚本所在目录的正确方法
2014/04/15 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
最大K个数问题的Python版解法总结
2016/06/16 Python
Python 通配符删除文件的实例
2018/04/24 Python
python将时分秒转换成秒的实例
2019/12/07 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
解锁canvas导出图片跨域的N种姿势小结
2019/01/24 HTML / CSS
如何查找和删除数据库中的重复数据
2014/11/05 面试题
日语翻译个人求职的自我评价
2013/10/14 职场文书
机电专业毕业生求职信
2013/10/27 职场文书
面料业务员岗位职责
2013/12/26 职场文书
六查六看剖析材料
2014/02/15 职场文书
一年级评语大全
2014/04/23 职场文书
火锅店的活动方案
2014/08/15 职场文书
寒山寺导游词
2015/02/03 职场文书
项目合作意向书
2015/05/08 职场文书
windows安装python超详细图文教程
2021/05/21 Python
教你使用vscode 搭建react-native开发环境
2021/07/07 Javascript
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL