【发布时间】:2021-04-17 00:48:09
【问题描述】:
我正在尝试在 C++ 中实现 scipy.signal.filtfilt 函数,我想知道是否已经有可用的实现?
【问题讨论】:
标签: c++ signals signal-processing
我正在尝试在 C++ 中实现 scipy.signal.filtfilt 函数,我想知道是否已经有可用的实现?
【问题讨论】:
标签: c++ signals signal-processing
filtfilt 应用 IIR 滤波器两次,一次向前,一次向后。重要的部分是如何在边界处初始化 IIR 滤波器。
作为一个起点,看看scipy.signal.filtfilt 是如何做到的。这是代码: https://github.com/scipy/scipy/blob/master/scipy/signal/signaltools.py#L3870
您可能还会发现查看 Octave 的 filtfilt(M 代码)的源代码很有用: https://sourceforge.net/p/octave/signal/ci/default/tree/inst/filtfilt.m
要在 C++ 中重现 filtfilt,您需要 IIR 过滤的 C++ 实现来扮演 scipy 的 lfilter 的角色以及一些边界处理逻辑。我不知道 filtfilt 的现有 C++ 实现,但至少对于默认的method='pad' 逻辑,核心计算似乎很简单,可以考虑直接移植。
【讨论】:
Scipy 的 filtfilt 类似于 Matlab's filtfilt。
MATLAB's filtfiltwas previously asked的问题
@darien-pardinas 对同一 was previously shared on Stackoverflow 的实现
请注意我说的是similar because as mentioned by@paco-wong
不同之处在于默认填充长度。在matlab的filtfilt中为3*(max(len(a), len(b)) - 1),在scipy的filtfilt中为3*max(len(a), len(b))。
所以你必须考虑到这一点
【讨论】: