IT++ Logo Newcom Logo

freq_filt.cpp

Go to the documentation of this file.
00001 
00033 #include <itpp/base/freq_filt.h>
00034 #include <itpp/base/transforms.h>
00035 #include <itpp/base/elmatfunc.h>
00036 
00037 
00038 namespace itpp {
00039 
00040   // Overlap-add routine
00041   template<class Num_T>
00042   void Freq_Filt<Num_T>::overlap_add(const cvec&x, cvec &y)
00043   {
00044     int nb = impulse.length();
00045     int nx = x.length();
00046 
00047     y.set_size(nx,false);
00048     y.zeros();
00049     cvec X,Y;
00050     int istart = 0;
00051     int L = blksize;
00052     while(istart < nx)
00053       {
00054         int iend = std::min(istart+L-1,nx-1);
00055 
00056         X = fft(x(istart,iend),fftsize);
00057         Y = ifft(elem_mult(X,B));
00058         Y.set_subvector(0,nb-2,Y(0,nb-2) + zfinal);
00059         int yend = std::min(nx-1,istart+fftsize-1);
00060         y.set_subvector(istart,yend,Y(0,yend-istart));
00061         zfinal = Y(fftsize-(nb-1),fftsize-1);
00062         istart += L;
00063       }
00064   }
00065 
00066   template<>
00067   vec Freq_Filt<double>::overlap_add(const vec &x)
00068   {
00069     cvec y; // Size of y is set later
00070     overlap_add(to_cvec(x),y);
00071     return real(y);
00072   }
00073 
00074   template<>
00075   svec Freq_Filt<short>::overlap_add(const svec &x)
00076   {
00077     cvec y; // Size of y is set later
00078     overlap_add(to_cvec(x),y);
00079     return to_svec(real(y));
00080   }
00081 
00082   template<>
00083   ivec Freq_Filt<int>::overlap_add(const ivec &x)
00084   {
00085     cvec y; // Size of y is set later
00086     overlap_add(to_cvec(x),y);
00087     return to_ivec(real(y));
00088   }
00089 
00090   template<>
00091   cvec Freq_Filt<std::complex<double> >::overlap_add(const cvec &x)
00092   {
00093     cvec y; // Size of y is set later
00094     overlap_add(x,y);
00095     return y;
00096   }
00097 
00098 } // namespace itpp
SourceForge Logo

Generated on Sat Aug 25 23:40:02 2007 for IT++ by Doxygen 1.5.2