IT++ Logo
hammcode.cpp
Go to the documentation of this file.
00001 
00029 #include <itpp/comm/hammcode.h>
00030 #include <itpp/base/math/log_exp.h>
00031 #include <itpp/base/converters.h>
00032 
00033 
00034 namespace itpp
00035 {
00036 
00037 Hamming_Code::Hamming_Code(int 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   int i, j, NextPos;
00050   char NotUsed;
00051   bvec temp;
00052   ivec 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   int 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   ivec Hindexes(n);
00114   bvec temp(n - k);
00115   bvec coded(n), syndrome(n - k);
00116   int 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 &, bvec &)
00151 {
00152   it_error("Hamming_Code::decode(vec, bvec); soft-decision decoding is not implemented");
00153 }
00154 
00155 bvec Hamming_Code::decode(const vec &)
00156 {
00157   it_error("Hamming_Code::decode(vec, bvec); soft-decision decoding is not implemented");
00158   return bvec();
00159 }
00160 
00161 
00162 } // namespace itpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
SourceForge Logo

Generated on Wed Jul 27 2011 16:27:04 for IT++ by Doxygen 1.7.4