我应该使用什么数据来测试FFT实现,我应该期望什么精度?


14

我正在努力实现FFT算法,并且很好奇所建议的输入测试数据使用的建议-以及为什么!-以及预期的精度。

在测试输入中,我在Usenet的旧帖子中找到了一些指导,我将其作为答案发布,但这只是一个人的建议,没有太多理由-我还没有找到看起来像是可靠答案的任何内容。

在准确性方面,维基百科说该错误应该是O(e log N),但是从绝对意义上来说,合理的期望是什么?

编辑添加:实际测试采用的形式是我存储了输入数据数组和预先计算的“参考”输出数据以进行比较,因此我不一定需要封闭形式的解决方案。

Answers:


12

如果要验证FFT算法的正确性,就某种意义而言,它要执行具有离散傅里叶变换已知属性的所需功能,则可以使用以下方法:

埃尔金,丰达。(1995年6月)。测试多元线性函数:克服生成器瓶颈。在过程中。二十七安。ACM症状。计算理论。(第407–416页)。

FFTW的制造商将上述论文作为他们选择的方法,以验证特定的FFT实现是否应执行其应做的工作。提出的技术将功能分为三个主要组件,并通过单独的测试进行了验证:

  • 线性: DFT(及其傅里叶族中的其他表亲变换)是线性算子,因此对于所有值,以下等式必须成立:一种1个一种2X1个[ñ]X2[ñ]

FFŤ一种1个X1个[ñ]+一种2X2[ñ]=一种1个FFŤX1个[ñ]+一种2FFŤX2[ñ]
  • 单位脉冲的DFT:将等于Kronecker增量函数的时域信号应用于FFT算法的输入,并根据已知的单位脉冲函数的DFT检查输出(在所有输出中均转换为常数值)垃圾箱)。如果FFT算法提供了IFFT,则可以对其进行反向测试,以表明它再次产生单位脉冲函数。

  • 时移:将两组数据应用于FFT算法的输入;两者在时域上的唯一区别是恒定的时移。基于DFT的已知属性,这将影响两个信号的频域表示之间的已知线性相移,其中相移的斜率与时移成比例。

该论文的作者断言,这些测试足以验证FFT实现的正确性。我过去从未使用过这种技术,但似乎确实有意义,并且我相信FFTW的作者(他们生产了很多免费软件)是可靠的权威,提供了验证问题的好方法。


谢谢!作者是否建议将a1,a2,x1 [n]和x2 [n]的值用于线性测试(或者他们断言这在很大程度上无关紧要)?而且,就此而言,用于时移测试的数据集是什么?
Brooks Moses

3
实际阅读本文之后,我可以回答我自己的问题:作者没有描述一个人如何执行线性测试,而是假设一个人所做的足以证明“大多数输入”是正确的。同样,本文在假设精确算术的情况下描述了正确正确性的证明。它没有描述用于表征近似程序中数值误差的手段(这必然是使用有限精度算术得出的结果)。
Brooks Moses

我将继续并将其标记为“接受”,因为它肯定是迄今为止最好的答案-但我仍然对其他答案感兴趣,这些答案涵盖了要使用的测试输入数据集(以及原因)或预期精度的细节。谢谢!
Brooks Moses

2
关于验证FFT算法,您的问题确实包含两个部分:验证其正确性和测量其数值精度。我的回答只针对第一个。很难对期望的数值精度做出任何陈述,因为它本质上取决于实现。算术的类型(例如固定点与浮点),用于实现算法的结构,FFT长度(即用于分解问题的阶段数),为提高执行速度而采取的任何捷径等都将发挥作用。因素,很难一概而论。
杰森R

好点子; 我可能应该将这些问题作为单独的问题提出来。
Brooks Moses

5

如问题中提到的,我确实在归档的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, ....

该线程还建议执行两个正弦,一个正弦幅度较大,另一个正弦幅度较小。

就像我在主要问题中所说的那样,我不确定这是否是一组特别好的答案,或者它是否很完整,但是我要放在这里以便人们对其进行投票和评论。


1
“ 1.输入随机数据”将显示什么?
Dilip Sarwate

1
@DilipSarwate:模糊测试对于揭示崩溃很有用。并且,根据噪声输入的类型(例如粉红噪声或白噪声),在检查总体能量分布是否符合预期时可能很有用。
smokris

2
@Dilip-我的fft“烟雾测试”是ifft(fft(random_stuff))〜= random_stuff。
hotpaw2 2011年

ñCñ01个99ñ Cñ01个

2
@Dilip:我是硬件专家。我想要一些可以切换所有乘法器和CSA中所有位的高百分比的东西。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.