首页 > 解决方案 > vDSP Biquad 快速删除瞬态信号

问题描述

我正在使用 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 函数的文档或示例非常少。谢谢!

巴特沃斯带通滤波器 - 正在应用初始条件

sosfilt_zi 的输出 - 给出初始条件

来自 iOS vDSP 的 Biquad 滤波器的结果在顶部和带有初始条件的 sosfilt 的结果在底部

正在初始化的延迟

双二阶函数

标签: swiftsignal-processingaccelerate

解决方案


推荐阅读