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例程):
Matlab和Numerical Recipes的实现之间的第一个不同之处是,除了你已经注意到并考虑到的逐个索引之外,它们是基于稍微不同的FFT定义.更具体地说,Matlab使用负复指数进行正向变换,而数字食谱使用正复指数.相应地,Numerical Recipes的实现将给出一个与Matlab的复杂共轭的结果.
另一件事是这些实现以不同的打包顺序产生结果,而Numerical Recipes的实现仅输出非冗余的下半部分.在图形上,可以通过以下图表来表示(在根据关于复共轭的先前点改变虚部的符号之后)该映射: