IT++ Logo

hammcode.cpp

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

Generated on Sun Sep 14 18:54:53 2008 for IT++ by Doxygen 1.5.6