Main Page | Modules | Alphabetical List | Data Structures | File List | Data Fields | Globals

volfft.c

Go to the documentation of this file.
00001 /************************************************************************* 00002 * $Id: volfft.c,v 1.1 2005/09/09 08:22:56 bellet Exp $ 00003 ************************************************************************** 00004 This software is governed by the CeCILL license under French law and 00005 abiding by the rules of distribution of free software. You can use, 00006 modify and/ or redistribute the software under the terms of the CeCILL 00007 license as circulated by CEA, CNRS and INRIA at the following URL 00008 "http://www.cecill.info". 00009 00010 As a counterpart to the access to the source code and rights to copy, 00011 modify and redistribute granted by the license, users are provided only 00012 with a limited warranty and the software's author, the holder of the 00013 economic rights, and the successive licensors have only limited 00014 liability. 00015 00016 In this respect, the user's attention is drawn to the risks associated 00017 with loading, using, modifying and/or developing or reproducing the 00018 software by the user in light of its specific status of free software, 00019 that may mean that it is complicated to manipulate, and that also 00020 therefore means that it is reserved for developers and experienced 00021 professionals having in-depth computer knowledge. Users are therefore 00022 encouraged to load and test the software's suitability as regards their 00023 requirements in conditions enabling the security of their systems and/or 00024 data to be ensured and, more generally, to use and operate it in the 00025 same conditions as regards security. 00026 00027 The fact that you are presently reading this means that you have had 00028 knowledge of the CeCILL license and that you accept its terms. 00029 00030 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de 00031 l'Image). All rights reserved. See License.txt for details. 00032 00033 Version 1.0 05/09/2005 00034 *************************************************************************/ 00035 00036 /* 00037 * FFT Tridimensionnelle d'un volume USHORT -> VolFFT 00038 * IFFT Tridimensionnelle d'un volume COMPLEX double precision -> VolIFFT 00039 */ 00040 00041 #include <stdio.h> 00042 #include <math.h> 00043 #include "idsig.h" 00044 #include "idima.h" 00045 #include "idvol.h" 00046 #include "iderr.h" 00047 #include "idprint.h" 00048 00049 static PPPVOLUME_COMPLEX 00050 recon_3d(PPPVOLUME_COMPLEX volr) 00051 { 00052 int i, j, k, dimx, dimy, dimz; 00053 PPPVOLUME_COMPLEX volx; 00054 00055 dimx = IdVolDimX(volr) / 2; 00056 dimy = IdVolDimY(volr) / 2; 00057 dimz = IdVolDimZ(volr) / 2; 00058 00059 volx = 00060 (PPPVOLUME_COMPLEX) IdVolAlloc(IdVolDimX(volr), 00061 IdVolDimY(volr), 00062 IdVolDimZ(volr), VOL_COMPLEX); 00063 if (volx == NULL) 00064 IdErrPrintf("\n PROBLEME D'ALLOCATION "); 00065 00066 for (i = 0; i < dimz; i++) 00067 for (j = 0; j < dimy; j++) 00068 for (k = 0; k < dimx; k++) 00069 00070 { 00071 volx[i][j][k] = 00072 volr[i + dimz][j + dimy][k + dimx]; 00073 volx[i][j + dimy][k] = 00074 volr[i + dimz][j][k + dimx]; 00075 volx[i + dimz][j + dimy][k] = 00076 volr[i][j][k + dimx]; 00077 volx[i + dimz][j][k] = 00078 volr[i][j + dimy][k + dimx]; 00079 00080 volx[i][j][k + dimx] = 00081 volr[i + dimz][j + dimy][k]; 00082 volx[i][j + dimy][k + dimx] = 00083 volr[i + dimz][j][k]; 00084 volx[i + dimz][j + dimy][k + dimx] = 00085 volr[i][j][k]; 00086 volx[i + dimz][j][k + dimx] = 00087 volr[i][j + dimy][k]; 00088 } 00089 IdVolFree(volr); 00090 return (volx); 00091 } 00092 00093 static void 00094 FFT1Dbis(PPPVOLUME_COMPLEX volc) 00095 { 00096 int i, j, k, Tx; 00097 PSIGNAL_COMPLEX lign; 00098 double sqtx; 00099 00100 Tx = IdVolDimX(volc); 00101 sqtx = sqrt((double) (Tx)); 00102 lign = (PSIGNAL_COMPLEX) IdSigAlloc(Tx, SIG_COMPLEX); 00103 00104 for (i = 0; i < IdVolDimZ(volc); i++) 00105 for (j = 0; j < IdVolDimY(volc); j++) { 00106 /* 00107 * remplissage de la ligne 00108 */ 00109 for (k = 0; k < Tx; k++) { 00110 lign[k] = volc[i][j][k]; 00111 } 00112 /* 00113 * calcul de la FFT de la ligne 00114 */ 00115 IdSigFFT(lign, 1); 00116 /* 00117 * copie dans la ligne correspondante de volc 00118 */ 00119 for (k = 0; k < Tx; k++) { 00120 volc[i][j][k].re = lign[k].re / (sqtx); 00121 volc[i][j][k].im = lign[k].im / (sqtx); 00122 } 00123 } 00124 IdSigFree(lign); 00125 } 00126 00127 00128 static void 00129 IFFT1Dbis(PPPVOLUME_COMPLEX volc) 00130 { 00131 int i, j, k, Tx; 00132 PSIGNAL_COMPLEX lign; 00133 double sqtx; 00134 00135 Tx = IdVolDimX(volc); 00136 sqtx = sqrt((double) (Tx)); 00137 lign = (PSIGNAL_COMPLEX) IdSigAlloc(Tx, SIG_COMPLEX); 00138 00139 for (i = 0; i < IdVolDimZ(volc); i++) 00140 for (j = 0; j < IdVolDimY(volc); j++) { 00141 /* 00142 * remplissage de la ligne 00143 */ 00144 for (k = 0; k < Tx; k++) { 00145 lign[k] = volc[i][j][k]; 00146 } 00147 /* 00148 * calcul de la IFFT de la ligne 00149 */ 00150 IdSigFFT(lign, -1); 00151 /* 00152 * copie dans la ligne correspondante de volc 00153 */ 00154 for (k = 0; k < Tx; k++) { 00155 volc[i][j][k].re = lign[k].re * (sqtx); 00156 volc[i][j][k].im = lign[k].im * (sqtx); 00157 } 00158 } 00159 IdSigFree(lign); 00160 } 00161 00162 00163 static void 00164 transposition_3d(PPPVOLUME_COMPLEX volc, PPPVOLUME_COMPLEX voli) 00165 { 00166 int i, j, k; 00167 for (i = 0; i < IdVolDimY(volc); i++) 00168 for (j = 0; j < IdVolDimX(volc); j++) 00169 for (k = 0; k < IdVolDimZ(volc); k++) 00170 00171 voli[i][j][k] = volc[k][i][j]; 00172 return; 00173 } 00174 00187 #define FF3(typevol) \ 00188 for(k=0;k<Tz;k++) \ 00189 for(i=0;i<Ty;i++) \ 00190 for(j=0;j<Tx;j++) \ 00191 { volr[k][i][j].re=((typevol)vols)[k][i][j]; \ 00192 volr[k][i][j].im=0; \ 00193 } 00194 00195 00196 PPPVOLUME_COMPLEX 00197 IdVolFFT(PPPVOLUME vols) 00198 { 00199 PPPVOLUME_COMPLEX voli; 00200 PPPVOLUME_COMPLEX volr; 00201 int i, j, k, Tx, Ty, Tz; 00202 00203 Tx = IdVolDimX(vols); 00204 Ty = IdVolDimY(vols); 00205 Tz = IdVolDimZ(vols); 00206 00207 volr = (PPPVOLUME_COMPLEX) IdVolAlloc(Tx, Ty, Tz, VOL_COMPLEX); 00208 00209 switch (IdVolType(vols)) { 00210 case VOL_CHAR: 00211 FF3(PPPVOLUME_CHAR); 00212 break; 00213 case VOL_UCHAR: 00214 FF3(PPPVOLUME_UCHAR); 00215 break; 00216 case VOL_SHORT: 00217 FF3(PPPVOLUME_SHORT); 00218 break; 00219 case VOL_USHORT: 00220 FF3(PPPVOLUME_USHORT); 00221 break; 00222 case VOL_LONG: 00223 FF3(PPPVOLUME_LONG); 00224 break; 00225 case VOL_ULONG: 00226 FF3(PPPVOLUME_ULONG); 00227 break; 00228 case VOL_FLOAT: 00229 FF3(PPPVOLUME_FLOAT); 00230 break; 00231 case VOL_DOUBLE: 00232 FF3(PPPVOLUME_DOUBLE); 00233 break; 00234 00235 default: 00236 IdErrPrintf 00237 ("Type %d non traitable par la fonction IdVolFFT !\n", 00238 IdVolType(vols)); 00239 IdErrno = IDERR_WRONG_LIBTYPE; 00240 return (0); 00241 } 00242 00243 FFT1Dbis(volr); 00244 voli = (PPPVOLUME_COMPLEX) IdVolAlloc(Tz, Tx, Ty, VOL_COMPLEX); 00245 transposition_3d(volr, voli); 00246 IdVolFree(volr); 00247 00248 FFT1Dbis(voli); 00249 volr = (PPPVOLUME_COMPLEX) IdVolAlloc(Ty, Tz, Tx, VOL_COMPLEX); 00250 transposition_3d(voli, volr); 00251 IdVolFree(voli); 00252 00253 FFT1Dbis(volr); 00254 voli = (PPPVOLUME_COMPLEX) IdVolAlloc(Tx, Ty, Tz, VOL_COMPLEX); 00255 transposition_3d(volr, voli); 00256 00257 voli = recon_3d(voli); 00258 00259 IdVolFree(volr); 00260 return (voli); 00261 } 00262 00275 PPPVOLUME_COMPLEX 00276 IdVolIFFT(PPPVOLUME_COMPLEX volsource) 00277 { 00278 PPPVOLUME_COMPLEX voli; 00279 int Tx, Ty, Tz; 00280 00281 00282 Tx = IdVolDimX(volsource); 00283 Ty = IdVolDimY(volsource); 00284 Tz = IdVolDimZ(volsource); 00285 00286 /* 00287 * transformee de Fourier premiere passe 00288 */ 00289 IFFT1Dbis(volsource); 00290 voli = (PPPVOLUME_COMPLEX) IdVolAlloc(Tz, Tx, Ty, VOL_COMPLEX); 00291 transposition_3d(volsource, voli); 00292 IdVolFree(volsource); 00293 00294 /* 00295 * transformee de Fourier deuxieme passe 00296 */ 00297 00298 IFFT1Dbis(voli); 00299 volsource = 00300 (PPPVOLUME_COMPLEX) IdVolAlloc(Ty, Tz, Tx, VOL_COMPLEX); 00301 transposition_3d(voli, volsource); 00302 IdVolFree(voli); 00303 00304 /* 00305 * transformee de Fourier troisieme passe 00306 */ 00307 00308 IFFT1Dbis(volsource); 00309 voli = (PPPVOLUME_COMPLEX) IdVolAlloc(Tx, Ty, Tz, VOL_COMPLEX); 00310 transposition_3d(volsource, voli); 00311 /* 00312 * voli=recon_3d(voli); 00313 */ 00314 IdVolFree(volsource); 00315 00316 return (voli); 00317 }

Generated on Wed Oct 19 09:28:34 2005 for SIMRI3D by doxygen 1.3.7