滤波器和频域直接置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:19 编辑
写错,不知道该怎么删除 本帖最后由 isnowran 于 2015-11-1 18:19 编辑
写错,不知道该怎么删除 第一种是通过FIR或IIR数字滤波吧,可实现实时连续处理。
第二种是通过FFT吧,是一种后处理方式,两个经过FFT处理后的数据段之间返回时域后可能不连续。 本帖最后由 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,能算作滤波的方法么?如果算的话,那跟巴特沃斯这种方法比较,有啥区别呢?
纯信号处理小白中的小白,问题貌似很愚蠢,请大家多包涵 两者都行。如果是已经采集到一段数据,再对采集到的数据做处理,那么FFT可能更好处理点,至少不会出现FIR/IIR初始那段数据不可用的问题。
页:
[1]