单元测试离散傅里叶变换

时间:2014-08-14 00:06:04

标签: java unit-testing fft

几个月前,我不得不在Java中实现二维傅立叶变换。虽然结果对于一些手动检查似乎是理智的,但我想知道一个好的测试驱动方法会是什么样子。

基本上我所做的是我查看了DC组件的合理值,并比较了AC组件,如果它们大致匹配Mathematica输出。

我的问题是:您将为离散傅里叶变换实施哪些单元测试?您如何验证计算返回的结果?

2 个答案:

答案 0 :(得分:2)

对于其他单元测试,您应该考虑小的固定输入测试向量,可以轻松地手动计算结果并与之进行比较。对于更复杂的输入测试向量,直接DFT实现应该足够容易实现并用于交叉验证结果(可能在您自己的手动计算之上)。

就一维FFT的特定测试向量而言,您可以从dsprelated开始,他们选择这些来执行常见缺陷:

  
      
  • 单次FFT测试 - N个输入和N个输出   
        
    • 输入随机数据
    •   
    • 输入全部为零
    •   
    • 输入都是1(或其他非零值)
    •   
    • 输入在+1和-1之间交替。
    •   
    • 对于i = 0,1,2,...,N-1,输入是e ^(8 * j * 2 * pi * i / N)。 (j = sqrt(-1))
    •   
    • 输入为cos(8 * 2 * pi * i / N),i = 0,1,2,...,N-1。
    •   
    • 对于i = 0,1,2,...,N-1,输入是e ^((43/7)* j * 2 * pi * i / N)。 (j sqrt(-1))
    •   
    • 输入为cos((43/7)* 2 * pi * i / N),i = 0,1,2,...,N-1。
    •   
  •   
  • 多FFT测试 - 运行连续的随机数据集   
        
    • 数据集从0,N,2N,3N,4N,....开始。
    •   
    • 数据集从0,N + 1,2N + 2,3N + 3,4N + 4开始......
    •   
  •   

对于二维FFT,您可以在上面构建。前三种情况仍然可以直接应用(随机数据,全零,全部)。其他人需要更多的工作,但仍然可以管理小输入尺寸。 最后谷歌搜索应该产生一些参考图像(变换之前和之后)的一些常见情况,如黑&白色方块,矩形,圆圈可用作参考(例如参见http://www.fmwconcepts.com/misc_tests/FFT_tests/)。

答案 1 :(得分:2)

通过使用随机复杂载体进行测试,并与直接DFT 进行比较,可以找到99.9%的数字和编码问题。浮点精度的顺序。

零,恒定或正弦矢量可以让您的眼睛捕捉初始化,剪裁,折叠,缩放等问题,从而帮助理解失败。但他们通常不会找到随机案例所没有的任何内容。

我的kissfft库会执行一些与定点问题相关的额外测试 - 如果您在浮点工作,则不会出现问题。