2

Chris Lomont 非常友好地为我们提供了一个使用 C# 的简洁 FFT 实现。来源可以在这里找到。函数已经写到RealFFT(double[] data, bool forward)一半了,只需阅读函数摘要(很短:))。

如前所述(函数摘要),我正在使用该RealFFT函数,它接受一个样本数组,所有这些样本都是实值(没有虚部)。但是,它还指出,在前两个条目之后,输出是复值,存储在交替的实部和虚部中。

我似乎无法弄清楚这一点。进行 FFT 后,您总是会得到实部和虚部。那么如何将它们打包到作为参数进入函数的数组中(因为只有实数,所以大小只有一半)?

4

2 回答 2

4

来自维基百科

对于纯实数输入,X(k) = X(Nk)*;因此你只需要给出一半的组件(另一半基本相同,但它们是复共轭的)。

所以不计算和存储它们是有效的;如果你真的需要这些值,你可以使用上面的公式即时计算它们。

声明暗示了这是真的(在您上面链接到的代码的注释中):

// The first two returned entries are the real                                     
// parts of the first and last value from the conjugate symmetric                                       
// output, which are necessarily real. The length must be a power                                       
// of 2.                     
于 2013-04-07T21:09:45.883 回答
0

这样LomontFFT.RealFFT(double[] data, bool forward)工作:

  • forward == true:data是实数输入和复数输出(FT 系数)。
  • forward == false即逆FFT:data复数输入(FT 系数)和实数输出。

我同意文档有点混乱。

于 2017-02-09T15:32:54.940 回答