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 相关文章推荐
sublime text 3配置使用python操作方法
Jun 11 Python
在pycharm中python切换解释器失败的解决方法
Oct 29 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
python 计算数据偏差和峰度的方法
Jun 29 Python
Python Pandas 获取列匹配特定值的行的索引问题
Jul 01 Python
Django 外键的使用方法详解
Jul 19 Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 Python
Python实现剪刀石头布小游戏(与电脑对战)
Dec 31 Python
python程序文件扩展名知识点详解
Feb 27 Python
Python常用库Numpy进行矩阵运算详解
Jul 21 Python
Python CategoricalDtype自定义排序实现原理解析
Sep 11 Python
python和opencv构建运动检测器的实现
Mar 03 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 date()日期时间函数详解
2010/05/16 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
Javascript 解疑
2009/11/11 Javascript
jQuery 连续列表实现代码
2009/12/21 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
vue项目部署到nginx/tomcat服务器的实现
2019/08/26 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
在Python的Django框架中创建语言文件
2015/07/27 Python
python实现用户登录系统
2016/05/21 Python
Python时间获取及转换知识汇总
2017/01/11 Python
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
朴素贝叶斯Python实例及解析
2018/11/19 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
python批量处理文件或文件夹
2020/07/28 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
女大学生自我鉴定
2013/12/09 职场文书
我为自己代言广告词
2014/03/18 职场文书
读书笔记怎么写
2015/07/01 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
python使用glob检索文件的操作
2021/05/20 Python
详细介绍python类及类的用法
2021/05/31 Python