Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

complex_iu.h

Go to the documentation of this file.
00001 // 
00002 // Copyright(c) 1993-1998 Tony Kirke
00003 // author="Tony Kirke" *
00004 /*
00005  * SPUC - Signal processing using C++ - A DSP library
00006  * 
00007  * This program is free software; you can redistribute it and/or modify
00008  * it under the terms of the GNU General Public License as published by
00009  * the Free Software Foundation; either version 2, or (at your option)
00010  * any later version.
00011  * 
00012  * This program is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  * GNU General Public License for more details.
00016  * 
00017  * You should have received a copy of the GNU General Public License
00018  * along with this program; if not, write to the Free Software
00019  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00020 */
00021 #ifndef CINTU
00022 #define CINTU
00023 #include <spuc.h>
00024 #include <stdlib.h>
00025 #include <math.h>
00026 namespace SPUC {
00027 #define cnatural complex<long>
00033 class complex_iu
00034 {
00035         typedef long natural;
00036 //      typedef complex<long> cnatural;
00037 
00038         public:
00039           cnatural q;
00040           natural mask;
00041           natural bits;
00042           natural bitpos;
00043 
00044 //  protected:
00045           complex_iu() { 
00046                   q = 0;
00047                   bits = 32;
00048                   mask = 0;
00049                   bitpos=0;
00050           }
00051           complex_iu(natural r, natural i=0) {
00052                   q = complex<long>(r,i); 
00053                   bits = 32;
00054                   mask = 0;
00055                   bitpos=0;
00056           }
00057 
00058   public:
00059   inline complex_iu operator =(const complex_iu& y) {   
00060     q =  y.q & ~mask;
00061         return *this; 
00062   } 
00063   inline complex_iu operator =(const natural& y) {   
00064     q = ~mask & y;
00065         return *this; 
00066   } 
00067   friend complex_iu operator %(complex_iu r, natural l);
00068   friend complex_iu operator +(complex_iu r, complex_iu l);
00069   friend complex_iu operator +(complex_iu r, natural l);
00070   friend complex_iu operator +(cnatural r, complex_iu l);
00071   friend complex_iu operator -(complex_iu r, complex_iu l);
00072   friend complex_iu operator -(complex_iu r, cnatural l);
00073   friend complex_iu operator -(cnatural r, complex_iu l);
00074   friend complex_iu operator &(complex_iu r, natural l);
00075   friend complex_iu operator &(natural r, complex_iu l);
00076   friend complex_iu operator ^(complex_iu r, natural l);
00077   friend complex_iu operator ^(natural r, complex_iu l);
00078   friend complex_iu operator |(complex_iu r, natural l);
00079   friend complex_iu operator |(natural r, complex_iu l);
00080   friend complex_iu operator *(complex_iu r, complex_iu l);
00081   friend complex_iu operator *(complex_iu r, cnatural l);
00082   friend complex_iu operator *(complex_iu r, natural l);
00083   friend complex_iu operator *(natural r, complex_iu l);
00084   friend complex_iu operator *(cnatural r, complex_iu l);
00085   friend complex_iu operator /(complex_iu r, complex_iu l);
00086   friend complex_iu operator /(cnatural r, complex_iu l);
00087   friend complex_iu operator /(complex_iu r, cnatural l);
00088   friend complex_iu operator /(complex_iu r, natural l);
00089   friend complex_iu operator <<(complex_iu r, const natural shift) ;
00090   friend complex_iu operator >>(complex_iu r, const natural shift) ;
00091 
00092   complex_iu operator +=(complex_iu r) {
00093   q += r.q;
00094   q = q & ~mask;
00095   return *this;  
00096   };
00097 
00098   complex_iu operator -=(complex_iu r){
00099   q -= r.q;
00100   q = q & ~mask;
00101 //  if (  ((mask&q)!=mask) || ((mask&q)!=0) ) q &= ~mask;
00102   return *this;  
00103   };
00104   complex_iu operator *=(complex_iu r) {
00105   q *= r.q;
00106   q = q & ~mask;
00107   return *this;  
00108   };
00109   complex_iu operator /=(complex_iu r){
00110   if (r.q.real() != 0 && r.q.imag() != 0) q = q/r.q;
00111   else    q = 0;
00112   return *this;  
00113   };
00114 
00115   complex_iu operator <<=(const natural shift)  {
00116           q = q << shift;
00117           q = q & ~mask;
00118           return *this;
00119   };
00120   complex_iu  operator >>=(const natural shift) {
00121           q = q >> shift;
00122           return *this;
00123   }
00124 
00125   complex_iu operator ^=(long r) {
00126   q = q ^ r;
00127   q = q & ~mask;
00128   return *this;  
00129   };
00130   complex_iu operator &=(long r) {
00131   q = q & r;
00132   q = q & ~mask;
00133   return *this;  
00134   };
00135   complex_iu operator |=(long r) {
00136   q = q | r;
00137   q = q & ~mask;
00138   return *this;  
00139   };
00140 
00141   inline bool operator !=(complex_iu r) { return (bool(q != r.q));  };
00142   inline bool operator ==(complex_iu r) { return (bool(q == r.q));  };
00143   inline long magsq(complex_iu y) { 
00144           long x;
00145           x = y.q.real()*y.q.real() + y.q.imag()*y.q.imag();
00146 //        x.mask = -1 << (y.bits * 2);
00147           return(x); 
00148   };
00149 
00150   operator const cnatural () const { return(q); }
00151 //  operator const complex<double> () const { 
00152 //        return(complex<double>((double)q.real(),(double)q.imag())); }
00153 
00154   complex_iu round(complex_iu in, natural rbits) {
00155           double scale = 1.0/(double)MASK_BIT(rbits);
00156           return(complex_iu(
00157                   (long)floor((double)(scale*in.q.real())+0.5),
00158                   (long)floor((double)(scale*in.q.imag())+0.5)));
00159 //        return(complex_iu(round(complex<long>(in), rbits)));
00160   };
00161 
00162   // Only positive overflow
00163   complex_iu saturate(complex_iu in, natural rbits) {
00164             long r,i;
00165                 long low_mask = ((1<<(bits-1)) - 1);
00166                 if (labs(in.q.real()) > low_mask) 
00167                         r = (in.q.real()>0) ? low_mask : ~low_mask;
00168                 else r = in.q.real();
00169                 if (labs(in.q.imag()) > low_mask) 
00170                         i = (in.q.imag()>0) ? low_mask : ~low_mask;
00171                 else i = in.q.imag();
00172                 return(complex_iu(r,i));
00173   }
00174 
00175 
00176 };
00177  complex_iu operator %(complex_iu r, natural l) {
00178          complex_iu x;
00179          x.q = r.q % l;
00180          return(x);
00181  }
00182    complex_iu operator +(complex_iu r, complex_iu l) {
00183         complex_iu x;
00184         x.q = r.q + l.q;
00185         return(x);
00186   }
00187    complex_iu operator +(complex_iu r, natural l) {
00188         complex_iu x;
00189         x.q = r.q + l;
00190         return(x);
00191   }
00192    complex_iu operator +(cnatural r, complex_iu l) {
00193         complex_iu x;
00194         x.q = r + l.q;
00195         return(x);
00196   }
00197    complex_iu operator -(complex_iu r, complex_iu l) {
00198         complex_iu x;
00199         x.q = r.q - l.q;
00200         return(x);
00201   }
00202    complex_iu operator -(complex_iu r, cnatural l) {
00203         complex_iu x;
00204         x.q = r.q - l;
00205         return(x);
00206   }
00207    complex_iu operator -(cnatural r, complex_iu l) {
00208         complex_iu x;
00209         x.q = r - l.q;
00210         return(x);
00211   }
00212    complex_iu operator &(complex_iu r, natural l) {
00213         complex_iu x;
00214         x.q = r.q & l;
00215         return(x);
00216   }
00217    complex_iu operator &(natural r, complex_iu l) {
00218         complex_iu x;
00219         x.q = l.q & r;
00220         return(x);
00221   }
00222    complex_iu operator ^(complex_iu r, natural l) {
00223         complex_iu x;
00224         x.q = r.q ^ l;
00225         return(x);
00226   }
00227    complex_iu operator ^(natural r, complex_iu l) {
00228         complex_iu x;
00229         x.q = l.q ^ r;
00230         return(x);
00231   }
00232    complex_iu operator |(complex_iu r, natural l) {
00233         complex_iu x;
00234         x.q = r.q | l;
00235         return(x);
00236   }
00237    complex_iu operator |(natural r, complex_iu l) {
00238         complex_iu x;
00239         x.q = l.q | r;
00240         return(x);
00241   }
00242    complex_iu operator *(complex_iu r, complex_iu l) {
00243         complex_iu x;
00244         x.q = r.q*l.q;
00245         return(x);  
00246   };
00247    complex_iu operator *(complex_iu r, cnatural l) {
00248         complex_iu x;
00249         x.q = r.q*l;
00250         return(x);  
00251   };
00252    complex_iu operator *(complex_iu r, natural l) {
00253         complex_iu x;
00254         x.q = r.q*l;
00255         return(x);  
00256   };
00257    complex_iu operator *(natural r, complex_iu l) {
00258         complex_iu x;
00259         x.q = r*l.q;
00260         return(x);  
00261   };
00262    complex_iu operator *(cnatural r, complex_iu l) {
00263         complex_iu x;
00264         x.q = r*l.q;
00265         return(x);  
00266   };
00267    complex_iu operator /(complex_iu r, complex_iu l) {
00268         complex_iu x;
00269         x.q = r.q/l.q;
00270         return(x);  
00271   };
00272    complex_iu operator /(cnatural r, complex_iu l) {
00273         complex_iu x;
00274         x.q = r/l.q;
00275         return(x);  
00276   };
00277    complex_iu operator /(complex_iu r, cnatural l) {
00278         complex_iu x;
00279         x.q = r.q/l;
00280         return(x);  
00281   };
00282    complex_iu operator /(complex_iu r, natural l) {
00283         complex_iu x;
00284         x.q = r.q/l;
00285         return(x);  
00286   };
00287 
00288    complex_iu operator <<(complex_iu r, const natural shift)  {
00289           complex_iu x;
00290           x.q = r.q << shift;
00291           x.mask = r.mask << shift;
00292           x.bits = r.bits + shift;
00293           return(x);
00294   };
00295    complex_iu operator >>(complex_iu r, const natural shift)  {
00296           complex_iu x;
00297           x.q = r.q >> shift;
00298           x.mask = r.mask >> shift;
00299           x.bits = r.bits - shift;
00300           return(x);
00301   };
00302 } // namespace SPUC 
00303 #endif

Generated on Fri Sep 16 11:02:26 2005 for spuc by  doxygen 1.4.4