我参与了实现 FFT 算法的工作,并且很好奇对于输入测试数据使用的推荐建议是什么——以及为什么!- 以及期望的准确性。
关于测试输入,我在旧的 Usenet 帖子中找到了一些指导,我将作为答案发布,但这只是一个人的建议,没有太多理由——我还没有找到任何看起来像可靠答案的东西。
关于准确性,维基百科说错误应该是 O(e log N),但是绝对意义上的合理期望是什么?
编辑补充:实际测试的形式是我存储了输入数据数组和预先计算的“参考”输出数据进行比较,所以我不一定需要封闭形式的解决方案。
我参与了实现 FFT 算法的工作,并且很好奇对于输入测试数据使用的推荐建议是什么——以及为什么!- 以及期望的准确性。
关于测试输入,我在旧的 Usenet 帖子中找到了一些指导,我将作为答案发布,但这只是一个人的建议,没有太多理由——我还没有找到任何看起来像可靠答案的东西。
关于准确性,维基百科说错误应该是 O(e log N),但是绝对意义上的合理期望是什么?
编辑补充:实际测试的形式是我存储了输入数据数组和预先计算的“参考”输出数据进行比较,所以我不一定需要封闭形式的解决方案。
如果要验证 FFT 算法的正确性,即它执行具有离散傅里叶变换已知特性的所需函数,则可以使用以下建议的方法:
尔根,方达。(1995 年,六月)。测试多元线性函数:克服生成器瓶颈。在过程中。第二十七安。ACM症状。计算理论。(第 407-416 页)。
上述论文被FFTW的制造商引用为他们选择的方法来验证特定的 FFT 实现是否做了它应该做的事情。所提出的技术将该功能提炼成三个主要组件,并通过单独的测试进行验证:
单位脉冲的 DFT:将等于 Kronecker delta 函数的时域信号应用于 FFT 算法的输入,并根据单位脉冲函数的已知 DFT 检查输出(它在所有输出中转换为常数值垃圾箱)。如果 FFT 算法提供了 IFFT,则可以对其进行反向测试,以表明它再次产生了单位冲激函数。
时移:将两组数据应用于FFT算法的输入;两者在时域中的唯一区别是恒定的时移。基于 DFT 的已知特性,这应该会影响两个信号的频域表示之间的已知线性相移,其中相移的斜率与时移成比例。
该论文的作者断言,这些测试足以验证 FFT 实现的正确性。我过去没有使用过这种技术,但它似乎是有道理的,而且我相信 FFTW 的作者(他们制作了一款很棒的免费软件)是解决验证问题的好方法的可靠权威。
正如问题中提到的,我确实在存档的 comp.dsp Usenet 帖子中找到了一组建议(http://www.dsprelated.com/showmessage/71595/1.php,由“tdillon”发布):
A.Single FFT tests - N inputs and N outputs
1.Input random data
2.Inputs are all zeros
3.Inputs are all ones (or some other nonzero value)
4.Inputs alternate between +1 and -1.
5.Input is e^(8*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
6.Input is cos(8*2*pi*i/N) for i = 0,1,2, ...,N-1.
7.Input is e^((43/7)*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
8.Input is cos((43/7)*2*pi*i/N) for i = 0,1,2, ...,N-1.
B.Multi FFT tests - run continuous sets of random data
1.Data sets start at times 0, N, 2N, 3N, 4N, ....
2.Data sets start at times 0, N+1, 2N+2, 3N+3, 4N+4, ....
该线程还建议做两个正弦波,一个幅度大,一个幅度小。
正如我在主要问题中所说,我不确定这是否是一组特别好的答案,或者它是否非常完整,但我将其放在这里,以便人们可以对其进行投票和评论。