声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1529|回复: 5

[滤波] 滤波器和频域直接置0的区别

[复制链接]
发表于 2015-11-1 17:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 isnowran 于 2015-11-1 18:18 编辑

请教一个问题,在心电图的波形上,要除去50hz的工频噪音
1. 用50hz的带通滤波
2. 手动先FFT,再把频域的50hz附近的数值置0,再iFFT算回心电波形,有区别么?
  1. def FFT_ft():
  2.     signal = sin(linspace(0, 4*2*pi, 1000))
  3.     noise = sin(linspace(0, 50*2*pi, 1000))
  4.     sig2 = signal + noise
  5.    
  6.     plot(sig2)
  7.     show()
  8.    
  9.     fft1d = np.fft.rfft(sig2)
  10.     plot(fft1d[:100], "-*")
  11.     show()
  12.    
  13.     fft1d[40:60] = 0
  14.     plot(fft1d[:100], "-*")
  15.     show()

  16.     plot(np.fft.irfft(fft1d))
  17.     show()
复制代码

第一幅图,是原始信号+50hz噪音
第二幅图,是手工把频域40hz~60hz范围置0后,再ifft回波形

原始

原始

50hz置零

50hz置零
回复
分享到:

使用道具 举报

 楼主| 发表于 2015-11-1 18:10 | 显示全部楼层
本帖最后由 isnowran 于 2015-11-1 18:19 编辑
  1. 写错,不知道该怎么删除
复制代码
 楼主| 发表于 2015-11-1 18:12 | 显示全部楼层
本帖最后由 isnowran 于 2015-11-1 18:19 编辑

写错,不知道该怎么删除
发表于 2015-11-1 18:53 | 显示全部楼层
第一种是通过FIR或IIR数字滤波吧,可实现实时连续处理。
第二种是通过FFT吧,是一种后处理方式,两个经过FFT处理后的数据段之间返回时域后可能不连续。
 楼主| 发表于 2015-11-2 11:08 | 显示全部楼层
本帖最后由 isnowran 于 2015-11-2 12:01 编辑
  1.     def xpass_fc(fc, HZ):
  2.         return 1.0 * fc / (HZ / 2)
  3.    
  4.     fl, fh = xpass_fc(fc_low, HZ), xpass_fc(fc_high, HZ)
  5.     fcs = np.array([fl, fh])
  6.     b, a = sig.butter(pole, fcs, "bandstop")
  7.     vs_filter = sig.lfilter(b, a, ppgs)
  8.     return vs_filter
  9.    
  10. def FFT_ft():
  11.     size = 400
  12.     sig = sin(linspace(0, 4*2*pi, size)) # 4hz 信号
  13.     noise = sin(linspace(0, 50*2*pi, size)) # 50hz 噪声
  14.     sig2 = sig + noise # 数据叠加
  15.    
  16.     # 原始波形 时域
  17.     title("ori")
  18.     plot(sig2)
  19.     show()
  20.    
  21.     # 原始波形 频域
  22.     fft1d = np.fft.rfft(sig2)
  23.     title("ori frequency")
  24.     plot(fft1d[:100], "-")
  25.     show()
  26.    
  27.     # fft 滤波结果
  28.     fft1d[40:60] = 0
  29.     title("fft filter, 40~60 hz set zero")
  30.     plot(np.fft.irfft(fft1d))
  31.     show()
  32.    
  33.     # 巴特沃斯滤波结果
  34.     sig_filter = filter_bandstop(detrend(sig2), 4, size, 40, 60)
  35.     title("fir butter bandstop filter, 40~60")   
  36.     plot(sig_filter)
  37.     show()   
复制代码


一共有四个图例
前两张:原始信号+噪声的波形,以及频率分布(4hz和50hz)
第三张:通过计算fft,并且手工把40~60hz置零后,再ifft还原到波形的结果(有点毛刺)
第四张:通过fir巴特沃斯滤波器,带阻40~60hz的结果

我想请教的是,fft后直接置0,能算作滤波的方法么?如果算的话,那跟巴特沃斯这种方法比较,有啥区别呢?

纯信号处理小白中的小白,问题貌似很愚蠢,请大家多包涵
屏幕快照 2015-11-02 下午12.00.40.png
屏幕快照 2015-11-02 下午12.01.50.png
发表于 2015-11-2 21:13 | 显示全部楼层
两者都行。如果是已经采集到一段数据,再对采集到的数据做处理,那么FFT可能更好处理点,至少不会出现FIR/IIR初始那段数据不可用的问题。

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-29 18:46 , Processed in 0.066087 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表