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写的贪吃蛇游戏例子
Jun 16 Python
Python实现简单的代理服务器
Jul 25 Python
Python如何获取系统iops示例代码
Sep 06 Python
Python中协程用法代码详解
Feb 10 Python
python中scikit-learn机器代码实例
Aug 05 Python
对python调用RPC接口的实例详解
Jan 03 Python
Python如何获得百度统计API的数据并发送邮件示例代码
Jan 27 Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
python yield和Generator函数用法详解
Feb 10 Python
Python更改pip镜像源的方法示例
Dec 01 Python
numpy实现RNN原理实现
Mar 02 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
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
js拼接html字符串的注意事项
2016/10/13 Javascript
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
JS实现的Unicode编码转换操作示例
2017/04/28 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
使用OPENLAYERS3实现点选的方法
2020/09/24 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
vue webpack重写cookie路径的方法
2019/07/10 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
python基于pygame实现响应游戏中事件的方法(附源码)
2015/11/11 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
Python 装饰器使用详解
2017/07/29 Python
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
python requests.post带head和body的实例
2019/01/02 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
Python偏函数Partial function使用方法实例详解
2020/06/17 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
解决Pymongo insert时会自动添加_id的问题
2020/12/05 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
学习十八大报告感言
2014/02/28 职场文书
涉密人员保密承诺书
2014/05/28 职场文书
低碳环保口号
2014/06/12 职场文书
安全标兵事迹材料
2014/08/17 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书