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中标准库OS的常用方法总结大全
Jul 19 Python
Python字符串拼接的几种方法整理
Aug 02 Python
PyCharm在win10的64位系统安装实例
Nov 26 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
python爬虫获取百度首页内容教学
Dec 23 Python
python使用PIL实现多张图片垂直合并
Jan 15 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
Jun 13 Python
Python使用matplotlib 画矩形的三种方式分析
Oct 31 Python
python批量处理txt文件的实例代码
Jan 13 Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 Python
Python如何读写字节数据
Aug 05 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
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
javascript引导程序
2008/10/26 Javascript
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
angularjs基础教程
2014/12/25 Javascript
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
WEB开发之注册页面验证码倒计时代码的实现
2016/12/15 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
用Python实现KNN分类算法
2017/12/22 Python
创建Django项目图文实例详解
2019/06/06 Python
python求质数列表的例子
2019/11/24 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
ECHT官方网站:男女健身服
2020/02/14 全球购物
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
电子商务应届生求职信
2013/11/16 职场文书
婚前保证书
2014/04/29 职场文书
施工安全员岗位职责
2015/04/11 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书
Python机器学习之底层实现KNN
2021/06/20 Python