如何测试数字滤波器?

信息处理 过滤器 过滤器设计 带通 软件实现
2021-12-20 03:17:15

首先是问题:

我应该如何在软件中为数字滤波器(带通/带阻)编写单元测试?我应该测试什么?是否有任何用于过滤的规范测试套件?

如何选择测试输入,生成预期输出,并以我可以说实际输出符合预期输出的方式定义“一致性”?

现在的上下文:

我正在开发的应用程序(肌电信号采集和分析)需要使用数字滤波,主要是带通和带阻滤波(Visual Studio 中的 C#/.Net)。

我们应用程序的先前版本使用我们可以使用的一些遗留代码实现了这些过滤器,但我们不确定它在数学上的正确性,因为我们没有对它们进行单元测试。

除此之外,我们还在评估Mathnet.Filtering,但他们的单元测试套件还不包括子类OnlineFilter

我们不确定如何评估一个过滤库而不是另一个,我们得到的最接近的方法是过滤一些正弦波以观察它们之间的差异。对于单元测试,这也不是一个好方法,这是我们希望自动化的(而不是运行脚本并在其他地方评估结果,甚至是可视化的)。

我想一个好的测试套件应该测试类似的东西?

  • 线性和时间不变性:我应该如何为此编写自动化测试(带有布尔值,“通过或失败”断言)?
  • 脉冲响应:向滤波器提供脉冲响应,获取其输出,并检查它是否“符合预期”,在这种情况下:
    • 我将如何定义预期响应?
    • 我将如何定义一致性
  • 正弦输入的幅度响应;
  • 阶跃/恒定偏移输入的幅度响应;
  • 频率响应(包括半功率、截止、斜率等)

我不能被认为是编程或 DSP 方面的专家(远非如此!),这正是我对“似乎”运作良好的过滤器持谨慎态度的原因。对于我们来说,客户质疑我们的过滤算法是很常见的(因为他们需要发布使用我们的系统捕获数据的研究),我希望有正式的证据证明过滤器按预期工作。

1个回答

至少对此有一些想法。

首先,如果您可以显示线性度和时不变性,并且您知道滤波器具有正确的脉冲响应,那么您就回家了。假设过滤器是稳定的。所以在这种情况下,不需要运行不同的其他输入信号,频率响应是基于脉冲响应给出的。

检查脉冲响应显然非常简单。我猜线性和时不变性实际上非常复杂(您测试的任何特定输入信号可能只是巧合,但其他可能不是)。但是,由于大多数情况下的过滤器代码不应该那么复杂,因此应该可以观察代码并看到它是否符合预期(没有非线性运算符,没有基于信号值的 if-cases 等)。

保持稳定。对于 IIR 滤波器,这是一个非常复杂的问题,我不会进行讨论。对于 FIR 滤波器,它们将始终是稳定的(除非它们是使用某种递归算法实现的)。但是,您可能会遇到与溢出(很可能不是下溢)和舍入噪声有关的数值问题。您可以找到 FIR 滤波器不会溢出的正式证明(最大输出是脉冲响应系数的绝对值乘以最大输入幅度的总和)。对于舍入误差,您可以找到统计表达式,但它们在正式证明任何事情时没有多大用处(而是作为“无限精度”的预期输出和实际输出仍然符合的论点)。

也不是所有的脉冲响应等都应该使用实际的(可能是四舍五入的)系数而不是从滤波器设计工具获得的(可能更高精度的)系数来评估。这是因为滤波器将始终实现由它使用的系数给出的传递函数,无论它们是如何导出的。不过,这可能仍然不是您在输出中获得的脉冲响应,因为可能存在舍入问题。看到这一点的一种简单方法是使用缩放脉冲(即不是一个)并注意通常不仅频率响应的幅度会改变,而且形状也会改变。滤波器仍将实现相同的传递函数,但添加到两个不同输入信号的舍入噪声不同。

希望这能给你更多的见解。