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内置数据结构与操作符的练习题集锦
Jul 01 Python
Python中强大的命令行库click入门教程
Dec 26 Python
在 Python 应用中使用 MongoDB的方法
Jan 05 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
Python二叉搜索树与双向链表转换算法示例
Mar 02 Python
python程序文件扩展名知识点详解
Feb 27 Python
学习Python列表的基础知识汇总
Mar 10 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
python字典的值可以修改吗
Jun 29 Python
call在Python中改进数列的实例讲解
Dec 09 Python
Python wordcloud库安装方法总结
Dec 31 Python
Python 中如何使用 virtualenv 管理虚拟环境
Jan 21 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
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
动态加载iframe
2006/06/16 Javascript
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
javascript 通用loading动画效果实例代码
2014/01/14 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
numpy linalg模块的具体使用方法
2019/05/26 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
使用Django搭建网站实现商品分页功能
2020/05/22 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
DNA基因检测和分析:23andMe
2019/05/01 全球购物
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python
ORACLE中dbms_output.put_line输出问题的解决过程
2022/06/28 Oracle
MySQL数据库查询之多表查询总结
2022/08/05 MySQL
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js