几个月前,我不得不在Java中实现二维傅立叶变换。虽然结果对于一些手动检查似乎是理智的,但我想知道一个好的测试驱动方法会是什么样子。
基本上我所做的是我查看了DC组件的合理值,并比较了AC组件,如果它们大致匹配Mathematica输出。
我的问题是:您将为离散傅里叶变换实施哪些单元测试?您如何验证计算返回的结果?
答案 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库会执行一些与定点问题相关的额外测试 - 如果您在浮点工作,则不会出现问题。