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 相关文章推荐
zbar解码二维码和条形码示例
Feb 07 Python
Python中基本的日期时间处理的学习教程
Oct 16 Python
python多进程下实现日志记录按时间分割
Jul 22 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
python zip()函数使用方法解析
Oct 31 Python
python的time模块和datetime模块实例解析
Nov 29 Python
解决Python3下map函数的显示问题
Dec 04 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
Python中常用的高阶函数实例详解
Feb 21 Python
Python自动化测试中yaml文件读取操作
Aug 20 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 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中数据的批量导入(csv文件)
2006/10/09 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
vuex 的简单使用
2018/03/22 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
python中 ? : 三元表达式的使用介绍
2013/10/09 Python
python获取指定目录下所有文件名列表的方法
2015/05/20 Python
python笔记:mysql、redis操作方法
2017/06/28 Python
Python编程实现蚁群算法详解
2017/11/13 Python
Tornado 多进程实现分析详解
2018/01/12 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
html5绘制时钟动画
2014/12/15 HTML / CSS
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
幼师自荐信
2013/10/26 职场文书
便利店投资的创业计划书
2014/01/12 职场文书
大学社团活动策划书
2014/01/26 职场文书
小学三年级数学教学反思
2014/01/31 职场文书
军训自我鉴定100字
2014/02/13 职场文书
市场营销毕业求职信
2014/08/07 职场文书
农村党员对照检查材料
2014/09/24 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书
实习证明模板
2015/06/16 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS