2012-04-30 2 views
3

Récemment, j'ai rencontré des problèmes concernant l'utilisation de fftw et de sa transformation c2c (voir: 3d c2c fft with fftw library). Comme je localisais mes problèmes dans l'utilisation de la bibliothèque, j'ai créé une nouvelle question afin de discuter de cette situation d'une manière plus concrète. Puisque je fais une transformation complexe à complexe avec des données réelles, mes données transformées dans l'espace Fourier sont supposées être symétriques: F [n] = con (F [Nn])fftw c2c: absence de symétrie dans les données réelles transformées

Maintenant, j'ai fait quelques transformations avec de petits blocs de test-data pour vérifier les données transformées pour cette symétrie. Pour 1D transformer à chaque chose a fonctionné comme prévu, mais pour les dimensions plus élevées, j'ai obtenu des résultats inattendus.

J'utilise fftwf_plan_dft_2d pour transformer une image en niveaux de gris 8x8 dans l'espace de Fourier et le résultat complexe est donné par:

n 
0 real 7971 imag 0 
1 real -437.279 imag -802.151 
2 real -289 imag -566 
3 real -182.721 imag 15.8486 
4 real 31 imag 0 
5 real -182.721 imag -15.8486 
6 real -289 imag 566 
7 real -437.279 imag 802.151 
8 real -1499.79 imag -315.233 
9 real 182.693 imag -74.5563 
10 real 55.9239 imag -12.8234 
11 real -84.7868 imag -9.10052 
12 real -14.4264 imag 211.208 
13 real 289.698 imag 214.723 
14 real 452.659 imag -246.279 
15 real 1136.35 imag -763.85 
16 real 409 imag -134 
17 real -141.865 imag 42.6396 
18 real -33 imag 122 
19 real 129.075 imag -49.7868 
20 real 1 imag -150 
21 real 109.865 imag -84.6396 
22 real 95 imag -142 
23 real -841.075 imag -92.2132 
24 real -108.207 imag -89.2325 
25 real -127.213 imag 28.8995 
26 real -36.6589 imag -8.27922 
27 real -74.6934 imag 43.4437 
28 real 70.4264 imag 29.2082 
29 real -88.3545 imag -81.8499 
30 real -127.924 imag -190.823 
31 real 230.302 imag 8.7229 
32 real -53 imag 0 
33 real -73.1127 imag -22.8578 
34 real -85 imag -82 
35 real -10.8873 imag 51.1421 
36 real -65 imag 0 
37 real -10.8873 imag -51.1421 
38 real -85 imag 82 
39 real -73.1127 imag 22.8578 
40 real -108.207 imag 89.2325 
41 real 230.302 imag -8.7229 
42 real -127.924 imag 190.823 
43 real -88.3545 imag 81.8499 
44 real 70.4264 imag -29.2082 
45 real -74.6934 imag -43.4437 
46 real -36.6589 imag 8.27922 
47 real -127.213 imag -28.8995 
48 real 409 imag 134 
49 real -841.075 imag 92.2132 
50 real 95 imag 142 
51 real 109.865 imag 84.6396 
52 real 1 imag 150 
53 real 129.075 imag 49.7868 
54 real -33 imag -122 
55 real -141.865 imag -42.6396 
56 real -1499.79 imag 315.233 
57 real 1136.35 imag 763.85 
58 real 452.659 imag 246.279 
59 real 289.698 imag -214.723 
60 real -14.4264 imag -211.208 
61 real -84.7868 imag 9.10052 
62 real 55.9239 imag 12.8234 
63 real 182.693 imag 74.5563 

Désolé pour cette longue liste de données, mais il montre mon problème.

Par exemple pour F[3]=-182.721 + 15.8486i je m'attendais à F[64-3] = F[61] = -182.721 - 15.8486i, mais comme vous pouvez le voir il est -84.7868 + 9.10052i. Au lieu de cela, le conjugué de F[3] est situé à l'index 5. Même chose pour les autres paires.

S'il y a un système, je ne le trouve pas.

Voici le code complet:

QImage image("/Users/wolle/Desktop/wolf.png"); 
int w = image.width(); 
int h = image.height(); 
int size = w * h; 

cl_float *rawImage = imageToRaw(image); // converts a QImage into an rgb array [0..255] 

fftwf_complex *complexImage = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * size); 
fftwf_complex *freqBuffer = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * size); 

// real data to complex data 
for (int i = 0; i < size; i++) 
{ 
    complexImage[i][0] = (float)rawImage[i]; 
    complexImage[i][1] = 0.0f; 
} 

fftwf_plan forward = fftwf_plan_dft_2d(w, h, complexImage, freqBuffer, FFTW_FORWARD, FFTW_ESTIMATE); 

fftwf_execute(forward); 

for (int y = 0; y < h; y++) 
{ 
    for (int x = 0; x < w; x++) 
    { 
     int gid = y * w + x; 
     qDebug() << gid << "real" << freqBuffer[gid][0] << "imag" << freqBuffer[gid][1]; 
    } 
} 

Je vous serais reconnaissant de l'aide. :-D

salutations

loup

+1

Je ne suis pas sûr que je comprends. Vous parlez d'une image 16x16, mais vos données ne sont que 64 éléments. En outre, tous les éléments de cette liste ressemblent à des paires conjuguées ... –

Répondre

3

Pour une transformée de Fourier 2D, il est toujours vrai que lorsque x est réel FFT (x) est conjugué symétrique. Mais c'est en deux dimensions. Donc l'élément (x, y) à l'index 16 * x + y devrait être le conjugué de l'élément (16-x, 16-y) à l'index 16 * (16-x mod 16) + (16-y mod 16) MAIS je pense que même si vous avez dit 16x16, vous vouliez dire 8x8. Donc (x, y) à 8 * x + y est conjugué à (8-x, 8-y) à 8 * (8-x mod 8) + (8-y mod 8).

En particulier, par exemple, lorsque x = 0, les éléments conjugués sont y et 8 y - y compris, par exemple, 3 et 5, comme vous l'avez trouvé.

(Lorsque x = 0 ou y = 0, des choses comme "mod 8-y 8" signifie au-dessus de 0.)

+0

Hé, merci pour cette très belle explication. C'est le calcul que je cherchais et votre droit c'était vraiment une image 8x8. Merci! – DerHandwerk

+0

De rien! –

+0

Encore une chose: Dans le cas où 'x = y = 0' j'obtiens le premier élément' 7917 + 0i' pour autant que je le vois il n'y a pas de contrepartie. – DerHandwerk

Questions connexes