[1634] | 1 | /* ------------------ apc.icc -------------------
|
---|
| 2 |
|
---|
| 3 | Example illustrating C programming for performing
|
---|
| 4 | operations comparable to those performed in apcxx.icc
|
---|
| 5 |
|
---|
| 6 | R. Ansari 08/2001
|
---|
| 7 |
|
---|
| 8 | ---- Computation steps :
|
---|
| 9 | > Allocate an array representing a matrix (NL x NC ) (mtx)
|
---|
| 10 | > fill it with a gaussian distributed random values
|
---|
| 11 | > make a copy of the matrix (mtxs)
|
---|
| 12 | > allocate and fill 1D filter in Fourier space
|
---|
| 13 | > Loop over matrix rows k
|
---|
| 14 | >> Extract row k (fline)
|
---|
| 15 | >> compute 1D Fourier transform FFTForward (fline)
|
---|
| 16 | >> apply filter in Fourier space
|
---|
| 17 | >> compute backward 1D FFT
|
---|
| 18 | >> Replace matrix row with the filtered values
|
---|
| 19 |
|
---|
| 20 | > free the allocated memory
|
---|
| 21 |
|
---|
| 22 | this example code can be
|
---|
| 23 | - included in a main program
|
---|
| 24 | - executed using runcxx
|
---|
| 25 | csh> runcxx -tmpdir /tmp -f apc.icc
|
---|
| 26 | - executed within spiapp
|
---|
| 27 | Cmd> c++execfrf apc.icc
|
---|
| 28 | */
|
---|
| 29 |
|
---|
| 30 | // Select computation on float or double (r_4 r_8)
|
---|
| 31 | #define FTYP r_4
|
---|
| 32 |
|
---|
| 33 | // Number of matrix lines and colums
|
---|
| 34 | int NL = 1024;
|
---|
| 35 | int NC = 4096;
|
---|
| 36 | int i,k;
|
---|
| 37 | cout << " apc : NL= " << NL << " NC= " << NC << endl;
|
---|
| 38 | PrtTim("apc_Start");
|
---|
| 39 |
|
---|
| 40 | // Creation of the initial matrix
|
---|
| 41 | FTYP * mtx = new FTYP [NL*NC];
|
---|
| 42 | // Filling matrix with gaussian random values
|
---|
| 43 | for(i=0; i<NL*NC; i++)
|
---|
| 44 | mtx[i] = 15.+NorRand()*3.;
|
---|
| 45 |
|
---|
| 46 | // Allocation of the copy matrix (mtxs)
|
---|
| 47 | FTYP * mtxs = new FTYP [NL*NC];
|
---|
| 48 | // copying mtxs to mtx
|
---|
| 49 | for(i=0; i<NL*NC; i++)
|
---|
| 50 | mtxs[i] = mtx[i];
|
---|
| 51 |
|
---|
| 52 | // Creation and initialization of the Fourier filter filt(nu)
|
---|
| 53 | FTYP * filt = new FTYP [NC];
|
---|
| 54 | for(i=0; i<NC; i++) {
|
---|
| 55 | filt[i] = 1.-i/(double)NC;
|
---|
| 56 | filt[i] *= filt[i];
|
---|
| 57 | }
|
---|
| 58 |
|
---|
| 59 |
|
---|
| 60 | // Creation of the FFTPackServer
|
---|
| 61 | // We use this class to avoid to do the initialization steps needed to use fftpack.
|
---|
| 62 | FFTPackServer ffts;
|
---|
| 63 | ffts.setNormalize(true);
|
---|
| 64 |
|
---|
| 65 | PrtTim("apc_AfterInit");
|
---|
| 66 |
|
---|
| 67 | // Allocation of the matrix row memory
|
---|
| 68 | FTYP * fline = new FTYP [NC];
|
---|
| 69 |
|
---|
| 70 | // Loop over matrix rows
|
---|
| 71 | for(k=0; k<NL; k++) {
|
---|
| 72 | // Matrix row extraction
|
---|
| 73 | for(i=0; i<NC; i++) fline[i] = mtx[k*NC+i];
|
---|
| 74 | // Compute 1D forward FFT
|
---|
| 75 | ffts.fftf(NC, fline);
|
---|
| 76 | // Applying filter in Fourier space f(nu) = f(nu)*filter(nu)
|
---|
| 77 | for(i=0; i<NC; i++) fline[i] *= filt[i];
|
---|
| 78 | // backward FFT
|
---|
| 79 | ffts.fftb(NC, fline);
|
---|
| 80 | // replace matrix row with filtered values
|
---|
| 81 | for(i=0; i<NC; i++) mtx[k*NC+i] = fline[i];
|
---|
| 82 | }
|
---|
| 83 |
|
---|
| 84 | PrtTim("apc_AfterFFTLoop");
|
---|
| 85 |
|
---|
| 86 |
|
---|
| 87 | delete[] mtx;
|
---|
| 88 | delete[] mtxs;
|
---|
| 89 | delete[] fline;
|
---|
| 90 | delete[] filt;
|
---|
| 91 |
|
---|