FFT : FFTW Matlab FFT2 mystery
FFT : FFTW Matlab FFT2 mystery
我继承了一个带有fft子程序的旧fortran代码,无法追踪该程序的来源。我唯一知道的是,有一个对ff2prp()的调用和对fft2()的呼叫来执行2D正向和反向DFT。为了知道代码在做什么,我对4x4 2D阵列(矩阵)进行了DFT,结果与Matlab和FFTW的结果非常不同。
问题:有人能通过查看输出来判断代码在做什么吗。输入和输出都是实阵列
输入阵列
0.20000 0.30000 1.00000 1.20000
0.00000 12.00000 5.00000 1.30000
0.30000 0.30000 1.00000 1.40000
0.00000 0.00000 0.00000 1.50000
在用fft2()进行前向FFT后,fortran例程
0.16875 -0.01875 -0.05000 0.05625
0.00000 12.00000 5.00000 1.30000
0.30000 0.30000 1.00000 1.40000
0.00000 0.00000 0.00000 1.50000
执行DCT:dct2(输入)的Matlab输出
6.3750 -0.8429 -3.4250 -2.4922
2.4620 0.6181 -2.6356 -0.9887
-4.2750 -0.9798 4.2250 2.2730
-4.8352 -1.2387 5.0695 3.4819
使用FFTW库从C++代码输出。来自FFTW 的DCT
(6.3750, 0.00) (-0.8429, 0.00) (-3.4250, 0.00) (-2.4922, 0.00)
(2.4620, 0.00) (0.6181, 0.00) (-2.6356, 0.00) (-0.9887, 0.00)
(-4.2750, 0.00) (-0.9798, 0.00) (4.2250, 0.00) (2.2730, 0.00)
(-4.8352, 0.00) (-1.2387, 0.00) (5.0695, 0.00) (3.4819, 0.00)
基于Matlab-fft2(输入)的前向FFT
25.5000 + 0.0000i -6.5000 - 7.2000i -10.5000 + 0.0000i -6.5000 + 7.2000i
-0.3000 -16.8000i -12.3000 + 4.8000i 0.1000 + 6.8000i 12.1000 + 5.2000i
-14.1000 + 0.0000i 3.5000 +11.2000i 9.1000 + 0.0000i 3.5000 -11.2000i
-0.3000 +16.8000i 12.1000 - 5.2000i 0.1000 - 6.8000i -12.3000 - 4.8000i
带FFTW 的前向FFT
(25.50, 0.00) (-6.50, -7.20) (-10.50, 0.00) (-6.50, 7.20)
(-0.30, -16.80) (-12.30, 4.80) (0.10, 6.80) (12.10, 5.20)
(-14.10, 0.00) (3.50, 11.20) (9.10, 0.00) (3.50, -11.20)
(-0.30, 16.80) (12.10, -5.20) (0.10, -6.80) (-12.30, -4.80)
正如你所看到的,Matlab和FFTW的输出彼此一致,但与fortran代码的输出不一致。我想使用FFTW,但由于FFT的原因,结果不同。我搞不清fortran程序在做什么FFT。有人能通过看输出来判断吗。
据我所知,fft2
似乎已经计算了第一行的1DFFT(其他3个保持不变),结果按1/16缩放并打包为r0, r2, r1, i1
格式。
换句话说,输出可以在Matlab中使用构建
input = [0.2 0.3 1 1.2;0 12 5 1.3;0.3 0.3 1 1.4;0 0 0 1.5];
N = size(input,2);
A = fft(input(1,:))/16;
B = reshape([real(A);imag(A)],1,2*N);
B(2) = B(N+1);
output = [B(1:N);A(2:size(input,1),:)];
如果你有理由相信fft2
应该计算2D FFT,那么你将数据传递给这个例程的方式可能会出现一些问题,从而导致不正确的结果。此外,不同大小输入的额外测试用例(或如何调用ff2prp
)可能会提供更多关于缩放因子选择的见解(例如,它是1/N^2还是1/4N,或其他什么)。