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 06 Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 Python
深入理解python中的atexit模块
Mar 07 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
python使用筛选法计算小于给定数字的所有素数
Mar 19 Python
python excel使用xlutils类库实现追加写功能的方法
May 02 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
Nov 14 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
python输出决策树图形的例子
Aug 09 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
Jan 10 Python
python 动态绘制爱心的示例
Sep 27 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
中英文字符串翻转函数
2008/12/09 PHP
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
jQuery实现渐变下拉菜单的简单方法
2015/03/11 Javascript
Node.js实现数据推送
2016/04/14 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
python原始套接字编程示例分享
2014/02/21 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
Python中collections模块的基本使用教程
2018/12/07 Python
把pandas转换int型为str型的方法
2019/01/29 Python
基于python if 判断选择结构的实例详解
2019/05/06 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
Python OpenCV实现测量图片物体宽度
2020/05/27 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
解释一下抽象方法和抽象类
2016/08/27 面试题
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
日语专业求职信
2014/07/04 职场文书
八一建军节慰问信
2015/02/14 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
详解分布式系统中如何用python实现Paxos
2021/05/18 Python
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle