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生成指定尺寸缩略图的示例
May 07 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
python生成器与迭代器详解
Jan 01 Python
Python基于滑动平均思想实现缺失数据填充的方法
Feb 21 Python
python使用Plotly绘图工具绘制水平条形图
Mar 25 Python
Python下简易的单例模式详解
Apr 08 Python
python爬虫-模拟微博登录功能
Sep 12 Python
Django框架模板用法入门教程
Nov 04 Python
如何运行带参数的python脚本
Nov 15 Python
Python基于gevent实现高并发代码实例
May 15 Python
PyChon中关于Jekins的详细安装(推荐)
Dec 28 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中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
国外比较好的几个的Php开源建站平台小结
2010/04/22 PHP
discuz目录文件资料汇总
2014/12/30 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
JS继承--原型链继承和类式继承
2013/04/08 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
Python 获取当前所在目录的方法详解
2017/08/02 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
python pyinstaller 加载ui路径方法
2019/06/10 Python
python匿名函数用法实例分析
2019/08/03 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
德国帽子专家:Hutshopping
2019/11/03 全球购物
编写strcpy函数
2014/06/24 面试题
会计学专业学生的求职信范文
2014/01/27 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
《鸿门宴》教学反思
2014/04/22 职场文书
2016寒假假期总结
2015/10/10 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers