我正在使用数值公式和(为了确认结果)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);

给我
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

我需要将什么输入发送到数字配方
void realft( float data[], unsigned long n, int isign ){...}

为了得到与Matlab相同的输出?
从这个NR forum链接中,我发现data的输入需要移动一个位置,所以我使用realft,因此输入比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;
}

测试代码的输出是:
 0.00000000
28.00000000
-4.00000000
-4.00000000
-9.65685463
-4.00000000
-4.00000000
-4.00000000
-1.65685427

这是相似的,但不同于Matlab。
in[0] = 0取自数值配方(使用realft例程):

最佳答案

第一个方面是不同的MATLAB和数字配方的实现,而不是一个一个索引,你已经注意到和占,是他们是基于一个稍微不同的定义的FFT。更具体地说,Matlab uses a negative complex exponential for the forward transform而数值配方使用正复指数。相应地,数值配方的实现将给出一个结果,该结果是来自Matlab的复共轭结果。
另一件事是,这些实现以不同的打包顺序产生结果,而数值配方的实现只输出非冗余的下半个频谱。从图形上讲,这个映射可以用下面的图来表示(在根据关于复共轭的上一点改变虚部的符号之后):
c - 如何比较从数字食谱到Matlab fft的实际傅立叶变换实现?-LMLPHP

关于c - 如何比较从数字食谱到Matlab fft的实际傅立叶变换实现?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40341257/

10-09 06:06
查看更多