低频 (1Hz) 高通滤波器

信息处理 高通滤波器
2022-02-07 12:43:30

我试图从脉搏血氧仪中获得可用的波形,但是有一个讨厌的 DC 偏压会时不时地变化,所以我不能简单地从中减去 DC 偏压并获得长期可用的结果。我还尝试取一个适当的采样运行平均值,然后从我的波形中减去它,它给了我比以前更好的结果。

但是,有人告诉我 DSP 高通滤波器会更好地工作,我正在尝试实现它。我不是电气工程师,对滤波器了解不多,对 DSP 也完全不了解。我找到了这个很棒的网站,它让我可以设计一个 DSP 过滤器,并为我提供了一个 C++ 库来在我的代码中使用该过滤器。

问题是,我想设计一个滤波器,它可以在 1Hz 以下截断,并允许任何高于 1Hz 或 1.3Hz 的频率通过。我的血氧仪波是 1.4Hz。但是我上面提到的设计工具似乎表明这是不可能的。

对此的任何帮助将不胜感激。

[编辑]

我终于设法让它工作了一点,但直流偏压仍然存在。(红线是从该网站过滤器过滤的数据,蓝线是从输入信号中减去的移动平均值) 过滤数据

这是滤波器的频率增益图 筛选

1个回答

但是有一个讨厌的直流偏差,时不时地变化

解决这个问题,如果可以的话。如果它突然改变,那么你拥有的任何过滤器都会在改变之后产生奇怪的结果,直到它再次稳定下来。

所以这就是你想要的算法(注意伪 C 伪代码——数据类型取决于你):

static state_t state = 0;
static const cutoff_frequency = 1.0;
static const state_t gain = cutoff_frequency / (2 * PI * sampling_rate);

input_t highpass(input_t input) {
    input_t retval = input - state;
    state += gain * retval;
    return retval;
}

state_t由你决定——选择 64 位或更长的浮点是最简单的;除了几乎可以肯定会起作用的速度或空间问题。其他任何事情,您都需要担心截断。我假设这input_t是一些整数类型——如果它是无符号的,你需要做一些转换,这样函数的第一行才能工作。

这样做是通过对输入数据制作一阶无限脉冲响应低通滤波器来制作高通滤波​​器,具有单位增益,并从输入中减去它。只要您的变量有足够的精度,函数的第二行就可以确保输出确实被伺服到零的平均值。

由您来确保输入的极值不会溢出,并且state_tgain它们组合在一起以使函数的第二行不会下溢(即,如果输入以最小的增量变化,state仍然“看到”retval乘以 后的差异gain