如何比较从数字配方到Matlab fft的实数傅里叶变换实现?

Dan*_*jel 3 c signal-processing fft

我正在使用Numerical Recipes计算离散傅里叶变换和(以确认结果)Matlab.仅使用实际值.

我的Matlab代码

in(1)=0.0;
in(2)=1.0;
in(3)=2.0;
in(4)=3.0;
in(5)=4.0;
in(6)=5.0;
in(7)=6.0;
in(8)=7.0;

out = fft(in);
Run Code Online (Sandbox Code Playgroud)

给我

out =
 28.0000 + 0.0000i
 -4.0000 + 9.6569i
 -4.0000 + 4.0000i
 -4.0000 + 1.6569i
 -4.0000 + 0.0000i
 -4.0000 - 1.6569i
 -4.0000 - 4.0000i
 -4.0000 - 9.6569i
Run Code Online (Sandbox Code Playgroud)

data我需要输入什么输入到数字配方

void realft( float data[], unsigned long n, int isign ){...}
Run Code Online (Sandbox Code Playgroud)

为了获得与Matlab相同的输出?

从这个NR论坛链接,我发现输入realft需要移动一个地方,所以我使用in[0] = 0,因此输入是大于N的1个元素.

测试代码:

#include <stdio.h>
#define LEN 8
int main()
{
  float inout[LEN+1];

  inout[0] = 0.0;
  inout[1] = 0.0;
  inout[2] = 1.0;
  inout[3] = 2.0;
  inout[4] = 3.0;
  inout[5] = 4.0;
  inout[6] = 5.0;
  inout[7] = 6.0;
  inout[8] = 7.0;

  realft( inout, LEN, 1 );

  for( unsigned int i=0; i<LEN+1; i=i+1)
      printf("%15.10f \n",inout[i]);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

测试代码的输出是:

 0.00000000 
28.00000000
-4.00000000
-4.00000000 
-9.65685463
-4.00000000
-4.00000000
-4.00000000
-1.65685427
Run Code Online (Sandbox Code Playgroud)

这与Matlab类似但不同.

realft取自Numerical Recipes(使用four1例程):

Sle*_*Eye 5

Matlab和Numerical Recipes的实现之间的第一个不同之处是,除了你已经注意到并考虑到的逐个索引之外,它们是基于稍微不同的FFT定义.更具体地说,Matlab使用负复指数进行正向变换,而数字食谱使用正复指数.相应地,Numerical Recipes的实现将给出一个与Matlab的复杂共轭的结果.

另一件事是这些实现以不同的打包顺序产生结果,而Numerical Recipes的实现仅输出非冗余的下半部分.在图形上,可以通过以下图表来表示(在根据关于复共轭的先前点改变虚部的符号之后)该映射:

在此输入图像描述