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

Generated on Sat Feb 26 2011 16:06:32 for IT++ by Doxygen 1.7.3