是否需要对数据进行下采样以过滤低频?

信息处理 matlab 过滤器
2022-02-24 21:32:08

我的数据采样于fs=32kHz,对于特定的分析,我只对来自特定频率的信号感兴趣fhighpass=0.1Hzflowpass=300 Hz.

当我建立一个四阶巴特沃斯滤波器并将其应用于我的数据时,我得到一个错误,并且信号所剩无几。下面是一些 Matlab 代码:

order = 4;
[b,a] = butter(order, [0.1 300]/(32000/2), 'bandpass');
y = filtfilt(b,a,data);

我得到的错误信息是:Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.101227e-16.

我还尝试先应用低通滤波器,然后再应用高通滤波器:

FOI = [0.1 300]
SampleRate = 32000;
[b_l,a_l] = butter(order, FOI(2)/(SampleRate/2), 'low' );
[b_h,a_h] = butter(order, FOI(1)/(SampleRate/2), 'high' );
tempData = filtfilt(b_l, a_l, data);
output = filtfilt(b_h, a_h, tempData);

但我一直得到相同的结果。

我的问题:

  • 为什么过滤失败?
  • 为什么使用顺序 3 的过滤有效但不适用于顺序 4?
  • 在进行过滤之前,我是否需要对数据进行下采样(例如到 1kHz)?

编辑:其他人也遇到了同样的问题,但我正在寻找一个明确的答案。

EDIT2:如果我将高通值更改为1并在低通滤波之前进行高通滤波,一切正常。但为什么?为什么会0.1导致问题的截止?

1个回答

是的,如果您首先对数据进行下采样,您可以获得更好的结果。出现问题是因为相对于原始数据采样率的过渡带宽度非常小。在设计或实现数字滤波器时,这可能会导致数值问题。随着滤波器阶数的增加,问题只会变得更糟,尤其是使用 IIR 滤波器。

话虽如此,在某些情况下,如果将过滤器转换为二阶部分,您可能会获得更大的成功(即更好的数值稳定性) 。但是,对于这种情况,我认为正确的答案是首先对数据进行下采样。

由于带通滤波器低端的截止频率非常小,可能会出现此问题。过渡带的空间很小(小于 0.1 Hz,即采样率的 1/320000),这很难实现。如果您尽可能地对数据进行下采样,那么您至少可以将这个比率提高很多,这应该会给您带来更好的结果。

如果可能的话,我也会尝试使用 FIR 滤波器实现,因为它们通常由于缺乏反馈而具有出色的数值稳定性。