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实现自动更换ip的方法
May 05 Python
python执行子进程实现进程间通信的方法
Jun 02 Python
Django中传递参数到URLconf的视图函数中的方法
Jul 18 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
Python绘制正余弦函数图像的方法
Aug 28 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
详解js文件通过python访问数据库方法
Mar 03 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
在django中实现choices字段获取对应字段值
Jul 12 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 Python
Python集合的基础操作
Nov 01 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
使用apache模块rewrite_module (转)
2007/02/14 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
轻松搞定js表单验证
2016/10/13 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
关于Vue中$refs的探索浅析
2020/11/05 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
详解python中的文件与目录操作
2017/07/11 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
python数据封装json格式数据
2018/03/04 Python
python使用pandas处理excel文件转为csv文件的方法示例
2019/07/18 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
Python基于xlutils修改表格内容过程解析
2020/07/28 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
python statsmodel的使用
2020/12/21 Python
会议邀请书范文
2014/02/02 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
物理系毕业生自荐书
2014/06/13 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
学生个人总结范文
2015/02/15 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis
MySQL查询日期时间
2022/05/15 MySQL