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
Generated on Fri May 1 11:09:17 2009 for IT++ by Doxygen 1.5.8