信号处理库的测试驱动开发

lea*_*vst 12 language-agnostic audio tdd unit-testing signal-processing

我使用音频操作,通常使用Matlab进行原型设计,使用C++进行实现.最近,我一直在阅读TDD.我查看了几个基本的例子,对这个范例非常热衷.

目前,我使用的是我认为全球"测试辅助"的方法.为此,我用C++编写信号处理块,然后创建一个可以与我的类接口的简单Matlab mex文件.我随后添加了功能,检查结果是否与我去的等效Matlab脚本相匹配.这项工作正常,但随着系统的发展,测试很快就会过时.更确切地说,我正在测试整个系统,而不仅仅是单位.

使用已建立的TDD框架会很好,我可以拥有一个测试套件,但我没有看到如何验证处理块的功能,而不需要像测试中的代码那样复杂的测试.如何在C++测试中生成参考信号以验证处理块而不将测试作为自我实现预言的一种形式?

如果有人有这方面的经验,或者可以提出一些我可以阅读的方法,那就太棒了.

the*_*ill 3

我认为将 TDD 方法应用于信号处理是非常棒的(如果我几年前在自己进行信号处理时知道这一点,它会节省我几个月的时间)。我认为关键是将系统分解为可以独立测试的最低级别组件,例如:

  • FFT:测试已知频率的信号:DC、Fs/Nfft、Fs/2 和不同相位等。检查峰值和相位是否符合您的预期,检查归一化常数是否符合您的预期
  • 峰值选取:测试您是否正确找到最大值/最小值
  • 滤波器:生成已知频率的输入并检查输出幅度和相位是否符合预期。

您不太可能在 C++ 和 Matlab 之间获得完全相同的结果,因此您必须提供某些测试的误差范围。TDD 是一种很好的方法,不仅可以验证代码的正确性,而且在尝试不同的实现时也非常有用。例如,如果您想将一种 FFT 实现替换为另一种 FFT 实现,则数据打包方式或使用的归一化常数通常会略有不同。TDD 将使您对新库正确集成充满信心。