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递归计算N!的方法
May 05 Python
Python监控主机是否存活并以邮件报警
Sep 22 Python
Python用threading实现多线程详解
Feb 03 Python
Python中asyncio模块的深入讲解
Jun 10 Python
python分割一个文本为多个文本的方法
Jul 22 Python
利用Python实现kNN算法的代码
Aug 16 Python
从pandas一个单元格的字符串中提取字符串方式
Dec 17 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
利用python 读写csv文件
Sep 10 Python
python实现人性化显示金额数字实例详解
Sep 25 Python
PyCharm最新激活码(2020/10/27全网最新)
Oct 27 Python
python中pyplot基础图标函数整理
Nov 10 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 ADODB实现分页功能简单示例
2018/05/25 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
jquery统计输入文字的个数并对其进行判断
2014/01/07 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
JavaScript函数参数的传递方式详解
2017/03/06 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
基于Python List的赋值方法
2018/06/23 Python
python求最大连续子数组的和
2018/07/07 Python
django项目中新增app的2种实现方法
2020/04/01 Python
django 实现简单的插入视频
2020/04/07 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
行政管理人员精品工作推荐信
2013/11/04 职场文书
酒店前厅员工辞职信
2014/01/08 职场文书
高中运动会入场词
2014/02/14 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
小学三好学生事迹材料
2014/08/15 职场文书
争做文明公民倡议书
2014/08/29 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
初三毕业感言
2015/07/31 职场文书
2016中秋节广告语
2016/01/28 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js