Ja, det gör jag. MLK är känd på internet för att inte vara den snabbaste. FFTW3 är säkert den snabbaste, men FFTPack, trots sin ålder, så är den en av dom snabbaste, och mest lättanvändarvänligaste också.
Enda skillnaden mellan MLK och FFTPack var att FFTPack kunde ge talen 3.99999999999 medan MLK gav 4.0 exakt.
Nu sitter jag med ett problem att jag måste göra en beräkning med 2D med FFTpack. Bara FFTpack 5.1 har stöd för 2D FFT, men denna är skrivet i Fortran 90, och inte ANSI C som jag skriver min kod i.
Då har jag en plan!
1. Om jag har en matris X som är M x N och sedan tar jag transponatet på X för att göra om den till column-major.
2. Jag använder FFT på varje "rad", som är egentligen varje kolumn med tanke på transponantet.
#define row 8
#define column 3
float X[row * column] = { -0.678816, 1.363392, - 0.020819,
0.014361, 0.115923, 0.309136,
- 0.195106, - 1.376395, - 0.336756,
1.678252, - 0.234396, - 0.023950,
1.776940, 1.062231, - 0.580292,
- 0.723726, - 1.209755, 0.394779,
- 0.906230, - 1.120195, 1.207566,
2.242360, - 0.311222, 0.433339 };
Efter ha tagit FFT på matrisen X så får jag
3.2080352 -1.7104170 1.3830030
-1.5349649 1.1842327 0.8222664
-0.8341455 -0.7355201 1.9282329
2.1994600 4.9222131 -1.4719210
4.6299772 0.5482139 -0.2945260
-3.3765469 -0.5819106 0.2966796
0.5881023 -1.2479200 -1.1604111
-3.2144592 1.5684826 -0.8436050
I matlab så skulle detta se ut som
>> fft(X)
ans =
3.2080 + 0i -1.7104 + 0i 1.3830 + 0i
-1.5350 - 0.8341i 1.1842 - 0.7355i 0.8223 + 1.9282i
2.1995 + 4.6300i 4.9222 + 0.5482i -1.4719 - 0.2945i
-3.3765 + 0.5881i -0.5819 - 1.2479i 0.2967 - 1.1604i
-3.2145 + 0i 1.5685 + 0i -0.8436 + 0i
-3.3765 - 0.5881i -0.5819 + 1.2479i 0.2967 + 1.1604i
2.1995 - 4.6300i 4.9222 - 0.5482i -1.4719 + 0.2945i
-1.5350 + 0.8341i 1.1842 + 0.7355i 0.8223 - 1.9282i
>>
Här får man vara vaksam! Notera att talet 1.5350 + 0.8341i
uppträder två gånger i kolumnen och att datat är speglat. FFTPack ger oss endast halva spegeln.
3.2080 + 0i -1.7104 + 0i 1.3830 + 0i
-1.5350 - 0.8341i 1.1842 - 0.7355i 0.8223 + 1.9282i
2.1995 + 4.6300i 4.9222 + 0.5482i -1.4719 - 0.2945i
-3.3765 + 0.5881i -0.5819 - 1.2479i 0.2967 - 1.1604i
-3.2145 + 0i 1.5685 + 0i -0.8436 + 0i
Och då är frågan: Hur ska jag använda FFT här på denna data för att göra 2D FFT?
Jo! Det jag måste göra, är att jag måste ta FFT för varje rad, inte kolumn.
Men det ställer till lite problem för mig.
Om jag ska göra FFT på denna rad
-1.5350 - 0.8341i 1.1842 - 0.7355i 0.8223 + 1.9282i
Så måste jag göra FFT på denna rad
-1.5349649 1.1842327 0.8222664
-0.8341455 -0.7355201 1.9282329
Dessa tal skulle fått byta plats. Andra problemet är att dessa är komplexa tal.
Om jag skulle köra FFT på raden ovan så skulle jag få detta resultat
>> fft([-1.5350 - 0.8341i 1.1842 - 0.7355i 0.8223 + 1.9282i])
ans =
0.4715 + 0.3586i -4.8451 - 1.7439i -0.2314 - 1.1170i
Om jag kör med FFT Pack
float Y[6] = { -1.5350, -0.8341, 1.1842, 0.7355, 0.8223 , 1.9282 };
fft(Y, 6);
print(Y, 1, 6);
>>Utskrift: 2.3011003 -2.7266998 2.0788074 -2.3498001 2.7056365 -1.3581001
Ni ser att det fungerar inte att köra komplexa tal med FFTPack.