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列表与元组详解实例
Nov 01 Python
python下setuptools的安装详解及No module named setuptools的解决方法
Jul 06 Python
Django使用Celery异步任务队列的使用
Mar 13 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
详解python里的命名规范
Jul 16 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
Jun 13 Python
pytorch 归一化与反归一化实例
Dec 31 Python
python代码如何实现余弦相似性计算
Feb 09 Python
Python实例方法、类方法、静态方法区别详解
Sep 05 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
tensorboard 可视化之localhost:6006不显示的解决方案
May 22 Python
python+opencv实现目标跟踪过程
Jun 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
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
PHP查询分页的实现代码
2017/06/09 PHP
JQuery Tips(2) 关于$()包装集你不知道的
2009/12/14 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
JavaScript数组push方法使用注意事项
2017/10/30 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
Python 的类、继承和多态详解
2017/07/16 Python
深入理解Python中的super()方法
2017/11/20 Python
快速查询Python文档方法分享
2017/12/27 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
Python实现代码块儿折叠
2020/04/15 Python
python实现批处理文件
2020/07/28 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
财务人员入职担保书
2015/09/22 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
浅析MongoDB之安全认证
2021/06/26 MongoDB
python3操作redis实现List列表实例
2021/08/04 Python
Linux安装apache服务器的配置过程
2021/11/27 Servers
Win11 BitLocker 驱动器加密
2022/04/19 数码科技
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers