Changeset 1390 in Sophya for trunk/SophyaLib/NTools/fftpserver.cc
- Timestamp:
- Feb 9, 2001, 6:08:57 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/fftpserver.cc
r1371 r1390 28 28 FFTPackServer::FFTPackServer() 29 29 : FFTServerInterface("FFTPackServer using extended FFTPack (C-version) package") 30 30 , ckR4(true, true) , ckR8(true, true) 31 31 { 32 32 //the working array and its size for the different … … 56 56 57 57 58 void FFTPackServer::FFTForward(TVector< complex<r_8> > const & in, TVector< complex<r_8> > & out) 59 { 60 out = in; 61 fftf(out.NElts(), out.Data()); 62 if (getNormalize()) out *= (1./(r_8)(in.NElts())); 63 } 64 65 void FFTPackServer::FFTBackward(TVector< complex<r_8> > const & in, TVector< complex<r_8> > & out) 66 { 67 out = in; 68 fftb(out.NElts(), out.Data()); 69 } 70 71 72 73 void FFTPackServer::FFTForward(TVector< complex<r_4> > const & in, TVector< complex<r_4> > & out) 74 { 75 out = in; 76 fftf(out.NElts(), out.Data()); 77 if (getNormalize()) out *= (1./(r_4)(in.NElts())); 78 } 79 80 void FFTPackServer::FFTBackward(TVector< complex<r_4> > const & in, TVector< complex<r_4> > & out) 81 { 82 out = in; 83 fftb(out.NElts(), out.Data()); 84 } 85 86 void FFTPackServer::FFTForward(TVector< r_4 > const & in, TVector< complex<r_4> > & out) 87 { 88 TVector< r_4 > inout(in, false); 89 fftf(inout.NElts(), inout.Data()); 90 ReShapetoCompl(inout, out); 91 if (getNormalize()) out *= (1./(r_4)(in.NElts())); 92 } 93 94 void FFTPackServer::FFTBackward(TVector< complex<r_4> > const & in, TVector< r_4 > & out) 95 { 96 ReShapetoReal(in, out); 97 fftb(out.NElts(), out.Data()); 98 } 99 100 101 void FFTPackServer::FFTForward(TVector< r_8 > const & in, TVector< complex<r_8> > & out) 102 { 103 TVector< r_8 > inout(in, false); 104 fftf(inout.NElts(), inout.Data()); 105 ReShapetoCompl(inout, out); 106 if (getNormalize()) out *= (1./(r_8)(in.NElts())); 107 } 108 109 void FFTPackServer::FFTBackward(TVector< complex<r_8> > const & in, TVector< r_8 > & out) 110 { 111 ReShapetoReal(in, out); 112 fftb(out.NElts(), out.Data()); 58 void FFTPackServer::FFTForward(TArray< complex<r_8> > const & in, TArray< complex<r_8> > & out) 59 { 60 ckR8.CheckResize(in, out); 61 out = in; 62 fftf(out.Size(), out.Data()); 63 if (getNormalize()) out *= (1./(r_8)(in.Size())); 64 } 65 66 void FFTPackServer::FFTBackward(TArray< complex<r_8> > const & in, TArray< complex<r_8> > & out) 67 { 68 ckR8.CheckResize(in, out); 69 out = in; 70 fftb(out.Size(), out.Data()); 71 } 72 73 74 75 void FFTPackServer::FFTForward(TArray< complex<r_4> > const & in, TArray< complex<r_4> > & out) 76 { 77 ckR4.CheckResize(in, out); 78 out = in; 79 fftf(out.Size(), out.Data()); 80 if (getNormalize()) out *= (1./(r_4)(in.Size())); 81 } 82 83 void FFTPackServer::FFTBackward(TArray< complex<r_4> > const & in, TArray< complex<r_4> > & out) 84 { 85 ckR4.CheckResize(in, out); 86 out = in; 87 fftb(out.Size(), out.Data()); 88 } 89 90 void FFTPackServer::FFTForward(TArray< r_4 > const & in, TArray< complex<r_4> > & out) 91 { 92 ckR4.CheckResize(in, out); 93 TArray< r_4 > inout(in, false); 94 fftf(inout.Size(), inout.Data()); 95 ckR4.ReShapetoCompl(inout, out); 96 if (getNormalize()) out *= complex<r_4>((1./(r_4)(in.Size())), 0.); 97 } 98 99 void FFTPackServer::FFTBackward(TArray< complex<r_4> > const & in, TArray< r_4 > & out) 100 { 101 ckR4.CheckResize(in, out); 102 ckR4.ReShapetoReal(in, out); 103 fftb(out.Size(), out.Data()); 104 } 105 106 107 void FFTPackServer::FFTForward(TArray< r_8 > const & in, TArray< complex<r_8> > & out) 108 { 109 ckR8.CheckResize(in, out); 110 TArray< r_8 > inout(in, false); 111 fftf(inout.Size(), inout.Data()); 112 ckR8.ReShapetoCompl(inout, out); 113 if (getNormalize()) out *= complex<r_8>((1./(r_8)(in.Size())), 0.); 114 } 115 116 void FFTPackServer::FFTBackward(TArray< complex<r_8> > const & in, TArray< r_8 > & out) 117 { 118 ckR8.CheckResize(in, out); 119 ckR8.ReShapetoReal(in, out); 120 fftb(out.Size(), out.Data()); 113 121 } 114 122 … … 208 216 } 209 217 210 // Methodes pour reordonner les donnees 211 212 /* --Methode-- */ 213 void FFTPackServer::ReShapetoReal( TVector< complex<r_8> > const & in, TVector< r_8 > & out) 214 { 215 int n = in.NElts(); 216 int ncs = (fabs(in(n-1).imag()) > 1.e-12) ? ncs = 2*n-1 : ncs = n*2-2; 217 out.ReSize(ncs); 218 int k; 219 out(0) = in(0).real(); 220 for(k=1;k<n-1;k++) { 221 out(2*k-1) = in(k).real(); 222 out(2*k) = in(k).imag(); 223 } 224 if (ncs == n*2-2) out(ncs-1) = in(n-1).real(); 225 else { out(ncs-2) = in(n-1).real(); out(ncs-1) = in(n-1).imag(); } 226 } 227 228 /* --Methode-- */ 229 void FFTPackServer::ReShapetoReal( TVector< complex<r_4> > const & in, TVector< r_4 > & out) 230 { 231 int n = in.NElts(); 232 int ncs = (fabs(in(n-1).imag()) > 1.e-12) ? ncs = 2*n-1 : ncs = n*2-2; 233 out.ReSize(ncs); 234 int k; 235 out(0) = in(0).real(); 236 for(k=1;k<n-1;k++) { 237 out(2*k-1) = in(k).real(); 238 out(2*k) = in(k).imag(); 239 } 240 if (ncs == n*2-2) out(ncs-1) = in(n-1).real(); 241 else { out(ncs-2) = in(n-1).real(); out(ncs-1) = in(n-1).imag(); } 242 } 243 244 245 /* --Methode-- */ 246 void FFTPackServer::ReShapetoCompl(TVector< r_8 > const & in, TVector< complex<r_8> > & out) 247 { 248 uint_4 n = in.NElts(); 249 uint_4 ncs = n/2+1; 250 uint_4 nc = (n%2 != 0) ? n/2+1 : n/2; 251 out.ReSize(ncs); 252 out(0) = complex<r_8> (in(0),0.); 253 for(int k=1;k<nc;k++) 254 out(k) = complex<r_4> (in(2*k-1), in(2*k)); 255 if (n%2 == 0) out(ncs-1) = complex<r_8>(in(n-1), 0.); 256 257 } 258 259 /* --Methode-- */ 260 void FFTPackServer::ReShapetoCompl(TVector< r_4 > const & in, TVector< complex<r_4> > & out) 261 { 262 uint_4 n = in.NElts(); 263 uint_4 ncs = n/2+1; 264 uint_4 nc = (n%2 != 0) ? n/2+1 : n/2; 265 out.ReSize(ncs); 266 out(0) = complex<r_4> (in(0),0.); 267 for(int k=1;k<nc;k++) 268 out(k) = complex<r_4> (in(2*k-1), in(2*k)); 269 if (n%2 == 0) out(ncs-1) = complex<r_4>(in(n-1), 0.); 270 } 218
Note:
See TracChangeset
for help on using the changeset viewer.