1 | #define TF r_8
|
---|
2 |
|
---|
3 | int nlig = 128; int ncol = 128;
|
---|
4 | TMatrix<TF> in(nlig,ncol);
|
---|
5 | int l,c;
|
---|
6 | for(l=40; l<80; l++)
|
---|
7 | for(c=40; c<80; c++) {
|
---|
8 | double r2 = (l-60.5)*(l-60.5)+(c-60.5)*(c-60.5);
|
---|
9 | in(l,c) = (TF)30.*exp(-r2/9.);
|
---|
10 | }
|
---|
11 | // Le dernier argument de RandomSequence est le sigma du bruit
|
---|
12 | // Si on veut rajouter du bruit, decommenter les 3 lignes suivantes
|
---|
13 | TMatrix<TF> noise(nlig,ncol);
|
---|
14 | noise = RandomSequence(RandomSequence::Gaussian, 0., 0.5);
|
---|
15 | in += noise;
|
---|
16 | TMatrix< complex<TF> > fftin;
|
---|
17 | FFTWServer ffts;
|
---|
18 | ffts.setNormalize(true);
|
---|
19 | cout << " FFTServer info string= " << ffts.getInfo() << endl;
|
---|
20 | cout << " Calling ffts.FFTForward(in, fftin) : " << endl;
|
---|
21 | ffts.FFTForward(in, fftin);
|
---|
22 | // On garde les tableau in et fftin avec KeepObj()
|
---|
23 | KeepObj(in);
|
---|
24 | KeepObj(fftin);
|
---|
25 | // On fait un filtre passe-haut
|
---|
26 | // Il faut savoir que les frequences negatives sont rangees
|
---|
27 | // dans la seconde moitie du tableau en numero de ligne
|
---|
28 | int kx, ky;
|
---|
29 | TMatrix< complex<TF> > fftfb(fftin.NRows(), fftin.NCols());
|
---|
30 | TMatrix< complex<TF> > fftfd(fftin.NRows(), fftin.NCols());
|
---|
31 | // fb : Filtrage brutal , fd : Filtrage doux
|
---|
32 | for(ky=0; ky<fftin.NRows(); ky++)
|
---|
33 | for(kx=0; kx<fftin.NCols(); kx++) {
|
---|
34 | int kyy = ky;
|
---|
35 | // deuxieme partie du tableau - Frequences negatives en y
|
---|
36 | if (ky > fftin.NRows()/2) kyy = fftin.NRows()-ky;
|
---|
37 | double kr = sqrt((double)kx*kx+kyy*kyy);
|
---|
38 | complex<TF> att;
|
---|
39 | // Filtrage brutal fonction en escalier
|
---|
40 | if (kr < 10) att = complex<TF>((TF)0.5, (TF)0.);
|
---|
41 | else att = complex<double>(1., 0.);
|
---|
42 | fftfb(ky, kx) = fftin(ky, kx) * att ;
|
---|
43 | // Filtrage doux sous forme de 1-exp(-alpha k_r)
|
---|
44 | att = complex<TF>((TF)(1.-exp(-kr*0.1)), (TF)0.);
|
---|
45 | fftfd(ky, kx) = fftin(ky, kx) * att ;
|
---|
46 | }
|
---|
47 | TMatrix<TF> infb(nlig,ncol);
|
---|
48 | TMatrix<TF> infd(nlig,ncol);
|
---|
49 | // FFTBackward -- Attention, le tableau des coefficient de Fourier
|
---|
50 | // est modifie - On en fait une copie
|
---|
51 | TMatrix< complex<TF> > fftf(fftin.NRows(), fftin.NCols());
|
---|
52 | // Pour le filtre brutal
|
---|
53 | fftf = fftfb;
|
---|
54 | ffts.FFTBackward(fftf, infb);
|
---|
55 | // Pour le filtre doux
|
---|
56 | fftf = fftfd;
|
---|
57 | ffts.FFTBackward(fftf, infd);
|
---|
58 | // On garde les tableaux fft filtre et signal filtre
|
---|
59 | KeepObj(infb);
|
---|
60 | KeepObj(infd);
|
---|
61 | KeepObj(fftfb);
|
---|
62 | KeepObj(fftfd);
|
---|