我试图为脑电图(EEG)数据集制作一个高通滤波器,以消除非常缓慢的漂移。但是,0.3 Hz左右的频率对于研究这些数据非常重要。

我使用Matlab,尝试了各种方法。似乎使用FIR滤波器可以实现3 dB的极低dB衰减。例如,我曾经使用过:

h=fdesign.highpass('Fst,Fp,Ast,Ap',0.005,0.01,3,1,250); % i needed to cut 
d=design(h,'butter');
fvtool(d)


但是此滤波器在数据开始时会产生直流漂移,因此我不希望丢失这些第一个数据点。

我已经读完您的书,聪明的想法是设计一个低通滤波器,以后再从真实数据中减去。我用等波纹滤光片进行了过滤,结果正常,但基线上升。我现在不想运行平均去除,因为这是分析协议的下一步。

有什么建议吗?

评论

那么问题仅仅是滤波器的初始响应?这些预先记录的数据是否可以仅以零开头还是实时的?

低通减法也会遇到您遇到的问题。问题是每个滤波器都有延迟。像您想要的那样具有急剧截止的滤波器可能会有很长的延迟。我不确定为什么接下来要进行平均清除;您显示的滤波器的DC增益为零,因此没有可去除的平均值(由于滤波器的延迟,输出开始时的瞬态周期除外)。

#1 楼

您需要一台时间机器:为了避免$ t = 0 $处的DC冲击,您需要知道过滤器的状态,就像它在开始录制之前就已经在运行一样。无论您使用哪种过滤器,都不会发生这种情况。

这是一个技巧,可能对您有用。假设您有一个$ N $抽头的FIR滤波器(或一个IIR滤波器,其脉冲响应在经过$ N $采样后会充分衰减到0)。采集信号的前$ N $个样本,将其取反,然后将其放在信号的开头。实际上,我们正在定义新信号$ g(t)= g(-t)= f(t)$以进行过滤。当您对此进行过滤时,过滤器状态将已被初始信号“启动”:删除输出的前$ N $个采样,并且希望直流凸点消失。

不需要也就是说,该方案有很多陷阱-对于初学者来说,实时处理比较困难,并且如果信号导数高至$ t = 0 $,则前几个样本仍然会遇到信任问题。但它应该摆脱颠簸。

#2 楼

看一下filtfilt函数。它提供了零相位响应和完美的阶跃响应。特别是,filtfilt过滤的阶跃响应特性可以解决您的问题。

#3 楼

rtollert先生解释了我的窍门,并认为这是我能做的最好的事情。

如果您采用连续采样/硬件补偿的方法,那么效率可能会让您对DC阻塞器感兴趣,如dsp Tips&Tricks中的Randy Yates和Richard Lyons,2008年3月

#4 楼

我尝试了一些效果很好的方法-对于指定的放大器。 Matlab代码在这里:https://sites.google.com/site/marialstavrinou/home/dc-offset-removal-filter-in-matlab。

#5 楼

您是否在乎DC的绝对值,对吗?

为什么不只是在数据中添加静态偏移以使第一个数据点为零?

当然,您必须将偏移量添加到每个数据点,但这将完全避免您在使用过滤器时出现较大的阶跃响应问题。

有效地,过滤器启动初始化为零。因此,当您的数据开始时,过滤器会看到从零到您所拥有的任何DC电平都有很大的阶梯。

只需添加偏移量即可消除阶梯。

#6 楼

为什么不进行平均清除?再次执行此操作的后续步骤只是无效(将减零)。

评论


$ \ begingroup $
这更像是一个查询,并不是真正的问题答案。尽管这个问题太老了,但在此时此刻似乎毫无意义,也许可以作为评论的适当地点。
$ \ endgroup $
–山姆·马洛尼(Sam Maloney)
13年5月14日在20:19