IT++ Logo Newcom Logo

hammcode.cpp

Go to the documentation of this file.
00001 
00033 #include <itpp/comm/hammcode.h>
00034 #include <itpp/base/converters.h>
00035 
00036 
00037 namespace itpp { 
00038 
00039   Hamming_Code::Hamming_Code(short m)
00040   {
00041     n = pow2i(m) - 1;
00042     k = pow2i(m) - m - 1;
00043     H.set_size(n-k, n);         
00044     G.set_size(k, n);   
00045     generate_H(); // generate_H must be run before generate_G
00046     generate_G();
00047   }
00048 
00049   void Hamming_Code::generate_H(void)
00050   {
00051     short i, j, NextPos;
00052     char NotUsed;
00053     bvec temp;
00054     svec indexes(n);
00055     indexes.zeros();
00056         
00057     for (i=1; i<=n-k; i++) { indexes(i-1) = pow2i(n-k-i); }
00058     NextPos = n-k;
00059     for (i=1; i<=n; i++) {
00060       NotUsed = 1;
00061       for (j=0; j<n; j++) 
00062         if (i == indexes(j)) { NotUsed = 0; }
00063       if (NotUsed) { indexes(NextPos) = i; NextPos = NextPos + 1; }
00064     }
00065                         
00066     for (i=0; i<n; i++) {       
00067       temp = dec2bin(n-k,indexes(i)); //<-CHECK THIS OUT!!!!
00068       for (j = 0; j < (n-k); j++) {
00069         H(j,i) = temp(j);
00070       }
00071     }
00072   }
00073 
00074   void Hamming_Code::generate_G(void)
00075   {
00076     short i, j;
00077     for (i=0; i<k; i++) {
00078       for(j=0; j<n-k; j++) 
00079         G(i,j) = H(j,i+n-k);
00080     }
00081         
00082     for (i=0; i<k; i++) {
00083       for (j=n-k; j<n; j++) 
00084         G(i,j) = 0;
00085     }
00086         
00087     for (i=0; i<k; i++)
00088       G(i,i+n-k) = 1;
00089   }
00090 
00091   void Hamming_Code::encode(const bvec &uncoded_bits, bvec &coded_bits)
00092   {
00093     int length = uncoded_bits.length();
00094     int Itterations = (int)floor( float(length) / k );
00095     bmat Gt = G.T();
00096     int i;
00097     
00098     coded_bits.set_size(Itterations * n, false);
00099     //Code all codewords
00100     for (i=0; i<Itterations; i++) 
00101       coded_bits.replace_mid(n*i, Gt * uncoded_bits.mid(i*k,k) );
00102   }
00103 
00104   bvec Hamming_Code::encode(const bvec &uncoded_bits)
00105   {
00106     bvec coded_bits;
00107     encode(uncoded_bits, coded_bits);
00108     return coded_bits;
00109   }
00110 
00111   void Hamming_Code::decode(const bvec &coded_bits, bvec &decoded_bits)
00112   {
00113     int length = coded_bits.length();
00114     int Itterations = (int)floor( float(length) / n );
00115     svec Hindexes(n);
00116     bvec temp(n-k);
00117     bvec coded(n), syndrome(n-k);
00118     short  isynd, errorpos=0;
00119     int i, j;
00120     
00121     decoded_bits.set_size(Itterations*k, false);
00122 
00123     for (i=0; i<n; i++) {
00124       for (j=0; j<n-k; j++) 
00125         temp(j) = H(j,i);
00126       Hindexes(i) = bin2dec(temp); 
00127     }
00128         
00129     //Decode all codewords
00130     for (i=0; i<Itterations; i++) {
00131       coded = coded_bits.mid(i*n,n);
00132       syndrome = H * coded;
00133       isynd = bin2dec(syndrome); 
00134       if (isynd != 0) {
00135         for (j=0; j<n; j++) 
00136           if (Hindexes(j) == isynd) { errorpos = j; };
00137         coded(errorpos) += 1;
00138       }
00139       decoded_bits.replace_mid(k*i,coded.right(k));
00140     }
00141   }
00142 
00143   bvec Hamming_Code::decode(const bvec &coded_bits)
00144   {
00145     bvec decoded_bits;
00146     decode(coded_bits, decoded_bits);
00147     return decoded_bits;
00148   }
00149 
00150 
00151   // -------------- Soft-decision decoding is not implemented ----------------
00152   void Hamming_Code::decode(const vec &received_signal, bvec &output)
00153   {
00154     it_error("Hamming_Code::decode(vec, bvec); soft-decision decoding is not implemented");
00155   }
00156 
00157   bvec Hamming_Code::decode(const vec &received_signal)
00158   {
00159     it_error("Hamming_Code::decode(vec, bvec); soft-decision decoding is not implemented");
00160     return bvec();
00161   }
00162 
00163 
00164 } // namespace itpp
SourceForge Logo

Generated on Wed Apr 18 11:19:59 2007 for IT++ by Doxygen 1.5.2