我正在使用 Apple 的 Accelerate Framework、vDSP biquad 函数https://developer.apple.com/documentation/accelerate/1450838-vdsp_biquad?language=objc#parameters来模拟python 的sosfilt函数。我已经完成了所有的过滤,但请注意我有试图去除的瞬态信号。在 python 中,这是通过从sosfilt_zi https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.sosfilt_zi.html#scipy.signal.sosfilt_zi中找到初始条件并乘以第一个元素来完成的在被过滤的数据中。我跟着这个神奇的例子Matlab filtfilt() 在 Java 中的函数实现。
当我使用sosfilt_zi在 python 中打印出初始条件时,我得到每个部分的两个值(我使用的是二阶级联),所以我总共有四个值。
然而,在 iOS 的单通道双二阶函数中,他们要求(2*M)+2作为延迟。我假设初始条件与延迟有关,这是我需要更改的,以便调整我的信号并消除瞬态。
iOS 中双二阶函数的延迟参数的函数定义是“一个单精度值数组,该数组使用直接形式 1 “过去”状态数据初始化,用于双二阶的每个部分。数组的长度应为 (2 * M) + 2,其中 M 是段数。对于每个段 m,Delay[2 m:2 m+1] 表示段 m 的两个延迟输入值,Delay[2 M:2 M+1] 表示过滤器的两个延迟输出值。此函数执行后,此数组包含过滤器的最终状态数据。
如果我有 2 个部分,那么我的延迟数组应如下所示:
[0:1] - 第 0 部分的输入延迟值
[2:3] - 第 1 部分的输入延迟值
[4:5] - 输出延迟值
我最初将延迟设置为 6 个零的数组。如果sosfilt_zi的输出是延迟的两个输入部分的正确值,那么我如何找到滤波器的延迟输出值?
是否有人熟悉 vDSP 并能够去除瞬态信号,或者可以解释如何调整级联二阶部分的延迟值?调整延迟值是否正确,如何在 python 中获取这些值?
我在想我的延迟数组看起来像(使用下面第二个链接中显示的值):
[0.72095219 -0.28358224] - 第 0 节
[-0.80004591 0.80004591] - 第 1 节
但是,如果这是正确的,我不知道该输出会是什么。我会很感激任何帮助!我发现关于 iOS biquad 函数的文档或示例非常少。谢谢!