00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
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
00108
00109
for (k = 0; k < Tx; k++) {
00110 lign[k] = volc[i][j][k];
00111 }
00112
00113
00114
00115
IdSigFFT(lign, 1);
00116
00117
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
00143
00144
for (k = 0; k < Tx; k++) {
00145 lign[k] = volc[i][j][k];
00146 }
00147
00148
00149
00150
IdSigFFT(lign, -1);
00151
00152
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
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
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
00306
00307
00308 IFFT1Dbis(volsource);
00309 voli = (
PPPVOLUME_COMPLEX)
IdVolAlloc(Tx, Ty, Tz,
VOL_COMPLEX);
00310 transposition_3d(volsource, voli);
00311
00312
00313
00314
IdVolFree(volsource);
00315
00316
return (voli);
00317 }