Changeset 717 in Sophya for trunk/SophyaLib/NTools/fftpserver.cc
- Timestamp:
- Feb 5, 2000, 6:22:55 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/fftpserver.cc
r710 r717 26 26 */ 27 27 28 /*! \fn virtual void FFTServer::fftf(int l, float* inout)28 /*! \fn virtual void FFTServer::fftf(int l, r_4* inout) 29 29 \param l length of array 30 30 \param inout input array /output forward FFT (original array destroyed) 31 31 */ 32 /*! \fn virtual void FFTServer::fftb(int l, float* inout)32 /*! \fn virtual void FFTServer::fftb(int l, r_4* inout) 33 33 \param l length of array 34 34 \param inout input array /output backward FFT (original array destroyed) 35 35 */ 36 /*! \fn virtual void FFTServer::fftf(int l, double* inout)36 /*! \fn virtual void FFTServer::fftf(int l, r_8* inout) 37 37 \param l length of array 38 38 \param inout input array /output forward FFT (original array destroyed) 39 39 \param inout input/output array (original array destroyed) 40 40 */ 41 /*! \fn virtual void FFTServer::fftb(int l, double* inout)41 /*! \fn virtual void FFTServer::fftb(int l, r_8* inout) 42 42 \param l length of array 43 43 \param inout input array /output backward FFT(original array destroyed) 44 44 */ 45 /*!\fn virtual void FFTServer::fftf(int l, complex< float>* inout)45 /*!\fn virtual void FFTServer::fftf(int l, complex<r_4>* inout) 46 46 \param l length of array 47 47 \param inout input array /output forward FFT (original array destroyed) 48 48 */ 49 /*! \fn virtual void FFTServer::fftb(int l, complex< float>* inout)49 /*! \fn virtual void FFTServer::fftb(int l, complex<r_4>* inout) 50 50 \param l length of array 51 51 \param inout input array /output backward FFT (original array destroyed) 52 52 */ 53 /*! \fn virtual void FFTServer::fftf(int l, complex< double>* inout)53 /*! \fn virtual void FFTServer::fftf(int l, complex<r_8>* inout) 54 54 \param l length of array 55 55 \param inout input array /output forward FFT (original array destroyed) 56 56 */ 57 /*! \fn virtual void FFTServer::fftb(int l, complex< double>* inout)57 /*! \fn virtual void FFTServer::fftb(int l, complex<r_8>* inout) 58 58 \param l length of array 59 59 \param inout input array /output backward FFT(original array destroyed) … … 69 69 70 70 FFTPackServer::FFTPackServer() 71 : FFTServerInterface("FFT Server usingFFTPack (C-version) package")71 : FFTServerInterface("FFTPackServer using extended FFTPack (C-version) package") 72 72 73 73 { … … 92 92 } 93 93 94 94 95 void FFTPackServer::FFTForward(TVector< complex<r_8> > const & in, TVector< complex<r_8> > & out) 95 96 { 96 97 out = in; 97 98 fftf(out.NElts(), out.Data()); 99 if (getNormalize()) out *= (1./(r_8)(in.NElts())); 98 100 } 99 101 … … 104 106 } 105 107 108 109 106 110 void FFTPackServer::FFTForward(TVector< complex<r_4> > const & in, TVector< complex<r_4> > & out) 107 111 { 108 112 out = in; 109 113 fftf(out.NElts(), out.Data()); 114 if (getNormalize()) out *= (1./(r_4)(in.NElts())); 110 115 } 111 116 … … 121 126 fftf(inout.NElts(), inout.Data()); 122 127 ReShapetoCompl(inout, out); 128 if (getNormalize()) out *= (1./(r_4)(in.NElts())); 123 129 } 124 130 … … 128 134 fftb(out.NElts(), out.Data()); 129 135 } 136 130 137 131 138 void FFTPackServer::FFTForward(TVector< r_8 > const & in, TVector< complex<r_8> > & out) … … 134 141 fftf(inout.NElts(), inout.Data()); 135 142 ReShapetoCompl(inout, out); 143 if (getNormalize()) out *= (1./(r_8)(in.NElts())); 136 144 } 137 145 … … 142 150 } 143 151 152 144 153 145 154 void FFTPackServer::checkint_rfft(int l) … … 149 158 if (ws_rfft) delete[] ws_rfft; //a transform 150 159 sz_rfft = l; 151 ws_rfft = new float[2*l+15];160 ws_rfft = new r_4[2*l+15]; 152 161 rffti_(&l, ws_rfft); 153 162 } … … 159 168 if (ws_cfft) delete[] ws_cfft; 160 169 sz_cfft = l; 161 ws_cfft = new float[4*l+15];170 ws_cfft = new r_4[4*l+15]; 162 171 cffti_(&l, ws_cfft); 163 172 } … … 169 178 if (ws_dfft) delete[] ws_dfft; 170 179 sz_dfft = l; 171 ws_dfft = new double[2*l+15];180 ws_dfft = new r_8[2*l+15]; 172 181 dffti_(&l, ws_dfft); 173 182 } … … 179 188 if (ws_cdfft) delete[] ws_cdfft; 180 189 sz_cdfft = l; 181 ws_cdfft = new double[4*l+15];190 ws_cdfft = new r_8[4*l+15]; 182 191 cdffti_(&l, ws_cdfft); 183 192 } … … 186 195 return inverse transformations */ 187 196 188 void FFTPackServer::fftf(int l, float* inout)197 void FFTPackServer::fftf(int l, r_4* inout) 189 198 { 190 199 checkint_rfft(l); 191 200 rfftf_(&l, inout, ws_rfft); 192 for (int k= 2;k<=(l+1)/2;k++) inout[2*k-2]=-inout[2*k-2];193 } 194 195 void FFTPackServer::fftf(int l, double* inout)201 // for (int k= 2;k<=(l+1)/2;k++) inout[2*k-2]=-inout[2*k-2]; 202 } 203 204 void FFTPackServer::fftf(int l, r_8* inout) 196 205 { 197 206 checkint_dfft(l); 198 207 dfftf_(&l, inout, ws_dfft); 199 for (int k= 2;k<=(l+1)/2;k++) inout[2*k-2]=-inout[2*k-2];200 } 201 202 void FFTPackServer::fftf(int l, complex< float>* inout)208 // for (int k= 2;k<=(l+1)/2;k++) inout[2*k-2]=-inout[2*k-2]; 209 } 210 211 void FFTPackServer::fftf(int l, complex<r_4>* inout) 203 212 { 204 213 checkint_cfft(l); 205 cfftf_(&l, (float *)(inout), ws_cfft); 206 207 /* 208 float* foo = new float[2*l]; 209 int i; 210 for (i=0;i<l;i++){ 211 foo[2*i]=inout[i].real(); 212 foo[2*i+1]=inout[i].imag(); 214 cfftf_(&l, (r_4 *)(inout), ws_cfft); 215 } 216 217 void FFTPackServer::fftf(int l, complex<r_8>* inout) 218 { 219 checkint_cdfft(l); 220 cdfftf_(&l, (r_8*)(inout), ws_cdfft); 221 } 222 223 void FFTPackServer::fftb(int l, r_4* inout) 224 { 225 checkint_rfft(l); 226 rfftb_(&l, inout, ws_rfft); 227 } 228 229 void FFTPackServer::fftb(int l, r_8* inout) 230 { 231 checkint_dfft(l); 232 dfftb_(&l, inout, ws_dfft); 233 } 234 235 void FFTPackServer::fftb(int l, complex<r_4>* inout) 236 { 237 checkint_cfft(l); 238 cfftb_(&l, (r_4 *)(inout), ws_cfft); 239 } 240 241 void FFTPackServer::fftb(int l, complex<r_8>* inout) 242 { 243 checkint_cdfft(l); 244 cdfftb_(&l, (r_8 *)(inout), ws_cdfft); 245 } 246 247 // Methodes pour reordonner les donnees 248 249 /* --Methode-- */ 250 void FFTPackServer::ReShapetoReal( TVector< complex<r_8> > const & in, TVector< r_8 > & out) 251 { 252 int n = in.NElts(); 253 int ncs = (fabs(in(n-1).imag()) > 1.e-12) ? ncs = 2*n-1 : ncs = n*2-2; 254 out.ReSize(ncs); 255 int k; 256 out(0) = in(0).real(); 257 for(k=1;k<n-1;k++) { 258 out(2*k-1) = in(k).real(); 259 out(2*k) = in(k).imag(); 213 260 } 214 cfftf_(&l, foo, ws_cfft); 215 inout[0]=complex<float> (foo[0],foo[1]); 216 for (i=1;i<l;i++) inout[l-i]= complex<float> (foo[2*i], foo[2*i+1]); 217 delete[] foo; 218 */ 219 } 220 221 void FFTPackServer::fftf(int l, complex<double>* inout) 222 { 223 checkint_cdfft(l); 224 cdfftf_(&l, (double*)(inout), ws_cdfft); 225 /* 226 double* foo=new double[2*l]; 227 int i; 228 for (i=0;i<l;i++){ 229 foo[2*i]=inout[i].real(); 230 foo[2*i+1]=inout[i].imag(); 261 if (ncs == n*2-2) out(ncs-1) = in(n-1).real(); 262 else { out(ncs-2) = in(n-1).real(); out(ncs-1) = in(n-1).imag(); } 263 } 264 265 /* --Methode-- */ 266 void FFTPackServer::ReShapetoReal( TVector< complex<r_4> > const & in, TVector< r_4 > & out) 267 { 268 int n = in.NElts(); 269 int ncs = (fabs(in(n-1).imag()) > 1.e-12) ? ncs = 2*n-1 : ncs = n*2-2; 270 out.ReSize(ncs); 271 int k; 272 out(0) = in(0).real(); 273 for(k=1;k<n-1;k++) { 274 out(2*k-1) = in(k).real(); 275 out(2*k) = in(k).imag(); 231 276 } 232 cdfftf_(&l, foo, ws_cdfft); 233 inout[0]=complex<double> (foo[0],foo[1]); 234 for (i=1;i<l;i++) { 235 inout[l-i]= complex<double> (foo[2*i],foo[2*i+1]); 236 } 237 delete[] foo; 238 */ 239 } 240 241 void FFTPackServer::fftb(int l, float* inout) 242 { 243 checkint_rfft(l); 244 rfftf_(&l, inout, ws_rfft); 245 } 246 247 void FFTPackServer::fftb(int l, double* inout) 248 { 249 checkint_dfft(l); 250 dfftf_(&l, inout, ws_dfft); 251 } 252 253 void FFTPackServer::fftb(int l, complex<float>* inout) 254 { 255 checkint_cfft(l); 256 cfftb_(&l, (float *)(inout), ws_cfft); 257 /* 258 float* foo = new float[2*l]; 259 int i; 260 for (i=0;i<l;i++){ 261 foo[2*i]=inout[i].real(); 262 foo[2*i+1]=inout[i].imag(); 263 } 264 cfftf_(&l, foo, ws_cfft); 265 for (i=0;i<l;i++) inout[i]=complex<float> (foo[2*i],foo[2*i+1]); 266 delete[] foo; 267 */ 268 } 269 270 void FFTPackServer::fftb(int l, complex<double>* inout) 271 { 272 checkint_cdfft(l); 273 cfftb_(&l, (float *)(inout), ws_cfft); 274 /* 275 double* foo = new double[2*l]; 276 int i; 277 for (i=0;i<l;i++){ 278 foo[2*i]=inout[i].real(); 279 foo[2*i+1]=inout[i].imag(); 280 } 281 cdfftf_(&l, foo, ws_cdfft); 282 for (i=0;i<l;i++) inout[i]=complex<double> (foo[2*i],foo[2*i+1]); 283 delete[] foo; 284 */ 285 } 286 277 if (ncs == n*2-2) out(ncs-1) = in(n-1).real(); 278 else { out(ncs-2) = in(n-1).real(); out(ncs-1) = in(n-1).imag(); } 279 } 280 281 282 /* --Methode-- */ 283 void FFTPackServer::ReShapetoCompl(TVector< r_8 > const & in, TVector< complex<r_8> > & out) 284 { 285 uint_4 n = in.NElts(); 286 uint_4 ncs = n/2+1; 287 uint_4 nc = (n%2 != 0) ? n/2+1 : n/2; 288 out.ReSize(ncs); 289 out(0) = complex<r_8> (in(0),0.); 290 int k; 291 for(int k=1;k<nc;k++) 292 out(k) = complex<r_4> (in(2*k-1), in(2*k)); 293 if (n%2 == 0) out(ncs-1) = complex<r_8>(in(n-1), 0.); 294 295 } 296 297 /* --Methode-- */ 298 void FFTPackServer::ReShapetoCompl(TVector< r_4 > const & in, TVector< complex<r_4> > & out) 299 { 300 uint_4 n = in.NElts(); 301 uint_4 ncs = n/2+1; 302 uint_4 nc = (n%2 != 0) ? n/2+1 : n/2; 303 out.ReSize(ncs); 304 out(0) = complex<r_4> (in(0),0.); 305 int k; 306 for(int k=1;k<nc;k++) 307 out(k) = complex<r_4> (in(2*k-1), in(2*k)); 308 if (n%2 == 0) out(ncs-1) = complex<r_4>(in(n-1), 0.); 309 }
Note:
See TracChangeset
for help on using the changeset viewer.