isnowran 发表于 2015-11-1 17:33

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

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

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

    plot(np.fft.irfft(fft1d))
    show()

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

isnowran 发表于 2015-11-1 18:10

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

写错,不知道该怎么删除

isnowran 发表于 2015-11-1 18:12

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

写错,不知道该怎么删除

TestGuru 发表于 2015-11-1 18:53

第一种是通过FIR或IIR数字滤波吧,可实现实时连续处理。
第二种是通过FFT吧,是一种后处理方式,两个经过FFT处理后的数据段之间返回时域后可能不连续。

isnowran 发表于 2015-11-2 11:08

本帖最后由 isnowran 于 2015-11-2 12:01 编辑

    def xpass_fc(fc, HZ):
      return 1.0 * fc / (HZ / 2)
   
    fl, fh = xpass_fc(fc_low, HZ), xpass_fc(fc_high, HZ)
    fcs = np.array()
    b, a = sig.butter(pole, fcs, "bandstop")
    vs_filter = sig.lfilter(b, a, ppgs)
    return vs_filter
   
def FFT_ft():
    size = 400
    sig = sin(linspace(0, 4*2*pi, size)) # 4hz 信号
    noise = sin(linspace(0, 50*2*pi, size)) # 50hz 噪声
    sig2 = sig + noise # 数据叠加
   
    # 原始波形 时域
    title("ori")
    plot(sig2)
    show()
   
    # 原始波形 频域
    fft1d = np.fft.rfft(sig2)
    title("ori frequency")
    plot(fft1d[:100], "-")
    show()
   
    # fft 滤波结果
    fft1d = 0
    title("fft filter, 40~60 hz set zero")
    plot(np.fft.irfft(fft1d))
    show()
   
    # 巴特沃斯滤波结果
    sig_filter = filter_bandstop(detrend(sig2), 4, size, 40, 60)
    title("fir butter bandstop filter, 40~60")   
    plot(sig_filter)
    show()   

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

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

纯信号处理小白中的小白,问题貌似很愚蠢,请大家多包涵

TestGuru 发表于 2015-11-2 21:13

两者都行。如果是已经采集到一段数据,再对采集到的数据做处理,那么FFT可能更好处理点,至少不会出现FIR/IIR初始那段数据不可用的问题。

页: [1]
查看完整版本: 滤波器和频域直接置0的区别