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
Generated on Wed Apr 18 11:23:29 2007 for IT++ by Doxygen 1.5.2