几个月前,我不得不用Java实现二维傅立叶变换。尽管对于一些手动检查结果似乎理智,但我想知道一种好的测试驱动方法会是什么样。
基本上,我所做的就是查看直流分量的合理值,并比较交流分量(如果它们与Mathematica输出大致匹配)。
我的问题是:对于离散傅立叶变换,您将实施哪些单元测试?您将如何验证计算返回的结果?
最佳答案
至于其他单元测试,则应考虑使用较小的固定输入测试向量,可以轻松手动计算结果并进行比较。对于更复杂的输入测试向量,直接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))
当i = 0,1,2,...,N-1时,输入为cos(8 * 2 * pi * i / N)。
当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/)。
关于java - 单元测试离散傅立叶变换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25298119/