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下的twisted框架入门指引
Apr 15 Python
python实现的用于搜索文件并进行内容替换的类实例
Jun 28 Python
基于python yield机制的异步操作同步化编程模型
Mar 18 Python
Python抓取手机号归属地信息示例代码
Nov 28 Python
浅谈Python实现贪心算法与活动安排问题
Dec 19 Python
python购物车程序简单代码
Apr 18 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
python 实现批量替换文本中的某部分内容
Dec 13 Python
python如何实现图片压缩
Sep 11 Python
解决Python 写文件报错TypeError的问题
Oct 23 Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 Python
Python进行区间取值案例讲解
Aug 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
yii实现级联下拉菜单的方法
2014/07/31 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
PHP钩子实现方法解析
2019/05/21 PHP
js下利用控制器载入对应脚本
2010/07/17 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
2011/01/24 Javascript
jQuery bind事件使用详解
2011/05/05 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
详解JavaScript自定义函数
2020/07/29 Javascript
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
python在每个字符后添加空格的实例
2018/05/07 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
软件测试面试题
2015/10/21 面试题
法制宣传实施方案
2014/03/13 职场文书
心理健康活动总结
2014/04/30 职场文书
产品设计开发计划书
2014/05/07 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
教师党员自我评价范文
2015/03/04 职场文书
预防艾滋病宣传活动总结
2015/05/09 职场文书
预备党员介绍人意见
2015/06/01 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
使用feign服务调用添加Header参数
2021/06/23 Java/Android
使用 Apache 反向代理的设置技巧
2022/01/18 Servers
MySQL实现配置主从复制项目实践
2022/03/31 MySQL